Проблемы с шифрованием в ColdFusion - PullRequest
2 голосов
/ 22 января 2010

Я пытаюсь сохранить некоторую зашифрованную (короткую) информацию в куки. Я генерирую короткую строку (около 64 символов), генерирую ключ с помощью generateSecretKey () и пытаюсь использовать шифрование AES или Blowfish.

Я пробовал стандартные UUEncoding, Base64 и Hex, используя параметры в функциях encode () и decode ().

С AES я получаю ошибку

Произошла ошибка при попытке зашифровать или расшифровать введенную строку: com.rsa.jsafe.crypto.dr: не удалось выполнить раскладку: недопустимый байт pad ..

С Blowfish я получаю ошибку

Произошла ошибка при попытке зашифровать или расшифровать введенную строку: данный последний блок заполнен неправильно.

Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 22 января 2010

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 Encoding,
  • затем отправка данных.

Очевидно, обратная последовательность после получения данных:

  • первое UU / Base64 / шестнадцатеричное декодирование,
  • затем расшифровать,
  • затем используйте данные.
1 голос
/ 25 января 2010

Я не уверен, какую версию вы используете, но, похоже, это нормально работает с 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>
0 голосов
/ 09 февраля 2010

Из-за нехватки времени мы использовали шифрование cfmx_copat.

Я прошу прощения у обоих людей, которые ответили, поскольку я никогда не мог экспериментировать с их ответами так полно, как мне бы хотелось.

...