首先,我很抱歉,我的英语不好,可能会让你混淆我在说什么。但是我真的希望有人能帮助我......
下面是我加密密码的Java代码:
public static String decryptByAES_CBC(String data, String key) {
try {
byte[] decryptFrom = convertHexStringToBytes(data);
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
String iv = new StringBuffer(key).reverse().toString();
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] original = cipher.doFinal(decryptFrom);
return new String(original);
} catch (Exception e) {
LogUtil.exception(e);
return null;
}
}
现在开始在Java中加密:
EncryptionUtil.encryptByAES_CBC("whywhywhywhywhywhy", "9999999999999999”);
然后得到结果:
030f7c7d57e82c6fb7d3066363e59c9dd6de7daa486146857552d31403a7cc71
我可以在CryptoJS中获得相同的加密结果,这是我的CryptoJS代码:
encodeByAES_CBC(data, key) {
return CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
iv : CryptoJS.enc.Utf8.parse(key),
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
}).ciphertext.toString();
},
decodeByAES_CBC(data, key) {
return CryptoJS.AES.decrypt(data, CryptoJS.enc.Utf8.parse(key), {
iv : CryptoJS.enc.Utf8.parse(key),
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
}).toString(CryptoJS.enc.Utf8);
}
这是一个困扰我的问题:例如:var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
console.log(decrypted.toString(CryptoJS.enc.Utf8)); \ The output is "Message"
输出正确,因为参数encrypted
是CipherParams
类型。
但是我不知道如何才能得到正确的解密答案,当我只有密文,就像我从服务器得到的030f7c7d57e82c6fb7d3066363e59c9dd6de7daa486146857552d31403a7cc71
和密钥9999999999999999
。
Em......就这些,希望我说的足够清楚......
我已经找到办法了。
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase”);
CryptoJS.AES.decrypt(CryptoJS.lib.CipherParams.create({
ciphertext: encrypted.ciphertext,
salt: encrypted.salt
}).toString(CryptoJS.format.OpenSSL),key).toString(CryptoJS.enc.Utf8)); \ The output also is "Message"
在我的Java代码中,因为我使用Noppading(注意:Java中的Noppading = CryptoJS中的Zeropadding !!)),所以不需要在CryptoJS.lib.CipherParams.create()中添加盐。
所以如果我只能从Java加密中得到密码和密钥。我可以在
中解密CryptoJS.AES.decrypt(CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Hex.parse(data)
}).toString(CryptoJS.format.OpenSSL), CryptoJS.enc.Utf8.parse(key), {
iv : CryptoJS.enc.Utf8.parse(key),
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
}).toString(CryptoJS.enc.Utf8);
仍然希望我所说的对这个问题足够清楚。我希望它能帮助到其他人……