我正在尝试将一些加密(短)信息存储在cookie中。我正在生成一个短字符串(大约64个字符),使用generateSecretKey()生成密钥,并尝试AES或Blowfish加密。
我使用encode()和decode()函数中的参数尝试了默认的UUEncoding,Base64和Hex。
使用AES,我收到错误
尝试加密或解密输入字符串时发生错误:com.rsa.jsafe.crypto.dr:无法执行取消填充:无效的填充字节..
使用Blowfish,我收到错误
尝试加密或解密输入字符串时发生错误:给定最终块未正确填充。
我做错了什么?
答案 0 :(得分:4)
Blowfish具有64位块大小,即8个字节。 AES的块大小为128位,即16个字节。
块大小意味着它只能执行那些大小的块。所以块大小为8字节的东西不能做7,6,5,4,3,2,1字节。
如果您所需的位数或字节数少于此数(此处为8和16字节),则必须填充具有到达8/16字节长块的内容。 (填充英文意味着您必须附加未使用的位/字节 - 有时是协议/算法规定的内容,有时内容无关紧要),直到您拥有所需大小的内容。)
这两个错误都抱怨填充错误。所以我的预感是你没有将正确大小(长度)的数据传递给加密/解密算法。检查您的文档以确定它们是否接受输入数据:
在加密步骤之前,您是否偶然意外地完成了UU / Base64 / Hex编码?
你应该:
显然,在收到数据后反转序列:
答案 1 :(得分:1)
我不确定您使用的是哪个版本,但这似乎适用于CF9,OpenBD和Railo(使用AES或Blowfish)
<!--- create an encrypted cookie --->
<cfset text = "testing, 1, 2, 3" >
<cfset key = generateSecretKey("AES")>
<cfset encrypted = encrypt(text, key, "AES", "hex")>
<cfcookie name="secretValue" value="#encrypted#">
<!--- display test values used--->
<form method="post">
DEBUG:<hr />
<cfoutput>
Text: #text#<br />
Key: #key#<br />
Encrypted: #encrypted# <br />
<input type="hidden" name="text" value="#text#">
<input type="hidden" name="key" value="#key#">
<input type="submit" value="Decrypt Cookie">
</cfoutput>
</form>
<!--- decrypt test values --->
<cfif structKeyExists(FORM, "key") AND structKeyExists(COOKIE, "secretValue")>
<cfset decrypted = decrypt(cookie.secretValue, key, "AES", "hex") >
<cfoutput>
form.text = #text# <br />
form.key = #key# <br />
cookie.secretValue = #cookie.secretValue# <br />
decrypted = #decrypted# <br />
</cfoutput>
</cfif>
答案 2 :(得分:0)
由于时间限制,我们最终使用cfmx_copat加密。
我向两位回答的人道歉,因为我从来没有像我希望的那样充分尝试他们的回答。