AES算法的奇怪行为

时间:2012-05-17 05:04:23

标签: java android encryption aes

Iam使用以下代码加密数据

final SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),
        "AES");
        final String myIV = "89ABCDEF01234567"; 
        Cipher c = null;
        try {
            try {
                c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));


            byte[] encrypted = c.doFinal(msgfromEB.getBytes(),0,msgfromEB.getBytes().length);

和iam decyrpting一样

c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));  

            byte[] decryptedBytes = c.doFinal(encrypted ,0,encrypted .length);

            System.out.println("decrypted string is"+new String(decryptedBytes));

正在运行我能够正确加密和解​​密

但如果我转换成这样的字符串

String myString = new String (encrypted);

再次得到像这样的字节数组

byte[] newbytearray = myString.getBytes();

现在我试图解密

c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(
                    myIV.getBytes()));  

            byte[] decryptedBytes = c.doFinal(newbytearray ,0,newbytearray .length);

            System.out.println("decrypted string is"+new String(decryptedBytes));

现在我收到了错误

javax.crypto.IllegalBlockSizeException:解密时最后一个块不完整

如果我使用base64转换它工作正常,但我不想这样做,因为它增加了长度。除此之外还有其他替代方案吗?

1 个答案:

答案 0 :(得分:1)

另一种方法是传输字节而不是字符串。

当您执行new String(bytes)时,您要求使用平台的默认编码将字节和字节序列解释为字符。问题是所有字节和字节序列都不代表有效字符。因此该算法是有损的。这有点像将彩色图片转换为黑白,然后尝试从黑白变为彩色。它不起作用。因此需要base64。

另一个问题是您没有指定任何显式编码,这意味着如果发件人和接收者不在完全相同的平台上,则可以使用不同的编码。