Encryption Coldfusion decrypt赢得';无法使用CryptoJS:给定的最后一个块未正确填充

Encryption Coldfusion decrypt赢得';无法使用CryptoJS:给定的最后一个块未正确填充,encryption,coldfusion,aes,cryptojs,Encryption,Coldfusion,Aes,Cryptojs,我正在努力使用CryptoJS加密用户名和密码,并在我的Coldfusion/Railo服务器上的远程CFC上解密它。我收到的错误消息是:给定的最后一个块没有正确填充。我看过相关的主题,但我无法将解决方案“翻译”到我的案例中 以下是在服务器上调用函数的JavaScript: var username = "hr_muller@blabla.com" var password = "12345" var ident = username.concat('|',password) var key

我正在努力使用CryptoJS加密用户名和密码,并在我的Coldfusion/Railo服务器上的远程CFC上解密它。我收到的错误消息是:给定的最后一个块没有正确填充。我看过相关的主题,但我无法将解决方案“翻译”到我的案例中

以下是在服务器上调用函数的JavaScript:

var username = "hr_muller@blabla.com"
var password = "12345"
var ident = username.concat('|',password)

var key = CryptoJS.enc.Utf8.parse("dotterbloem20151");
var key  = CryptoJS.enc.Base64.stringify(key);

var encrypted = CryptoJS.AES.encrypt(ident, key, {iv: key});

//In my JS the encryption/decryption works fine
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: key});
document.write(decrypted.toString(CryptoJS.enc.Utf8));
document.write('<BR>')
document.write(decrypted.toString(key));

var url = "cfc/roland.cfc?method=checkLoginstatus";
$.ajax({
     url: url,
     type: 'POST',
     dataType: "json",
     data: { "webkey" : encrypted.toString() }, 
     success: function(response) {
     }
});
var username=“hr_muller@blabla.com"
var password=“12345”
var ident=username.concat(“|”,密码)
var key=CryptoJS.enc.Utf8.parse(“dotterbloem20151”);
var key=CryptoJS.enc.Base64.stringify(key);
var encrypted=CryptoJS.AES.encrypt(ident,key,{iv:key});
//在我的JS中,加密/解密工作正常
var decrypted=CryptoJS.AES.decrypt(加密,密钥,{iv:key});
document.write(解密的.toString(CryptoJS.enc.Utf8));
文档。写入(“
”) document.write(解密的.toString(key)); var url=“cfc/roland.cfc?方法=检查登录状态”; $.ajax({ url:url, 键入:“POST”, 数据类型:“json”, 数据:{“webkey”:加密的.toString()}, 成功:功能(响应){ } });
以下是我的CFC中的函数:

<cffunction name="checkLoginstatus" access="remote" returntype="any" returnformat="plain">

    <cfargument name="webkey" />

    <cfoutput>
        <cfset myKey = Tobase64("dotterbloem20151") />
        <cfset myIV = charsetDecode("dotterbloem20151", "utf-8" )>
        #Decrypt(ARGUMENTS.webkey, myKey, "AES/CBC/PKCS5Padding", "base64", myIV)#
    </cfoutput>

</cffunction>

#解密(ARGUMENTS.webkey,myKey,“AES/CBC/PKCS5Padding”,“base64”,myIV)#

我不知道Coldfusion,但看起来您使用相同的密码从中派生密钥和IV,但每个密码都不同

您可以在CryptoJS中执行此操作:

var iv=CryptoJS.enc.Utf8.parse(“dotterbloem20151”); var key=CryptoJS.enc.Base64.stringify(iv); var encrypted=CryptoJS.AES.encrypt(ident,key,{iv:iv}); 这是一种推导密钥的奇怪方式,因为16个字符的密码被编码为64进制,从而产生24个编码字符。16字节和24字节都是AES的有效密钥大小,但使用Base 64派生密钥至少很奇怪


这个代码不是很安全。如果您有密码,则需要以安全的方式从该密码派生密钥。您需要使用带有随机salt和多次迭代的PBKDF2。看


IV也必须随机生成。它不必是秘密的,因此您可以简单地将其与密文一起发送。

它不起作用的原因是,当您使用字符串ie
CryptoJS.enc.Base64.stringify(key)
时,该字符串被视为密码短语,并用于派生加密密钥。因此,实际的“键”与您在CF中使用的键不同。要使其工作,您需要使用“字数组”(或二进制)。然而,正如Artjom B.所指出的,这两种方法都不是非常安全的。这类似于锁上你的房子,但把钥匙粘在前门上。。