[英]How can I decrypt the cipher encrypt from Java using CryptoJS like this
首先,很抱歉我的英語不好,可能會讓你混淆我在說什么。但我真的希望有人能幫助我......
這是我的 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"
output 是正確的,因為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 中添加鹽)。
因此,如果我只能從 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);
仍然希望我所說的對這個問題足夠清楚。我希望它可以幫助其他人......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.