Java脚本 AES 加密显示针对 Java Android 的错误结果

JavaScript AES Encryption showing wrong result against Java Android

我尝试在 Java脚本中使用 AES 方法转换字符串,我也只需要使用 CryptoJs 库即可实现。

当我从这个网站在线尝试时,结果如我所料,我的 Java 程序可以解密它,但是当我尝试 JavaScript 时,我没有得到相同的结果来自网站。

这就是我需要的;

数据:{"test":1}
秘密:NdRgUkXp2s5v8y/A

结果应该是:chib8X9Fnr7Vtn4VLRybKg==

我引用该网站的原因,我不知道上面结果的模式和填充方法,但是如果你知道上面结果的模式,下面的结果会按照服务器的预期显示也请参考。

可以参考在线加密使用https://www.devglan.com/online-tools/aes-encryption-decryption来验证。

这是我在使用 Java脚本时得到的错误;

var encrypted = CryptoJS.AES.encrypt('{"test",1}', "NdRgUkXp2s5v8y/A");
console.log(encrypted.toString()) 

结果:U2FsdGVkX1/GS5CecHJ10Z4qvSP8hY1NkDNtKGlg3OE= 每次生成时它也会改变。

我用这个库https://cryptojs.gitbook.io/docs/

您将纯字符串值作为秘密而不是 UTF-8 编码文本传递,并且您从上述网站获得的值使用 PKCS7 填充方法加密 ECB模式。通常,这是大多数 Android Java 加密方法支持的方法。

加密 使用 CryptoJS.pad.Pkcs7 并确保您提供的秘密是 UTF-8CryptoJS.enc.Utf8.parse(key) 而不是纯文本。

let data = '{"test":1}'
let key = 'NdRgUkXp2s5v8y/A'

var encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
});

console.log(encrypted.toString());

解密方法

var decrypted = CryptoJS.AES.decrypt(encrypted.toString(), CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
})

console.log(decrypted.toString(CryptoJS.enc.Utf8))

下面的例子证明了加密值符合预期。

let data = '{"test":1}'
let key = 'NdRgUkXp2s5v8y/A'

/*
* Encryption
*/
var encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
});

console.log(encrypted.toString());

/*
* Decryption
*/
var decrypted = CryptoJS.AES.decrypt(encrypted.toString(), CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
})

console.log(decrypted.toString(CryptoJS.enc.Utf8) + "\n")
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

当你打印出解密后的字符串时,不要忘记添加 .toString(CryptoJs.enc.utf8).

勾选https://github.com/brix/crypto-js#plain-text-encryption