AES加密256 ECB模式

时间:2016-03-04 02:18:38

标签: java android encryption aes

我尝试使用密钥"hello"加密我的普通数据"01234567891234567890123456789012",但问题是我的加密代码与Rcpp dev list不一样。

这是我的安卓代码:

String smykey = "01234567891234567890123456789012";
String hellos = "hello";

SecretKeySpec key = new SecretKeySpec(smykey.getBytes(), "AES");

Cipher cipher =  Cipher.getInstance("AES");//("AES/ECB/PKCS7Padding");//("ECB");//("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] encrypted = cipher.doFinal(hellos.getBytes());

代码生成,

android: 0x25 0x66...0x2d 0x87 (32 bytes)
ref:     0xa3 0xef...0x68 0x9f (16 bytes)

这个Android代码出了什么问题?有人,我感谢你的帮助吗?

1 个答案:

答案 0 :(得分:1)

在线参考做了不同的事情,Android代码生成了正确的加密数据。

数据hellos不是块大小的倍数(16字节),因此您必须指定填充(PKCS#7)。

Android正在使用PKCS#7填充,而25669d21 dfd0fd6f cfef6cce 4ef12d87是使用256位密钥,ECB模式和PKCS#7填充的AES的正确结果。

smykeyhellos使用UTF-8编码转换为数据。

这是一种罕见的情况,使用ECB模式,它不安全,使用随机iv的CBC模式(将iv加载到加密数据)。不要在解密时返回填充错误。

使用HMAC或更好的密钥扩展功能(如PBKDF2)将字符串密码安全地保护到安全加密密钥。直接使用字符串作为密钥是不安全的。