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=
每次生成时它也会改变。
您将纯字符串值作为秘密而不是 UTF-8 编码文本传递,并且您从上述网站获得的值使用 PKCS7 填充方法加密 ECB模式。通常,这是大多数 Android Java 加密方法支持的方法。
加密 使用 CryptoJS.pad.Pkcs7
并确保您提供的秘密是 UTF-8
和 CryptoJS.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).
我尝试在 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=
每次生成时它也会改变。
您将纯字符串值作为秘密而不是 UTF-8 编码文本传递,并且您从上述网站获得的值使用 PKCS7 填充方法加密 ECB模式。通常,这是大多数 Android Java 加密方法支持的方法。
加密 使用 CryptoJS.pad.Pkcs7
并确保您提供的秘密是 UTF-8
和 CryptoJS.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).