【发布时间】:2021-05-30 08:29:19
【问题描述】:
首先,很抱歉我的英语不好,可能会让你混淆我在说什么。但我真的希望有人能帮助我……
这是我加密密码的 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 一样的密文时,我不知道如何获得正确的解密答案。
嗯……就是这样,希望我说的足够清楚……
【问题讨论】:
-
您必须以 CryptoJS 在解密期间隐式或显式地提供
CipherParams对象的方式传递数据。您可以将数据作为CipherParams对象显式传递(封装密文,如果使用密码短语,则为盐)。或者您可以传递 OpenSSL 格式的数据,然后 CryptoJS 将执行隐式转换。 -
@Topaco THX!你是对的!让我感到困惑的是,当我没有盐时,如何解密。但它可能不需要盐,因为我使用填充模式:
CryptoJS.pad.ZeroPadding。
标签: javascript java encryption aes cryptojs