我尝试使用密钥"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代码出了什么问题?有人,我感谢你的帮助吗?
答案 0 :(得分:1)
在线参考做了不同的事情,Android代码生成了正确的加密数据。
数据hellos
不是块大小的倍数(16字节),因此您必须指定填充(PKCS#7)。
Android正在使用PKCS#7填充,而25669d21 dfd0fd6f cfef6cce 4ef12d87
是使用256位密钥,ECB模式和PKCS#7填充的AES的正确结果。
smykey
和hellos
使用UTF-8编码转换为数据。
这是一种罕见的情况,使用ECB模式,它不安全,使用随机iv的CBC模式(将iv加载到加密数据)。不要在解密时返回填充错误。
使用HMAC或更好的密钥扩展功能(如PBKDF2)将字符串密码安全地保护到安全加密密钥。直接使用字符串作为密钥是不安全的。