Java 使用AES/CBC/PKCS7Padding 加解密字串

來源:互聯網
上載者:User

標籤:ref   security   需要   block   rate   decrypt   pad   ase   pre   

介於java 不支援PKCS7Padding,只支援PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 沒有什麼區別
要實現在java端用PKCS7Padding填充,需要用到bouncycastle組件來實現

所以需要一個jar 來支援。bcprov-jdk16-146.jar

:http://central.maven.org/maven2/org/bouncycastle/bcprov-jdk16/1.46/bcprov-jdk16-1.46.jar

廢話不說了,下面上代碼

加解密類

/** * * @author ngh * AES128 演算法 * * CBC 模式 * * PKCS7Padding 填充模式 * * CBC模式需要添加一個參數iv * * 介於java 不支援PKCS7Padding,只支援PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 沒有什麼區別 * 要實現在java端用PKCS7Padding填充,需要用到bouncycastle組件來實現 */public class AES { // 演算法名稱 final String KEY_ALGORITHM = "AES"; // 加解密演算法/模式/填充方式 final String algorithmStr = "AES/CBC/PKCS7Padding"; // private Key key; private Cipher cipher; boolean isInited = false; byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 }; public void init(byte[] keyBytes) {  // 如果密鑰不足16位,那麼就補足.  這個if 中的內容很重要  int base = 16;  if (keyBytes.length % base != 0) {   int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);   byte[] temp = new byte[groups * base];   Arrays.fill(temp, (byte) 0);   System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);   keyBytes = temp;  }  // 初始化  Security.addProvider(new BouncyCastleProvider());  // 轉化成JAVA的密鑰格式  key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);  try {   // 初始化cipher   cipher = Cipher.getInstance(algorithmStr, "BC");  } catch (NoSuchAlgorithmException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchPaddingException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchProviderException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } /**  * 加密方法  *  * @param content  *            要加密的字串  * @param keyBytes  *            加密金鑰  * @return  */ public byte[] encrypt(byte[] content, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(content);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; } /**  * 解密方法  *  * @param encryptedData  *            要解密的字串  * @param keyBytes  *            解密密鑰  * @return  */ public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(encryptedData);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; }}

測試類別

ublic class Test { public static void main(String[] args) {  AES aes = new AES();//   加解密 密鑰  byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };  String content = "1";  // 加密字串  System.out.println("加密前的:" + content);  System.out.println("加密金鑰:" + new String(keybytes));  // 加密方法  byte[] enc = aes.encrypt(content.getBytes(), keybytes);  System.out.println("加密後的內容:" + new String(Hex.encode(enc)));  // 解密方法  byte[] dec = aes.decrypt(enc, keybytes);  System.out.println("解密後的內容:" + new String(dec)); }}
測試結果:加密前的:1加密金鑰:12345678IV:0102030405060708加密後的內容:b59227d86200d7fedfb8418a59a8eea9IV:0102030405060708解密後的內容:1

 

Java 使用AES/CBC/PKCS7Padding 加解密字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.