นี่คือวิธีที่ฉันแก้ปัญหาของฉัน:
คีย์ของฉันในสตริง:
สาธารณะ A : co2D0pNxZJIeQ4RZlCRJYBDzNXSLluETdztid0M+HGzN1uGJ4JWZsenjWgRrmkLh3yqHQqzOBMl/wHVH97A6+g==
ส่วนตัว A : TXxii5Ka8LMvuc9arHu63qTmNKxGlgti+wpR3YhBGew=
B สาธารณะ : nUblC+OKdl94iBiWk0941wmYBiMt7C90CjOJPI2BPr8K7xGuC1XsR5DtwFCoM3Iew2BjBG+5SqrYwAPTJF7gdA==
ส่วนตัว B : sm6V7+hChvkFSeLNoR+5tItiX8gH5tT47xBkFaV6SDU=
ฟังก์ชั่นเพื่อรับรหัสส่วนตัว:
สาธารณะคง PrivateKey getPrivateKey (ไบต์ [] encodedPrivateKey) {
BigInteger s = BigInteger ใหม่ (1, encodedPrivateKey);
ECNamedCurveParameterSpec ecCurve = ECNamedCurveTable.getParameterSpec("secp256r1");
ECParameterSpec ecParameterSpec = ใหม่ ECNamedCurveSpec("secp256r1", ecCurve.getCurve(), ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed());
ECPrivateKeySpec privateKeySpec = ใหม่ ECPrivateKeySpec(s, ecParameterSpec);
พยายาม {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
ส่งคืน keyFactory.generatePrivate (privateKeySpec);
} catch (NoSuchAlgorithmException | InvalidKeySpecException จ) {
e.printStackTrace();
ส่งคืน null;
}
}
PublicKey แบบคงที่สาธารณะ rawToEncodedECPublicKey (String curveName, ไบต์ [] rawBytes) โยน NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException {
KeyFactory kf = KeyFactory.getInstance("EC");
ไบต์ [] x = Arrays.copyOfRange (rawBytes, 0, rawBytes.length/2);
ไบต์ [] y = Arrays.copyOfRange (rawBytes, rawBytes.length/2, rawBytes.length);
ECPoint w = ECPoint ใหม่ (BigInteger ใหม่ (1,x), BigInteger ใหม่ (1,y));
ส่งคืน kf.generatePublic (ใหม่ ECPublicKeySpec (w, ecParameterSpecForCurve (curveName)));
}
สาธารณะคงที่ java.security.spec.ECParameterSpec ecParameterSpecForCurve (String curveName) โยน NoSuchAlgorithmException, InvalidParameterSpecException {
AlgorithmParameters params = AlgorithmParameters.getInstance("EC");
params.init (ECGenParameterSpec ใหม่ (curveName));
กลับ params.getParameterSpec (ECParameterSpec.class);
}
เราจำเป็นต้องสร้างคีย์ 2 คู่ผ่านคีย์ public/private ในสตริง และตรวจสอบว่าทั้งคู่เท่ากันหรือไม่ :
ไบต์ [] cle_publique_a_decode = Base64.getDecoder().decode(cle_publique_a);
ไบต์ [] cle_privee_a_decode = Base64.getDecoder().ถอดรหัส(cle_privee_a);
ไบต์ [] cle_publique_b_decode = Base64.getDecoder().decode(cle_publique_b);
ไบต์ [] cle_privee_b_decode = Base64.getDecoder().ถอดรหัส(cle_privee_b);
พยายาม {
PublicKey PublicKeyA = rawToEncodedECPublicKey("secp256r1",cle_publique_a_decode);
PublicKey PublicKeyB = rawToEncodedECPublicKey("secp256r1",cle_publique_b_decode);
PrivateKey PrivateKeyA = getPrivateKey(cle_privee_a_decode);
PrivateKey PrivateKeyB = getPrivateKey(cle_privee_b_decode);
// ความลับ #1
// PrivateKeyA + PublicKeyB = createSecret
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH");
keyAgreement.init (PrivateKeyA);
keyAgreement.doPhase (PublicKeyB, จริง);
ไบต์ [] createSecret = keyAgreement.generateSecret ();
สตริง base64_generateSecret = Base64.getEncoder().encodeToString(generateSecret);
// ความลับ #2
// PrivateKeyB + PublicKeyA = createSecret2
KeyAgreement keyAgreement2 = KeyAgreement.getInstance("ECDH");
keyAgreement.init (คีย์ส่วนตัว B);
keyAgreement.doPhase (PublicKeyA จริง);
ไบต์ [] createSecret2 = keyAgreement.generateSecret ();
สตริง base64_generateSecret2 = Base64.getEncoder().encodeToString(generateSecret);
// เปรียบเทียบ 2 ความลับ
// (คีย์สาธารณะ A + คีย์ส่วนตัว B) == (คีย์สาธารณะ B + คีย์ส่วนตัว A)
ถ้า (base64_generateSecret.equals (base64_generateSecret2)){
// ดี : ความลับเหมือนกัน
// ดำเนินต่อ..
}
อื่น{
// ไม่ดี : ความลับต่างกัน
}
}
จับ{
โยนใหม่ IllegalArgumentException(e.getMessage(), e);
}
คีย์เท่ากัน ฉันเริ่มเข้ารหัสได้