2015-11-14 53 views
1

一方面我有一個文本加密/解密Perl的Crypt::CBC使用Python PyCrypto Perl的地穴:: CBC

my $key = 'key to the gates'; 
my $cipher = Crypt::CBC->new(
    -key => $key, 
    -cipher => 'Blowfish', 
    -salt => '12341234' 
); 

在另一邊我有Python的PyCrypto,我需要從Perl的數據進行解碼,而且還會發送Perl密碼在加密時可以讀取的文本。

我有來自Perl程序的密鑰,以及來自Perl的encrypt_hex:ed密碼短語發送到Python系統。

但是Python的似乎是絕對要擁有四做的工作

cipher = Blowfish.new(self.key, Blowfish.MODE_CBC, self.iv) 
     return hexlify(cipher.encrypt(raw)) 

然而,Crypt::CBC documnetation似乎表明IV在那裏已經

「鹽」 - 將密碼與一個8字節的隨機值組合到 中,同時生成分組密碼密鑰和 提供的密碼短語中的IV。該鹽將被附加到數據流的開頭的 ,允許解密爲 在給定正確的 密碼短語的情況下重新生成密鑰和IV。

是否有任何方法通過PyCrypto從密鑰/密碼中提取IV?還是IV必須以某種方式單獨發送?

這可能是一個天真的問題,但我不會每天都這樣工作。

我知道我可以從Perl方面得到IV,但如果可能的話,我真的想在Python方面提取它。

+0

對不起,您不喜歡我的編輯,但請記住,您的問題的主要目的以及您可能提供的任何解決方案都是爲了幫助其他有類似問題的人員,這意味着主題行應該有助於引導那些人朝這個頁面。 – Borodin

+0

哎呀!我在這裏是新來的,不知道其他人可以編輯你的帖子,所以我認爲我做了一些並試圖回滾。現在我知道了,如果你喜歡,歡迎你重新編輯;) – bobdobalina

回答

2

Crypt::CBC聲稱OpenSSL兼容性。這意味着它執行OpenSSL專用BytesToKey基於密碼的密鑰導出函數(PBKDF)。在這個推導過程中,IV也被計算出來。因此,您爲Crypt::CBC提供的密鑰實際上被視爲密碼。

您必須查找EVP_BytesToKey的實現並將其集成到您的程序中。您可以使用此代碼from GitHub開始:

def bytes_to_key(data, salt="12345678"): 
    # Simplified version of M2Crypto.m2.bytes_to_key(). Based on: 
    # https://github.com/ajmirsky/M2Crypto/blob/master/M2Crypto/EVP.py#L105 
    # http://stackoverflow.com/questions/8008253/c-sharp-version-of-openssl-evp-bytestokey-method 
    assert len(salt) == 8, len(salt) 
    data += salt 
    key = md5(data).digest() 
    key += md5(key + data).digest() 
    return key 

然後在第一個字節爲重點,併爲IV接下來的8個字節。但需要注意的地穴下面的語句:CBC:

如果未指定-keysize,那麼地穴:: CBC將使用的56個字節(448位)的最大長度的Blowfish密鑰大小。

因此,您可能需要多一些key += md5(key + data).digest()調用,因爲md5輸出僅爲128位。