2011-11-09 13 views
7

왜 Crypt :: CBC (펄)와 OpenSSL (루비)간에 복어 암호화가 다른가요?펄과 루비 간의 복어 암호화의 차이

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의 키 길이를 사용합니다. 귀하의 예제에서 펄 코드를 사용

:

이 사용 루비 (OpenSSL을)를 디코딩 할

use Crypt::CBC; 

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

키와 초기화 벡터를 추출하기 위해 약간의 조정이 필요 루비

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

복어 키 크기가 기본값으로 바뀌 었습니다. OpenSSL의 기본값은 16이고 Crypt :: Blowfish의 기본값은 56입니다.

-keysize => n을 지정하여 Crypt :: CBC에서 키 크기를 무시할 수 있지만 불행하게도 OpenSSL의 키 크기를 무시하는 방법은 없습니다.

16 바이트 복어 키 크기로는 OpenSSL 라이브러리의 기본값은, 당신은 -keysize => 16

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

펄 (키 사이즈를 지정) 설정하실 수 있습니다에는 OpenSSL과 호환성을 위해 있도록

my $cipher = Crypt::CBC->new( 
    -key => 'length32length32length32length32', 
    -keysize => 16, 
    -cipher => 'Blowfish' 
);