2010-01-22 56 views
2

我正試圖在cookie中存儲一些嵌入的(短的)信息。我生成一個短字符串(大約64個字符),使用generateSecretKey()生成密鑰,並嘗試AES或Blowfish加密。加密問題

我試過使用encode()和decode()函數中的參數的默認UUEncoding,Base64和Hex。

隨着AES,我得到

試圖加密或解密您的輸入字符串時發生錯誤的錯誤:com.rsa.jsafe.crypto.dr:無法執行去填充:無效的填充字節..

隨着河豚,我得到

試圖加密或解密您的輸入字符串時發生錯誤的錯誤:給定最後一個塊未正確填充。

我在做什麼錯?

+0

ColdFusion的哪個版本? – 2010-01-22 19:37:33

+0

您能否提供一個演示問題的簡單示例? – Leigh 2010-01-22 22:35:13

+0

是的,請發佈您使用的cfml代碼。 – Henry 2010-01-22 22:48:47

回答

0

由於時間的限制,我們結束了使用cfmx_copat加密。

我對兩位回答的人表示歉意,因爲我從未能夠完全按照自己的喜好試驗他們的回答。

4

Blowfish具有64位塊大小,即8個字節。 AES具有128位的塊大小,即16個字節。

塊大小意味着它只能做那個大小的塊。所以一個塊大小爲8字節的東西不能做7,6,5,4,3,2,1字節。

如果你的位或字節數小於所需的位數(這裏是8和16字節),你必須填充那些有東西到達一個8/16字節長的塊。 (英文填充意味着你必須添加未使用的比特/字節 - 有時由協議/算法規定的內容,有時內容無關緊要),直到你擁有所需大小的東西。)

這兩個錯誤都會抱怨關於糟糕的填充。所以我的直覺是你沒有把正確的大小(長度)的數據傳遞給加密/解密算法。請檢查您的文檔,看他們是否接受作爲輸入數據:

  • 只有一個塊(8或這裏16個字節)
  • 塊大小的整數倍(=在這種情況下,你將不得不做填充)
  • 數據(=你沒有做填充任意大小 - 但後來爲什麼你開始與錯誤)

你不小心做你的UU/Base64的任何機會/十六進制編碼之前的加密步驟?

您應該:

  • 做加密第一,
  • 那麼UU/Base64編碼/十六進制編碼,
  • 然後將數據發送出去。

顯然,在接收到所述數據的反轉順序:

  • 第一UU/Base64編碼/己烷解碼,
  • 然後解密,
  • 然後用數據。
+0

我沒有編碼自己。我正在使用encode()/ decode()函數中的內置選項。 – 2010-01-22 20:24:55

+0

對不起,缺乏深入的環境知識,我不知道更進一步。我發現這個線程雖然,也許它有幫助:http://forums.sun.com/thread.jspa?threadID=607193 – 2010-01-22 21:10:45

1

我不知道你正在使用的版本,但是這似乎很好地工作CF9,OpenBD和Railo(使用AES或河豚)

<!--- 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>