2015-03-19 55 views
1

我正在尝试编写加密或解密字符串(主要是数字)的方法。它工作正常的一些文本(EG- '1010000011', '1010000012', '1010000013'),但给出以下为别人的错误(EG- '1010000014', '1010000018'):AES加密/解密:鉴于最后的块没有正确填充

javax.crypto.BadPaddingException :鉴于最终块无法正常 填充

这里去我的代码:

public static SecretKey secKey; 
private static IvParameterSpec ivspec; 
static { 
    try { 
     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
     KeySpec spec = new PBEKeySpec("i15646dont6321wanna".toCharArray(), 
       "ahhalkdjfslk3205jlk3m4ljdfa85l".getBytes("UTF-8"), 65536, 256); 
     SecretKey tmp = factory.generateSecret(spec); 
     secKey = new SecretKeySpec(tmp.getEncoded(), "AES"); 
     byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
     ivspec = new IvParameterSpec(iv); 
    } catch (NoSuchAlgorithmException | InvalidKeySpecException | UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
} 

public static String encryptData(String textToEncrypt) { 

    byte[] encryptedBytes = null; 
    String encryptedText = ""; 
    try { 
     byte[] byteToEncrypt = textToEncrypt.getBytes(Charset.defaultCharset()); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secKey, ivspec); 
     encryptedBytes = cipher.doFinal(byteToEncrypt); 
     encryptedText = new String(encryptedBytes); 
    } catch (NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException 
      | InvalidKeyException | NoSuchPaddingException | InvalidAlgorithmParameterException e) { 
     e.printStackTrace(); 
    } 
    return encryptedText; 
} 

public static String decryptData(String textToDecrypt) { 

    byte[] decryptedBytes = null; 
    String decryptedText = ""; 
    try { 
     byte[] byteToDecrypt = textToDecrypt.getBytes(Charset.defaultCharset()); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, secKey, ivspec); 
     decryptedBytes = cipher.doFinal(byteToDecrypt); 
     decryptedText = new String(decryptedBytes); 
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException 
      | IllegalBlockSizeException | BadPaddingException 
      | InvalidAlgorithmParameterException e) { 
     e.printStackTrace(); 
    } 
    return decryptedText; 
} 

要加密从文件中读取和写入加密后的一些其他文件中的字符串。这个加密的文本将不得不稍后解密。我按照以下方式调用这些方法:

String[] lineArray = line.split(" | "); //line is read from a file. 
String encryptedText = AESEncryption.encryptData(lineArray[0]); 
String decryptedText = AESEncryption.decryptData(encryptedText); 
System.out.println("Original Text: " + lineArray[0] + " | Encrypted text: " 
       + encryptedText + " | Decrypted again: " + decryptedText); 
+0

当在转换字符串字节数组,如果我用UTF-8或UTF-16,它抛出异常而解密: javax.crypto.IllegalBlockSizeException:带衬垫的密码解密时输入长度必须为16的倍数 – Amarjeet 2015-03-19 12:41:33

回答

2

您试图将加密数据作为字符串传递。这是致命的。加密的数据是字节,而不是字符串。使用Base64转换实用程序将加密的字节转换为Base64字符串。

加密:明文 - >加密字节 - > Base64文本。

解密:Base64文本 - >加密字节 - >解密文本。

相关问题