標籤: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 加解密字串