亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

长泰县| 子长县| 通城县| 双桥区| 华容县| 四平市| 日土县| 宁乡县| 水富县| 长海县| 新蔡县| 镇巴县| 手机| 新沂市| 延川县| 洛南县| SHOW| 沙田区| 饶阳县| 隆尧县| 宁德市| 喀喇沁旗| 和龙市| 万荣县| 阜康市| 盐源县| 肥西县| 昌图县| 大渡口区| 新建县| 金平| 青州市| 贡山| 河东区| 嘉祥县| 东乡| 盘山县| 西充县| 平利县| 文山县| 连南|