2011-11-09 20 views
7

क्रिप्ट :: सीबीसी (पर्ल) और ओपनएसएसएल (रूबी) के बीच ब्लाफिश एन्क्रिप्शन में कोई अंतर क्यों है?पर्ल और रूबी के बीच ब्लाफिश एन्क्रिप्शन में अंतर

पर्ल

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 

क्रिप्ट :: सीबीसी डिफ़ॉल्ट रूप से उत्पादन के लिए Salted__ prepending जा रहा है। क्या आप समझा सकते हैं कि इनके बीच क्या अंतर है? क्या ओपनएसएसएल क्रिप्ट :: सीबीसी के समान तरीके से व्यवहार करने का कोई तरीका है?

+2

पर्ल स्क्रिप्ट प्रत्येक बार चलाने पर अलग-अलग आउटपुट उत्पन्न करती है। "नमकीन__" के बाद आउटपुट में 8 बाइट नमक हैं जो मॉड्यूल पाठ को एन्क्रिप्ट करने के लिए उपयोग किया जाता है (मुझे नहीं पता कि वह जानकारी सहायक है या नहीं)। – mob

+0

@mob: वह वास्तव में इसे समझाता है। यह प्रारंभिक वेक्टर है। अन्यथा, एक दिया गया इनपुट हमेशा एक ही चीज़ को एन्क्रिप्ट करता है, जो जानकारी का खुलासा करता है। जोएपेस्ट्रो, यह शायद "आप अपने स्वयं के क्रिप्टो प्रोटोकॉल का आविष्कार क्यों कर रहे हैं" के अंतर्गत आता है – derobert

उत्तर

7

क्रिप्ट :: सीबीसी (पर्ल) अपने आप ही का उपयोग करता है पूरा कर चुके हैं नमक और प्रारंभिक वेक्टर यादृच्छिक करने के लिए hod। इसके अलावा ब्लोफिश के मामले में यह उपरोक्त वर्णित 56 की मुख्य लंबाई का उपयोग करता है।

अपने उदाहरण से पर्ल कोड का उपयोग करना:

:

पर्ल

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

इन दोनों के बीच blowfish कुंजी आकार डिफ़ॉल्ट अलग हो जाता है। ओपनएसएसएल 16 पर डिफ़ॉल्ट है, क्रिप्ट :: ब्लॉफिश 56 तक डिफ़ॉल्ट है।

आप क्रिप्ट :: सीबीसी में -keysize => n निर्दिष्ट करके मुख्य आकार को ओवरराइड कर सकते हैं, लेकिन दुर्भाग्यवश ओपनएसएसएल में कुंजी आकार को ओवरराइड करने का कोई तरीका नहीं दिखता है।

16 बाइट ब्लोफिश कुंजी के आकार को openssl पुस्तकालय चूक है, तो openssl साथ संगतता के लिए आप -keysize => 16

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

पर्ल (keysize उल्लेख करें) स्थापित करने के लिए इच्छा हो सकती है

my $cipher = Crypt::CBC->new( 
    -key => 'length32length32length32length32', 
    -keysize => 16, 
    -cipher => 'Blowfish' 
); 
संबंधित मुद्दे