2

我正在尝试将一些加密(短)信息存储在 cookie 中。我正在生成一个短字符串(大约 64 个字符),使用 generateSecretKey() 生成密钥,并尝试使用 AES 或 Blowfish 加密。

我已经使用 encode() 和 decode() 函数中的参数尝试了默认的 UUEncoding、Base64 和 Hex。

使用 AES,我得到了错误

尝试加密或解密您的输入字符串时发生错误:com.rsa.jsafe.crypto.dr:无法执行取消填充:无效填充字节..

使用 Blowfish,我得到了错误

尝试加密或解密您的输入字符串时发生错误:未正确填充最终块。

我究竟做错了什么?

4

3 回答 3

4

Blowfish的块大小为 64 位,即 8 个字节。AES的块大小为 128 位,即 16 字节。

块大小意味着它只能做那个大小的块。所以块大小为 8 字节的东西不能做 7,6,5,4,3,2,1 字节。

如果您的位数或字节数少于所需数量(此处为 8 和 16 字节),则必须用一些东西填充它们以达到 8/16 字节长的块。(英文填充意味着您必须附加未使用的位/字节 - 有时是协议/算法规定的内容,有时内容无关紧要),直到您拥有所需大小的东西。)

这两个错误都抱怨填充错误。所以我的预感是你没有将正确大小(长度)的数据传递给加密/解密算法。检查您的文档以查看它们是否接受作为输入数据:

  • 正好一个块(这里是 8 或 16 个字节)
  • 块大小的精确倍数(= 在这种情况下,您必须进行填充)
  • 任意大小的数据(=您不必进行填充-但是为什么一开始就出现错误?)

在加密步骤之前您是否有可能意外完成了 UU/Base64/Hex 编码?

你应该:

  • 先做加密,
  • 然后是 UU/Base64/Hex 编码,
  • 然后将数据发送出去。

显然,在收到数据后颠倒顺序:

  • 第一次 UU/Base64/Hex 解码,
  • 然后解密,
  • 然后使用数据。
于 2010-01-22T19:56:39.493 回答
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>
于 2010-01-25T05:58:10.913 回答
0

由于时间限制,我们最终使用了 cfmx_copat 加密。

我向两个回答的人道歉,因为我从来没有能够像我希望的那样充分地试验他们的回答。

于 2010-02-09T16:57:17.347 回答