用DES加密和解密,用JavaScript加密和解密Base64

用DES加密和解密,用JavaScript加密和解密Base64,javascript,encryption,cryptojs,Javascript,Encryption,Cryptojs,我正在加密以前在base64中编码的内容 步骤如下: 1.在base64中对纯(可读)文本进行编码 2.使用CryptoJS使用DES/CBC/PKCS7PADDING加密base64编码的文本 3.在base64中再次编码步骤2中获得的信息 这是我的Javascript代码: function encryptDesCbcPkcs7Padding(message, key) { var keyHex = CryptoJS.enc.Utf8.parse(key); var iv

我正在加密以前在base64中编码的内容

步骤如下:
1.在base64中对纯(可读)文本进行编码
2.使用CryptoJS使用DES/CBC/PKCS7PADDING加密base64编码的文本
3.在base64中再次编码步骤2中获得的信息

这是我的Javascript代码:

function encryptDesCbcPkcs7Padding(message, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var iv = new Uint8Array(0);
    var ivHex = CryptoJS.enc.Hex.parse(CryptoJS.enc.Utf8.parse(iv).toString(CryptoJS.enc.Hex));

    var encrypted = CryptoJS.DES.encrypt(message, keyHex, { iv: ivHex, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });


    return encrypted;//.toString(CryptoJS.enc.Utf8);
}

var plainText = "hola";
console.log("Plain text: ", plainText);
var base64Coded = window.btoa(plainText);
console.log("Base64 coded text: ", base64Coded);

var encrypted = encryptDesCbcPkcs7Padding(base64Coded, "12345678");
console.log("Encrypted: ", encrypted);
var finalEncrypted = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
console.log("Final encrypted: ", finalEncrypted);
alert("Final encrypted: " + finalEncrypted);
通过这段代码,我获得了与前面步骤相关的信息

问题:我无法执行相反的步骤。我做错了什么

以下是我在反面使用的代码:

function decryptDesCbcPkcs7Padding(message, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var iv = new Uint8Array(0);
    var ivHex = CryptoJS.enc.Hex.parse(CryptoJS.enc.Utf8.parse(iv).toString(CryptoJS.enc.Hex));

    var decrypted = CryptoJS.DES.decrypt(message, keyHex, { iv: ivHex, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });


    return decrypted.toString(CryptoJS.enc.Utf8);
}

var base64Decoded = CryptoJS.enc.Base64.parse(finalEncrypted).toString();
console.log("Base64 decoded", base64Decoded);

var decrypted = decryptDesCbcPkcs7Padding(base64Decoded, "12345678");
console.log("Decrypted: ", decrypted);

var finalDecrypted = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
console.log("Final encrypted: ", finalEncrypted);
alert("Final encrypted: " + finalEncrypted);

我无法使此代码正常工作,我做错了什么?

除了复制粘贴错误外,代码中的编码还有许多问题。这是固定代码

函数encryptDesCbcPkcs7Padding(消息、密钥){
var关键字=CryptoJS.enc.Utf8.parse(key);
var ivWords=CryptoJS.lib.WordArray.create([0,0]);
var encrypted=CryptoJS.DES.encrypt(消息,关键字,{iv:ivWords});
返回加密;/.toString(CryptoJS.enc.Utf8);
}
var plainText=“hola”;
log(“纯文本:”,纯文本);
var base64Coded=window.btoa(纯文本);
日志(“Base64编码文本:”,Base64编码);
var encrypted=encryptDesCbcPkcs7Padding(base64编码,“12345678”);
console.log(“加密:”,加密);
var finalEncrypted=CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
log(“最终加密:”,最终加密);
警报(“最终加密:+finalEncrypted”);
函数decryptDesCbcPkcs7Padding(消息、密钥){
var关键字=CryptoJS.enc.Utf8.parse(key);
var ivWords=CryptoJS.lib.WordArray.create([0,0]);
var decrypted=CryptoJS.DES.decrypt({ciphertext:message},关键字,{iv:ivWords});
返回解密的.toString(CryptoJS.enc.Utf8);
}
var base64Decoded=CryptoJS.enc.Base64.parse(最终加密);
日志(“Base64已解码”,Base64已解码);
var decrypted=decrypteddescbcpkcs7padding(base64解码,“12345678”);
log(“已解密:”,已解密);
var finalDecrypted=CryptoJS.enc.Base64.parse(decryptojs.enc.Utf8)).toString(CryptoJS.enc.Utf8);
log(“最终解密:”,最终加密);
警报(“最终解密:+最终加密”)

除了复制粘贴错误外,代码中的编码还有许多问题。这是固定代码

函数encryptDesCbcPkcs7Padding(消息、密钥){
var关键字=CryptoJS.enc.Utf8.parse(key);
var ivWords=CryptoJS.lib.WordArray.create([0,0]);
var encrypted=CryptoJS.DES.encrypt(消息,关键字,{iv:ivWords});
返回加密;/.toString(CryptoJS.enc.Utf8);
}
var plainText=“hola”;
log(“纯文本:”,纯文本);
var base64Coded=window.btoa(纯文本);
日志(“Base64编码文本:”,Base64编码);
var encrypted=encryptDesCbcPkcs7Padding(base64编码,“12345678”);
console.log(“加密:”,加密);
var finalEncrypted=CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
log(“最终加密:”,最终加密);
警报(“最终加密:+finalEncrypted”);
函数decryptDesCbcPkcs7Padding(消息、密钥){
var关键字=CryptoJS.enc.Utf8.parse(key);
var ivWords=CryptoJS.lib.WordArray.create([0,0]);
var decrypted=CryptoJS.DES.decrypt({ciphertext:message},关键字,{iv:ivWords});
返回解密的.toString(CryptoJS.enc.Utf8);
}
var base64Decoded=CryptoJS.enc.Base64.parse(最终加密);
日志(“Base64已解码”,Base64已解码);
var decrypted=decrypteddescbcpkcs7padding(base64解码,“12345678”);
log(“已解密:”,已解密);
var finalDecrypted=CryptoJS.enc.Base64.parse(decryptojs.enc.Utf8)).toString(CryptoJS.enc.Utf8);
log(“最终解密:”,最终加密);
警报(“最终解密:+最终加密”)

第四部分的全部两行毫无意义
iv
必须是
CryptoJS.enc.Utf8.parse(iv)
中的字符串,但它是Uint8Array。然后你用十六进制编码,只是为了立即用十六进制解码。这没有道理。然后,对于CBC模式,IV必须为128位长,但出于某种原因,您尝试使用空IV。同时检查最后两个控制台/警报打印:可能您想要打印最终加密?@ArtjomB。我试着把它作为empy IV。在java语言中,我用新字节[8]初始化它,我试着用JavaScript做同样的事情。(空或zeroIV):IvParameterSpec zeroIV=新IvParameterSpec(新字节[8]);然后使用
var ivHex=CryptoJS.lib.WordArray.create([0,0])二进制数据表示为32位字,您需要其中两个。记住,使用固定的IV值是不安全的。静脉注射不需要保密,只需要不可预测。因此,您应该始终生成一个随机IV并将其与密文一起发送。谢谢@ArtjomB。我做了你建议的改变。但是,从反面获得的信息仍然不一样。“finalDecrypted”变量应该在背面再次得到“hola”。第四部分的整两行完全没有意义
iv
必须是
CryptoJS.enc.Utf8.parse(iv)
中的字符串,但它是Uint8Array。然后你用十六进制编码,只是为了立即用十六进制解码。这没有道理。然后,对于CBC模式,IV必须为128位长,但出于某种原因,您尝试使用空IV。同时检查最后两个控制台/警报打印:可能您想要打印最终加密?@ArtjomB。我试着把它作为empy IV。在java语言中,我用新字节[8]初始化它,我试着用JavaScript做同样的事情。(空或zeroIV):IvParameterSpec zeroIV=新IvParameterSpec(新字节[8]);然后使用
var ivHex=CryptoJS.lib.WordArray.create([0,0])二进制数据表示为32位字,您需要其中两个。记住,使用固定的IV值是不安全的。静脉注射不需要保密,只需要不可预测。所以你