Сделать MessageDigest и Cipher эквивалентными java.security.Signature
Я хочу реализовать свою собственную функцию подписи, используя RSA в качестве алгоритма шифрования и SHA-1 в качестве хеш-функции, для этого я реализовал эти две функции:
public byte[] mySign(byte[] aMessage){
try{
// get an instance of a cipher with RSA with ENCRYPT_MODE
// Init the signature with the private key
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, this.thePrivateKey);
// get an instance of the java.security.MessageDigest with sha1
MessageDigest meassDs = MessageDigest.getInstance("SHA-1");
// process the digest
meassDs.update(aMessage);
byte[] digest = meassDs.digest();
byte [] signature = cipher.doFinal(digest);
// return the encrypted digest
return signature;
}catch(Exception e){
System.out.println(e.getMessage()+"Signature error");
e.printStackTrace();
return null;
}
}
public boolean myCheckSignature(byte[] aMessage, byte[] aSignature, PublicKey aPK){
try{
// get an instance of a cipher with RSA with DECRYPT_MODE
// Init the signature with the public key
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, aPK);
// decrypt the signature
byte [] digest1 = cipher.doFinal(aSignature);
// get an instance of the java.security.MessageDigest with sha1
MessageDigest meassDs = MessageDigest.getInstance("SHA-1");
// process the digest
meassDs.update(aMessage);
byte[] digest2 = meassDs.digest();
// check if digest1 == digest2
if (digest1 == digest2)
return true;
else
return false;
}catch(Exception e){
System.out.println("Verify signature error");
e.printStackTrace();
return false;
}
}
Затем, когда я использую эту функцию, я всегда получаю false в качестве результата, что означает, что мои функции работают неправильно:
byte[] message = "hello world".getBytes();
byte[] signature;
signature = mySign(message );
boolean bool = myCheckSignature(message , signature, thePublicKey);
System.out.println(bool);
1 ответ
Пока ваше требование
реализовать метод для создания подписи, используя альтернативу java.security.Signature
в целом сомнительно (как указано в комментариях к вашему вопросу), ваше решение может быть улучшено.
В частности, есть ошибка в вашем myCheckSignature
код:
// check if digest1 == digest2
if (digest1 == digest2)
return true;
else
return false;
(digest1 == digest2)
проверяет, есть ли у вас одинаковый объект массива, а не есть ли у вас два массива с одинаковым содержимым.
То, что вы действительно хотите сделать, это
if (Arrays.equals(digest1, digest2))
return true;
else
return false;
или более компактно
return Arrays.equals(digest1, digest2);
Arrays
это служебный класс в пакете java.util
,
Кстати, вы делаете
byte[] message = "hello world".getBytes();
getBytes
без явного выбора кодировки символов может привести к разным результатам на разных платформах или разных версиях Java. То, что не должно происходить в этом контексте!