java安全性中的签名验证过程

时间:2014-01-08 23:06:12

标签: java security digital-signature encryption-asymmetric message-digest

我想在两个人之间发送原始消息。让爱丽丝和鲍勃说吧 我想知道这些步骤是否适用于签名的验证

  1. Alice使用她的PrivateKey散列original_message - > H(M)
  2. Alice加密哈希消息 - > C(H(M))
  3. Alice用她的PrivateKey签名邮件 - > S(C(H(M)))
  4. Alice将最终签名的邮件与她(PublicKey)和(original_message)一起发送给Bob。 鲍勃方面:

    1. Bob hash the original_message - > H(M)
    2. Bob使用Alice公钥解密签名的消息 - > d(S(C(H(M))))
    3. Bob检查带有哈希消息的解密消息是否相等? if(h(m)== d(s(c(h(m)))))
    4. 我知道我做错了。有没有人知道双方的良好秩序是什么?

      这里我使用了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;
              }
          }
      

2 个答案:

答案 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