Я использую SHA256 и RSA для подписи сообщения на моем компьютере с Ubuntu с помощью OpenSSL. Моя цель - проверить это сообщение на Android с помощью Android Java.
В 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
Теперь я создал ключи, подписал сообщение, создал файл .der для открытого ключа, к которому должен быть доступ в Java, и закодировал сообщение с помощью Base64. Затем я помещаю открытый ключ .der на свое устройство и успешно загружаю ключ в класс PublicKey.
Этот метод используется для проверки сообщения:
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;
}
Параметры при вызове метода:
verify(PublicKey, Base64 encoded data in a String that is to be verified, "foobar");
Очевидно, проверка не удалась, но я не могу понять, почему. Я предполагаю, что это должно что-то делать с кодировкой (?).
Обновлять! Так что мне удалось записать результаты Base64.decode(data, Base64.DEFAULT))
в файл и сравнить его с исходным файлом подписи с помощью шестнадцатеричного редактора. Полностью отличается!
verification
и сравнив вывод с хешем OpenSSL. Вы также можете проверить содержимое своей подписи, расшифровав ее на Java с помощью RSA/ECB/NoPadding. - person Robert   schedule 23.06.2015