0

我想發送兩個人之間的original_message。讓說,Alice和Bob,並且 我想知道如果這些步驟是正確的簽名的驗證或不java安全中的簽名驗證過程

  1. 翹散與她的專用密鑰的original_message - > H(M)
  2. 愛麗絲密碼散列消息 - > C(H(M))
  3. 愛麗絲簽名消息與她的專用密鑰 - > S(C(H(M)))

愛麗絲髮送的最後簽署的消息與她的(公鑰)和(original_message)給Bob。 在鮑勃側:

  1. 鮑勃哈希original_message - > H(M)
  2. 鮑勃破譯與Alice的公共密鑰簽名的消息 - > d(S(C(H(M))))
  3. 鮑勃檢查帶有散列消息的解密消息是否相等? (h(m)== d(s(c(h(m)))))

我知道我犯了一些錯誤。有沒有人知道雙方的良好秩序是什麼?

這裏我使用了java.security來做到這一點,但是當我在最後一步檢查哈希值時,它給了我錯誤!

在愛麗絲部分

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; 
     } 

    } 
在鮑勃部分

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

最後我找到了答案。錯誤在於,在愛麗絲部分做了一個符號()。因爲當你正在做散列和加密時,它已經變成了一個簽名,而當你簽名()時,Bob的另一次無法恢復散列簽名。

我的代碼也是「在Java安全公鑰加密單向散列」

的一個很好的例子,這是愛麗絲一部分,之後的一切工作的修改。

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; 
     } 

    } 
+0

你現在應該能夠接受你自己的答案...... –

-2

數字簽名是加密的(私人密鑰)的消息的散列的加密。

簽名s = C(H(M))

現在s是附加到消息m。從Alice到Bob發送的簽名消息是m + s

Bob在接收到Bob的m + s後,將用證書中存在的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