2011-11-09 5 views
7

Crypt :: CBC(perl)とOpenSSL(ruby)の間でブローイングの暗号化に違いがあるのはなぜですか?perlとrubyの間のブロッホ暗号の相違点

Perlの

use Crypt::CBC; 

my $cipher = Crypt::CBC->new(-key => 'length32length32length32length32', -cipher => 'Blowfish'); 
my $ciphertext = $cipher->encrypt_hex('test'); 

# ciphertext is 53616c7465645f5f409c8b8eb353823c06d9b50537c92e19 

ルビー

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 

墓所:: CBCは、デフォルトでは出力にSalted__を付加しているようです。あなたはこれらの間でそれほど異なることが起こっていることを説明できますか? OpenSSLをCrypt :: CBCと同じように動作させる方法はありますか?

+2

Perlスクリプトは、実行するたびに異なる出力を生成します。 "Salted__"の後の出力の8バイトは、モジュールがテキストを暗号化するために使用した塩です(この情報が役立つかどうかわかりません)。 – mob

+0

@mob:それは実際にそれを説明します。これは初期化ベクトルです。そうでなければ、与えられた入力は常に同じことを暗号化し、情報を公開します。 Joepestro、これはおそらく "なぜあなた自身の暗号プロトコルを発明しているのですか? – derobert

答えて

7

Crypt :: CBC(perl)が独自のmet塩と初期化ベクトルを無作為化することができます。 Blowfishの場合は、上記のように56の鍵長を使用します。あなたの例からPerlコードを使用して

Perlの

use Crypt::CBC; 

my $cipher = Crypt::CBC->new(-key => 'length32length32length32length32', -cipher => 'Blowfish'); 
my $ciphertext = $cipher->encrypt_hex('test'); 
# 53616c7465645f5f409c8b8eb353823c06d9b50537c92e19 

使用してこのルビー(OpenSSLを)復号化するためには、鍵と初期化ベクトルを抽出するために少し調整が必要です。

ルビー

require 'openssl' 

# Hex string to decode(from above) 
string = '53616c7465645f5f409c8b8eb353823c06d9b50537c92e19' 

# Pack Hex 
string = [string].pack('H*') 

# Some Config 
pass = 'length32length32length32length32' 
key_len = 56; 
iv_len = 8; 
desired_len = key_len + iv_len; 
salt_re = /^Salted__(.{8})/ 

#Extract salt 
salt = salt_re.match(string) 
salt = salt.captures[0] 
data = ''; 
d = ''; 
while (data.length < desired_len) 
    d = Digest::MD5::digest("#{d}#{pass}#{salt}"); 
    data << d; 
end 

#Now you have extracted your key and initialization vector 
key = data.slice(0..key_len-1) 
iv = data.slice(key_len .. -1) 

# Trim string of salt 
string = string[16..-1] 

cipher = OpenSSL::Cipher::Cipher.new "bf-cbc" 
cipher.decrypt 
cipher.key_len = key_len 
cipher.key = key 
cipher.iv = iv 

puts cipher.update(string) << cipher.final 
# test 
1

ブローキーのサイズは、これらの2つのデフォルト値が異なります。 OpenSSLのデフォルト値は16、Crypt :: Blowfishのデフォルト値は56です。

-keysize => nでCrypt :: CBCのキーサイズを上書きすることはできますが、残念ながらOpenSSLのキーサイズを上書きする方法はありません。 16のバイトのBlowfishキーサイズに

OpenSSLライブラリのデフォルトは、[-keysize => 16

http://metacpan.org/pod/Crypt::CBC

のPerl(キーサイズを指定)を設定することを望むかもしれないのOpenSSLとの の互換性のためになります

my $cipher = Crypt::CBC->new( 
    -key => 'length32length32length32length32', 
    -keysize => 16, 
    -cipher => 'Blowfish' 
); 
関連する問題