Tôi muốn tạo chữ ký RSA-SHA256 trong Java, nhưng tôi không thể tạo chữ ký giống như với OpenSSL trên bảng điều khiển.Tại sao chữ ký RSA-SHA256 tôi tạo ra với OpenSSL và Java khác nhau?
Đây là những gì tôi đã làm với OpenSSL (sau this tutorial):
Tạo cặp khóa:
openssl genrsa -out private.pem 1024
Extract công chính:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Tạo băm của dữ liệu:
echo 'data to sign' > data.txt
openssl dgst -sha256 <data.txt> hash
Tệp băm được tạo bắt đầu bằng (stdin)=
những gì tôi đã xóa bằng tay (trước tiên quên đề cập đến nó, nhờ có dữ liệu).
Đăng băm:
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
Để tái tạo các kết quả trong Java đầu tiên tôi chuyển đổi các khóa bí mật từ PEM để Der:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der
Bây giờ tôi đã viết lớp Java này để tạo chữ ký giống nhau:
public class RSATest {
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException, InvalidKeySpecException,
InvalidKeyException, SignatureException {
byte[] encodedPrivateKey = readFile("private.der");
byte[] content = readFile("data.txt");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory
.generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(content);
byte[] signatureBytes = signature.sign();
FileOutputStream fos = new FileOutputStream("signature-java");
fos.write(signatureBytes);
fos.close();
}
private static byte[] readFile(String filename) throws IOException {
File file = new File(filename);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
file));
byte[] bytes = new byte[(int) file.length()];
bis.read(bytes);
bis.close();
return bytes;
}
}
Thật không may là kết quả không giống nhau, vì vậy tôi nghĩ tôi phải làm điều gì đó wron g, nhưng tôi không thể hiểu được điều gì. Ai đó có thể giúp tôi tìm lỗi không?
Đệm ngẫu nhiên và mã hóa thư sẽ đảm bảo chữ ký không khớp. Có lẽ bạn nên sử dụng một chương trình chữ ký xác định? – jww