Vì vậy, đây là cách tôi giải quyết vấn đề của mình:
Các khóa của tôi trong chuỗi:
công cộng A : co2D0pNxZJIeQ4RZlCRJYBDzNXSLluETdztid0M+HGzN1uGJ4JWZsenjWgRrmkLh3yqHQqzOBMl/wHVH97A6+g==
riêng tư A : TXxii5Ka8LMvuc9arHu63qTmNKxGlgti+wpR3YhBGew=
công khai B : nUblC+OKdl94iBiWk0941wmYBiMt7C90CjOJPI2BPr8K7xGuC1XsR5DtwFCoM3Iew2BjBG+5SqrYwAPTJF7gdA==
riêng tư B : sm6V7+hChvkFSeLNoR+5tItiX8gH5tT47xBkFaV6SDU=
Các chức năng lấy private key:
public static PrivateKey getPrivateKey(byte[] encodedPrivateKey) {
BigInteger s = new BigInteger(1,encodedPrivateKey);
ECNamedCurveParameterSpec ecCurve = ECNamedCurveTable.getParameterSpec("secp256r1");
ECParameterSpec ecParameterSpec = new ECNamedCurveSpec("secp256r1", ecCurve.getCurve(), ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed());
ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(s, ecParameterSpec);
cố gắng {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
trả về keyFactory.generatePrivate(privateKeySpec);
} bắt (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
trả về giá trị rỗng;
}
}
public static PublicKey rawToEncodedECPublicKey(String curveName, byte[] rawBytes) ném NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException {
KeyFactory kf = KeyFactory.getInstance("EC");
byte[] x = Arrays.copyOfRange(rawBytes, 0, rawBytes.length/2);
byte[] y = Arrays.copyOfRange(rawBytes, rawBytes.length/2, rawBytes.length);
ECPoint w = ECPoint mới(BigInteger mới(1,x), BigInteger mới(1,y));
return kf.generatePublic(ECPublicKeySpec mới(w, ecParameterSpecForCurve(curveName)));
}
tĩnh công khai java.security.spec.ECParameterSpec ecParameterSpecForCurve(String curveName) ném NoSuchAlgorithmException, InvalidParameterSpecException {
AlgorithmParameters params = AlgorithmParameters.getInstance("EC");
params.init(ECGenParameterSpec mới(curveName));
trả về params.getParameterSpec(ECParameterSpec.class);
}
Chúng ta cần tạo 2 cặp khóa thông qua khóa công khai/riêng tư trong chuỗi và kiểm tra xem cả hai có bằng nhau không:
byte [] cle_publique_a_decode = Base64.getDecoder().decode(cle_publique_a);
byte [] cle_privee_a_decode = Base64.getDecoder().decode(cle_privee_a);
byte [] cle_publique_b_decode = Base64.getDecoder().decode(cle_publique_b);
byte [] cle_privee_b_decode = Base64.getDecoder().decode(cle_privee_b);
cố gắng {
PublicKey PublicKeyA = rawToEncodedECPublicKey("secp256r1",cle_publique_a_decode);
Khóa công khai PublicKeyB = rawToEncodedECPublicKey("secp256r1",cle_publique_b_decode);
Khóa riêng PrivateKeyA = getPrivateKey(cle_privee_a_decode);
Khóa riêng PrivateKeyB = getPrivateKey(cle_privee_b_decode);
// Bí mật #1
// PrivateKeyA + PublicKeyB = generateSecret
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH");
keyAgreement.init(PrivateKeyA);
keyAgreement.doPhase(PublicKeyB, true);
byte[] generateSecret = keyAgreement.generateSecret();
Chuỗi base64_generateSecret = Base64.getEncoder().encodeToString(generateSecret);
// Bí mật #2
// PrivateKeyB + PublicKeyA = generateSecret2
KeyAgreement keyAgreement2 = KeyAgreement.getInstance("ECDH");
keyAgreement.init(PrivateKeyB);
keyAgreement.doPhase(PublicKeyA, true);
byte[] generateSecret2 = keyAgreement.generateSecret();
Chuỗi base64_generateSecret2 = Base64.getEncoder().encodeToString(generateSecret);
//so sánh 2 bí mật
// (khóa chung A + khóa riêng B) == (khóa chung B + khóa riêng A)
if(base64_generateSecret.equals(base64_generateSecret2)){
// Tốt: Bí mật giống nhau
// tiếp tục..
}
khác{
// Không tốt : Bí mật là khác nhau
}
}
nắm lấy{
ném IllegalArgumentException mới(e.getMessage(), e);
}
Các khóa bằng nhau, tôi có thể bắt đầu mã hóa.