java aes加密与网上在线加密不同。谁能告诉我为什么?求个正确的例子,谢谢了!

我的代码如下:内容:test 密码:12345678
测试结果:73C58BAFE578C59366D8C995CD0B9D6D
在线结果:fdc2a7ef5a761218fd4c10294e3b516c
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes("utf-8")));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}

Cipher.getInstance("AES/ECB/PKCS5Padding");
就是这个东西有很多标准的,你得看下线上用的是什么标准

AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)追问

你能给个精确一点的回答吗?这里用的是AES,也就是前四条。NoPadding的话加密内容不是16的整数直接异常,其它组合我都试过了。调不出。

追答

细看了一下你的代码,我不太明白这段的含义

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes("utf-8")));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();

SecureRandom指的是一个随机数,参数是种子,而不是key的内容


修改了下代码就会得出线上的内容,一般密码都会用MD5生成个摘要,才用来作Key的值(MD5刚好是16个字节)

   SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(password.getBytes("utf-8"), 16), "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   byte[] byteContent = content.getBytes("utf-8");
   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] result = cipher.doFinal(byteContent);
   return result;

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-05-27
这个都是统一的啊
相似回答