我有AES加密和解密的问题:我可以完全改变我的IV,但我仍然可以解码我的数据。
public static final byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 };
public static final byte[] IV2 = { 65, 1, 2, 23, 45, 54, 61, 81, 32, 21, 10, 121, 12, 13, 84, 45 };
public static final byte[] KEY = { 0, 42, 2, 54, 4, 45, 6, 7, 65, 9, 54, 11, 12, 13, 60, 15 };
public static final byte[] KEY2 = { 0, 42, 2, 54, 43, 45, 16, 17, 65, 9, 54, 11, 12, 13, 60, 15 };
//public static final int BITS = 256;
public static void test()
{
try
{
// encryption
Cipher c = Cipher.getInstance("AES");
SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV));
String s = "Secret message";
byte[] data = s.getBytes();
byte[] encrypted = c.doFinal(data);
String encryptedStr = "";
for (int i = 0; i < encrypted.length; i++)
encryptedStr += (char) encrypted[i];
//decryoption
Cipher d_c = Cipher.getInstance("AES");
SecretKeySpec d_keySpec = new SecretKeySpec(KEY, "AES");
d_c.init(Cipher.DECRYPT_MODE, d_keySpec, new IvParameterSpec(IV2));
byte[] decrypted = d_c.doFinal(encrypted);
String decryptedStr = "";
for (int i = 0; i < decrypted.length; i++)
decryptedStr += (char) decrypted[i];
Log.d("", decryptedStr);
}
catch (Exception ex)
{
Log.d("", ex.getMessage());
}
}
任何想法我做错了什么?如何获得256位AES加密(仅将密钥更改为32字节长数组?)
加密对我来说是一个新主题所以请新手友好的答案。
答案 0 :(得分:9)
您没有指定密码模式,因此提供商可能默认为电子代码簿模式(“ECB”)并完全忽略IV。您可以通过比较程序的多次运行产生的密文来验证这一点;我猜它们都是完全相同的。
密码块链接(“CBC”)通常受支持并广泛使用,但正确的模式取决于您的应用程序。
您也没有指定填充,因此提供程序正在选择默认值。 JCE称之为“PKCS5Padding”是对称密码的常见选择。
不是将“AES”指定为算法,而是提供完整的规范,包括算法,模式和填充,如“AES / CBC / PKCS5Padding”。
您不必在Cipher
名称中指定AES密钥大小;它是从用于初始化密码的密钥大小推断出来的。