2012-02-17 19 views
8

Potrzebuję zakodować wynik wykonania z RC4. Przed wykonaniem skryptu bash testuję sposób szyfrowania danych.RC4 nie działa poprawnie z poleceniem openssl?

Używam następną komendę:

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

a wyjście jest:

0000000: bdb1 7f03        .... 

Teraz, gdy próbuję zrobić to samo z tego kodera RC4 internetowym http://www.fyneworks.com/encryption/rc4-encryption/index.asp wyjście jest: DA EA 54 65

Różne dane wyjściowe, z tymi samymi danymi i tym samym kluczem? Dane: klucz "test": "test"

Sprawdziłem również z małym programem, który zakodowałem w C, a wynik jest taki sam jak koder online ... więc pytanie brzmi, co ja " m robi się nie tak z poleceniem openssl ??

Dzięki!

Odpowiedz

11

RC4 ma klucze o zmiennej długości, a narzędzie do szyfrowania OpenSSL wymusza wybór rozmiaru klucza. Te inne implementacje, które testujesz przeciw, nie powodują takich ograniczeń, więc twoje klucze nie pasują do siebie.

documentation dla narzędzia enc opisuje dozwolony kluczowych rozmiarach dla szyfru:

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

Więc RC4 działa tylko na klucz 128-bitowy (16 bajtów). Ponadto opcja -k oznacza wyprowadzenie klucza z podanego hasła. Robi to wewnętrznie za pomocą funkcji EVP_BytesToKey, która implementuje funkcję wyprowadzania klucza (KDF).

Krótko mówiąc, twoje wdrożenia RC4 nie używają tego samego klucza. Użyj opcji -p mieć OpenSSL wydrukować rzeczywisty klucz jest za pomocą:

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

Ponadto, ponieważ spodziewa klucze 16-bajtowych, to będzie zero-pad krótszych kluczy, nawet jeśli podać krótki klucz z -K (wielka litera K) opcja. Można użyć xxd znaleźć wartości ASCII hex „test” i -p znowu zobaczyć klucza OpenSSL:

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

Więc trzeba dopasować długości klucza i określić klucz sześciokątny cenie z opcją -K i będziesz zobacz implementacje RC4 są równoważne. Np. Tutaj używam RC-40, aby ograniczyć długość klucza do 5 bajtów i użyć 5-bajtowego klucza "testy" lub 74 65 73 74 73.

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

Przekonasz się, że twoja implementacja webowa osiąga ten sam rezultat, gdy otrzymasz klucz "testy".

Powiązane problemy