Проблемы с шифрованием в ColdFusion

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

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

С AES я получаю сообщение об ошибке

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

С Blowfish я получаю сообщение об ошибке

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

Что я делаю неправильно?


person Ben Doom    schedule 22.01.2010    source источник
comment
Какая версия/редакция ColdFusion?   -  person Eric Kolb    schedule 22.01.2010
comment
Не могли бы вы привести простой пример, демонстрирующий проблему?   -  person Leigh    schedule 23.01.2010
comment
Да, пожалуйста, опубликуйте код cfml, который вы использовали.   -  person Henry    schedule 23.01.2010


Ответы (3)


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,
  • затем расшифровать,
  • затем используйте данные.
person Bandi-T    schedule 22.01.2010
comment
Я не кодировал себя. Я использовал встроенную опцию в функциях encode()/decode(). - person Ben Doom; 22.01.2010
comment
Извините, из-за отсутствия глубоких знаний об окружающей среде я не знаю больше. Я нашел эту ветку, может быть, она поможет: forums.sun.com/thread.jspa? threadID=607193 - person Bandi-T; 23.01.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>
person Leigh    schedule 25.01.2010

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

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

person Ben Doom    schedule 09.02.2010