Tôi đang sử dụng SHA256 và RSA để ký thư trên máy tính Ubuntu của tôi bằng OpenSSL. Mục tiêu của tôi là xác minh thư này trên Android bằng cách sử dụng Java của Android.Tin nhắn đã ký bằng OpenSSL; không thể xác minh bằng Android Java
lệnh sau đã được sử dụng trên ubuntu:
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
echo 'foobar' > data.txt
openssl dgst -sha256 <data.txt> hash
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der
openssl enc -base64 -in signature -out base64_signature
bây giờ tôi đã tạo ra các phím ký tin nhắn, tạo ra một tập tin .der cho khóa công khai rằng sẽ có thể được truy cập trong Java và mã hóa thông điệp với Base64. Sau đó tôi đặt khóa công khai .der trên thiết bị của tôi và tải thành công khóa vào lớp PublicKey.
Phương pháp này được sử dụng để xác minh thông điệp:
public static boolean verify(PublicKey publicKey,String data,String verification){
java.security.Signature sig;
try {
sig = java.security.Signature.getInstance("SHA256WithRSA");
sig.initVerify(publicKey);
try {
sig.update(verification.getBytes());
} catch (Exception e) {
...
}
if (!sig.verify(Base64.decode(data, Base64.DEFAULT))) {
return false;
}
return true;
}
catch ....
return false;
}
Các tham số khi gọi phương pháp:
verify(PublicKey, Base64 encoded data in a String that is to be verified, "foobar");
Rõ ràng việc xác minh thất bại, nhưng tôi không thể hiểu tại sao. Tôi đoán nó phải làm một cái gì đó với mã hóa (?).
Cập nhật! Vì vậy, tôi quản lý để viết kết quả của Base64.decode(data, Base64.DEFAULT))
vào một tệp và so sánh nó với tệp chữ ký gốc bằng cách sử dụng một trình chỉnh sửa. Hoàn toàn khác!
Mã hóa văn bản có thể là một vấn đề. Bạn có thể kiểm tra điều đó bằng cách tạo một SAH256 MessageDigest của 'verify' đã sử dụng của bạn và so sánh đầu ra với hàm băm OpenSSL. Bạn cũng có thể kiểm tra "nội dung" chữ ký của bạn bằng cách giải mã nó bằng Java với RSA/ECB/NoPadding. – Robert