Dlaczego istnieje różnica w szyfrowaniu blowfish między Crypt :: CBC (perl) a OpenSSL (ruby)?Różnica w szyfrowaniu blowfish między perl i ruby
Perl
use Crypt::CBC;
my $cipher = Crypt::CBC->new(-key => 'length32length32length32length32', -cipher => 'Blowfish');
my $ciphertext = $cipher->encrypt_hex('test');
# ciphertext is 53616c7465645f5f409c8b8eb353823c06d9b50537c92e19
Ruby
require "rubygems"
require "openssl"
cipher = OpenSSL::Cipher::Cipher.new("bf-cbc")
cipher.encrypt
cipher.key = "length32length32length32length32"
result = cipher.update("test") << cipher.final
ciphertext = result.unpack("H*").first
# ciphertext is 16f99115a09e0464
Crypt :: CBC wydaje się być poprzedzenie Salted__
do wyjścia domyślnie. Czy możesz wyjaśnić, co się dzieje, co jest tak różne od tych? Czy istnieje sposób na zachowanie OpenSSL w podobny sposób jak Crypt :: CBC?
Skrypt Perla generuje różne wyniki za każdym razem, gdy jest uruchamiany. 8 bajtów na wyjściu po "Solted__" to sól, której moduł użył do zaszyfrowania tekstu (nie wiem, czy ta informacja jest pomocna). – mob
@mob: To faktycznie wyjaśnia to. To wektor inicjujący. W przeciwnym razie dane wejście zawsze szyfruje do tego samego, co ujawnia informacje. Joepestro, prawdopodobnie jest to pod pojęciem "dlaczego wymyślasz swój własny protokół kryptograficzny" – derobert