我想在两个人之间发送原始消息。让爱丽丝和鲍勃说吧 我想知道这些步骤是否适用于签名的验证
Alice将最终签名的邮件与她(PublicKey)和(original_message)一起发送给Bob。 鲍勃方面:
我知道我做错了。有没有人知道双方的良好秩序是什么?
这里我使用了java.security来做这个,但是当我在最后一步检查哈希时,它给了我假!
在Alice部分:
public byte[] Sign(byte[] aMessage) {
try {
// get an instance of a cipher with RSA with ENCRYPT_MODE
// Init the signature with the private key
// Compute signature
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, thePrivateKey);
Signature instance = Signature.getInstance("MD5withRSA");
instance.initSign(thePrivateKey);
// get an instance of the java.security.MessageDigest with MD5
// process the digest
MessageDigest md5_digest = MessageDigest.getInstance("MD5");
md5_digest.update(aMessage);
byte[] digest = md5_digest.digest();
// return the encrypted digest
byte[] cipherText = cipher.doFinal(digest);
instance.update(cipherText);
byte[] signedMSG = instance.sign();
return signedMSG;
} catch (Exception e) {
System.out.println("Signature error");
e.printStackTrace();
return null;
}
}
在Bob部分:
public boolean CheckSignature(byte[] aMessage, byte[] aSignature,
PublicKey aPK) {
try {
// get an instance of a cipher with RSA with ENCRYPT_MODE
// Init the signature with the private key
// decrypt the signature
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, aPK);
byte[] decrypted_digest = cipher.doFinal(aSignature);
// get an instance of the java.security.MessageDigest with MD5
MessageDigest md5_digest = MessageDigest.getInstance("MD5");
// process the digest
md5_digest.update(aMessage);
byte[] digest = md5_digest.digest();
// check if digest1 == digest2
if (decrypted_digest == digest) {
return true;
}else {
return false;
}
} catch (Exception e) {
System.out.println("Verify signature error");
e.printStackTrace();
return false;
}
}
答案 0 :(得分:0)
最后我找到了答案。错误是,在Alice部分做了一个sign()。因为当你进行散列和加密时,它已经成为一个签名,当你签署()时,Bob的另一部分变得无法恢复散列签名。
我的代码也是“java安全公钥加密中的单向散列”的一个很好的例子
这是Alice部分的修改,一切正常。
public byte[] Sign(byte[] aMessage) {
try {
// get an instance of a cipher with RSA with ENCRYPT_MODE
// Init the signature with the private key
// Compute signature
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, thePrivateKey);
// get an instance of the java.security.MessageDigest with MD5
// process the digest
MessageDigest md5_digest = MessageDigest.getInstance("MD5");
byte[] digest = md5_digest.digest(aMessage);
// return the encrypted digest
byte[] cipherText = cipher.doFinal(digest);
return cipherText;
} catch (Exception e) {
System.out.println("Signature error");
e.printStackTrace();
return null;
}
}
答案 1 :(得分:-2)
数字签名是消息哈希的加密(带私钥)密码。
签名s = c(h(m))
现在s附加到消息m。要从Alice传送到Bob的签名消息是m + s
在Bob的一方收到m + s后,Bob将使用Alice的公钥解密签名,该公钥将出现在证书中。所以在这里他做d(s)= d(c(h(m))= h(m)
Bob也接收到该消息,因此他将计算消息m的散列,即h(m)
现在他将比较上述两个步骤的输出,看看它们是否匹配。这可确保消息未被任何人篡改。
这是数字签名如何工作的一般概念。希望这会有所帮助。
维基百科有一个相同过程的图形表示: http://upload.wikimedia.org/wikipedia/commons/2/2b/Digital_Signature_diagram.svg