使 MessageDigest 和 Cipher 等同于 java.security.Signature
make MessageDigest and Cipher equivalent to 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;
}
}
然后当我使用这些函数时,我总是得到错误的结果,这意味着我的函数不能正常工作:
byte[] message = "hello world".getBytes();
byte[] signature;
signature = mySign(message );
boolean bool = myCheckSignature(message , signature, thePublicKey);
System.out.println(bool);
虽然你的要求
to implement a method to create a signature using an alternative to 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
.
包中的实用工具 class
顺便说一句,你做到了
byte[] message = "hello world".getBytes();
getBytes
未明确选择字符编码可能会导致在不同平台或不同 Java 版本上出现不同的结果。在这种情况下不应该发生的事情!
我想使用 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;
}
}
然后当我使用这些函数时,我总是得到错误的结果,这意味着我的函数不能正常工作:
byte[] message = "hello world".getBytes();
byte[] signature;
signature = mySign(message );
boolean bool = myCheckSignature(message , signature, thePublicKey);
System.out.println(bool);
虽然你的要求
to implement a method to create a signature using an alternative to 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 版本上出现不同的结果。在这种情况下不应该发生的事情!