2012-02-17 3 views
8

Мне нужно закодировать результат выполнения с RC4. Прежде чем делать сценарий bash, я тестирую, как склеить данные.RC4 не работает правильно с командой openssl?

Я использую следующую команду:

echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad | xxd 

и вывод:

0000000: bdb1 7f03        .... 

сейчас, если я пытаюсь сделать то же самое с этим интернет-кодер RC4 http://www.fyneworks.com/encryption/rc4-encryption/index.asp выход равен: DA EA 54 65

Разный выход, с теми же данными и одним и тем же ключом? Данные: «test» key: «test»

Также я проверил небольшую программу, которую я закодировал на C, а выход такой же, что и в онлайн-кодировщике ... так что вопрос в том, что я ' m делать неправильно с командой openssl ??

Спасибо!

ответ

11

RC4 имеет ключи переменной длины, а утилита Encryption OpenSSL заставляет вас выбирать размер ключа. Эти другие реализации, которые вы тестируете, не допускают таких ограничений, поэтому ваши ключи не совпадают.

documentation для утилиты enc описывает допустимые размеры ключей для шифра:

rc4    128 bit RC4 
    rc4-64    64 bit RC4 
    rc4-40    40 bit RC4 

Так RC4 работает только на ключом 128 бит (16 байт). Кроме того, опция -k означает получение ключа от данной кодовой фразы. Он делает это внутренне, используя функцию EVP_BytesToKey, которая реализует функцию деривации ключа (KDF).

В любом случае, длинный рассказ, ваши реализации RC4 не используют один и тот же ключ. Используйте опцию -p иметь OpenSSL печатать фактический ключ, который он использует:

$ echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad -p 
key=098F6BCD4621D373CADE4E832627B4F6 

Далее, так как он ожидает ключи 16 байт, это будет ноль-пэды коротких ключей, даже если указать короткий ключ с -K (верхний регистр). Вы можете использовать xxd найти ASCII шестнадцатеричные значения «тест» и -p снова, чтобы увидеть ключ OpenSSL в:

$ echo -ne "test" | xxd 
0000000: 7465 7374        test 
$ echo -ne "test" | openssl rc4 -K 74657374 -nosalt -e -nopad -p 
key=74657374000000000000000000000000 

Таким образом, вы должны соответствовать длины ключа и указать ключ шестигранный значение с опцией -K и вы будете см. реализации RC4, эквивалентны. Например, здесь я использую RC-40, чтобы ограничить длину ключа до 5 байтов и использовать 5-байтовые «тесты» или 74 65 73 74 73.

$ echo -ne "test" | openssl rc4-40 -K 7465737473 -nosalt -e -nopad | xxd 
0000000: dd9b 5cb9 

Вы обнаружите, что ваша веб-реализация получает тот же результат при предоставлении ключевых «тестов».

Смежные вопросы