91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現加密和數字簽名

發布時間:2021-07-01 15:24:55 來源:億速云 閱讀:194 作者:Leah 欄目:大數據

Java中怎么實現加密和數字簽名,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Java加密和數字簽名
消息摘要
這是一種與消息認證碼結合使用以確保消息完整性的技術。主要使用單向散列函數算法,
可用于檢驗消息的完整性,和通過散列密碼直接以文本形式保存等,目前廣泛使用的算法
有MD4、MD5、SHA-1, java.security.MessageDigest提供了一個簡易的操作方法

私鑰加密
消息摘要只能檢查消息的完整性,但是單向的,對明文消息并不能加密,要加密明文的消息的話,
就要使用其他的算法,要確保機密性,我們需要使用私鑰密碼術來交換私有消息。
使用私鑰加密的話,首先需要一個密鑰,可用javax.crypto.KeyGenerator產生一個密鑰(java.security.Key),
然后傳遞給一個加密工具(javax.crypto.Cipher),該工具再使用相應的算法來進行加密,
主要對稱算法有:DES(實際密鑰只用到56位),AES

//java項目www.1b23.com
publicclass PrivateKeyExample { 
   publicstaticvoid main(String[] args) throws Exception { 
      String source = "abcdefghijk"; 
      byte[] plainText = source.getBytes("UTF-8"); 
  
      // 通過KeyGenerator形成一個key 
      KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
      keyGen.init(128); 
      Key key = keyGen.generateKey(); 
      printKey(key); 
  
      byte[] result = encryption(plainText, key); 
      System.out.println("加密后數組大小:" + result.length); 
      System.out.println("加密后Base64字符串" + Base64.encodeBytes(result)); 
      byte[] newText = decryption(result, key); 
      System.out.println("解密后字符串:" + new String(newText, "UTF-8")); 
   } 
  
   publicstaticbyte[] encryption(byte[] plainText, Key key) throws Exception { 
      // 獲得一個私鈅加密類Cipher,ECB是加密方式,PKCS5Padding是填充方法 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      // 使用私鈅加密 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      byte[] cipherText = cipher.doFinal(plainText); 
      return cipherText; 
   } 
  
   publicstaticbyte[] decryption(byte[] source, Key key) throws Exception { 
      // 獲得一個私鈅加密類Cipher,ECB是加密方式,PKCS5Padding是填充方法 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      // 使用私鈅加密 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      byte[] result = cipher.doFinal(source); 
      return result; 
   } 
  
   privatestaticvoid printKey(Key key) throws UnsupportedEncodingException { 
      System.out.println("Algorithm:" + key.getAlgorithm()); 
      byte[] bytes = key.getEncoded(); 
      System.out.println("Encoded:" + Base64.encodeBytes(bytes)); 
   } 
}

公鑰加密
私鑰加密需要一個共享的密鑰,那么如何傳遞密鑰呢?web環境下,
直接傳遞的話很容易被偵聽到,幸好有了公鑰加密的出現。公鑰加密也叫不對稱加密,
不對稱算法使用一對密鑰對,一個公鑰,一個私鑰,使用公鑰加密的數據,
只有私鑰能解開(可用于加密);同時,使用私鑰加密的數據,只有公鑰能解開(簽名)。
公鑰的主要算法有RSA

//java項目www.1b23.com
publicclass PublicKeyExample { 
  
   publicstaticvoid main(String[] args) throws Exception { 
      String source = "abcdefghijk"; 
      byte[] plainText = source.getBytes("UTF-8"); 
      // 生成密鑰對 
      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
      keyGen.initialize(1024); 
      KeyPair key = keyGen.generateKeyPair(); 
  
      byte[] result = encryption(plainText, key); 
      System.out.println("加密后數組大小:" + result.length); 
      System.out.println("加密后Base64字符串" + Base64.encodeBytes(result)); 
      byte[] newText = decryption(result, key); 
      System.out.println("解密后字符串:" + new String(newText, "UTF-8")); 
   } 
  
   publicstaticbyte[] encryption(byte[] plainText, KeyPair keyPair) 
         throws Exception { 
      // 獲得一個RSA的Cipher類,使用公鈅加密 
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
      byte[] cipherText = cipher.doFinal(plainText); 
      return cipherText; 
   } 
  
   publicstaticbyte[] decryption(byte[] cipherText, KeyPair keyPair) 
         throws Exception { 
      // 獲得一個RSA的Cipher類,使用私鑰解密 
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
      byte[] newPlainText = cipher.doFinal(cipherText); 
      return newPlainText; 
   } 
}

數字簽名
數字簽名,它是確定交換消息的通信方身份的第一個級別。
上面A通過使用公鑰加密數據后發給B,B利用私鑰解密就得到了需要的數據,
問題來了,由于都是使用公鑰加密,那么如何檢驗是A發過來的消息呢?
上面也提到了一點,私鑰是唯一的,那么A就可以利用A自己的私鑰進行加密,
然后B再利用A的公鑰來解密,就可以了;數字簽名的原理就基于此,
而通常為了證明發送數據的真實性,通過利用消息摘要獲得簡短的消息內容,
然后再利用私鑰進行加密,散列數據和消息一起發送。
大致流程如下:
1.甲方構建密鑰對,將公鑰公布給乙方,保留私鑰。
2.甲方使用私鑰加密數據,然后用私鑰對加密后的數據簽名,發送給乙方簽名以及加密后的數據。
3.乙方使用公鑰、簽名來驗證待解密數據是否有效,如果有效使用公鑰對數據解密。
4.乙方使用公鑰加密數據,向甲方發送經過加密后的數據。
5.甲方獲得加密數據,通過私鑰解密。

//java項目www.1b23.com
public class DigitalSignatureExample { 
  
   publicstaticvoid main(String[] args) throws Exception { 
      String source = "abcdefghijk"; 
      byte[] plainText = source.getBytes("UTF-8"); 
      System.out.println("原始字符串:" + source); 
      System.out.println("原始數據數組長度:" + plainText.length); 
      // 形成RSA公鑰對 
      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
      keyGen.initialize(1024); 
      KeyPair key = keyGen.generateKeyPair(); 
  
      /* 使用私鑰加密 */ 
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, key.getPrivate()); 
      byte[] cipherText = cipher.doFinal(plainText); 
  
      // 使用私鈅簽名 
      Signature sig = Signature.getInstance("SHA1WithRSA"); 
      sig.initSign(key.getPrivate()); 
      sig.update(cipherText); 
      byte[] signature = sig.sign(); 
      System.out.println("簽名數組長度:" + signature.length); 
  
      // 使用公鑰進行驗證 
      sig.initVerify(key.getPublic()); 
      sig.update(cipherText); 
      try { 
         if (sig.verify(signature)) { 
            System.out.println("數字簽名驗證通過"); 
            /* 使用公鑰解密 */ 
            cipher.init(Cipher.DECRYPT_MODE, key.getPublic()); 
            byte[] newPlainText = cipher.doFinal(cipherText); 
            System.out.println("解密后的字符串:" 
                   + new String(newPlainText, "UTF-8")); 
         } else 
            System.out.println("數字簽名驗證失敗"); 
      } catch (SignatureException e) { 
         System.out.println("捕捉到異常,數字簽名驗證失敗"); 
      } 
   }   
}

看完上述內容,你們掌握Java中怎么實現加密和數字簽名的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰都县| 通许县| 灌南县| 藁城市| 克东县| 永泰县| 马关县| 孟津县| 隆化县| 乐业县| 榆树市| 黔江区| 西青区| 中山市| 龙胜| 民县| 汾阳市| 曲水县| 景宁| 富宁县| 兴化市| 临湘市| 横山县| 阿拉善盟| 龙岩市| 射阳县| 瓦房店市| 天镇县| 外汇| 天柱县| 永福县| 凤阳县| 祁连县| 郧西县| 岚皋县| 远安县| 麻阳| 石台县| 昭觉县| 亳州市| 海南省|