2012-11-05 90 views
3

我從以下C#加密碼開始,並且想用Ruby解密。我的問題是我不知道如何在Ruby/OpenSSL中設置填充模式。我特別需要使用PKCS7如何使用Ruby/OpenSSL解密/加密設置填充模式?

C#加密

System.Security.Cryptography.Aes c = new System.Security.Cryptography.AesManaged(); 
c.Mode = CipherMode.CBC; 
c.Padding = PaddingMode.PKCS7; # <-- how to set this in Ruby world? 
c.KeySize = 256; 
c.BlockSize = 128; 
c.Key = key; 
c.IV = iv; 
... 

紅寶石解密

d = OpenSSL::Cipher.new('AES-128-CBC') # oops, this should have been AES-256-CBC 
d.decrypt 
d.key = key 
d.iv = iv 
... 
我目前使用的 Ruby 1.9.2,但可以使用任何必要的版本

回答

3

構造函數參數實際上讀取的是<name>-<key length>-<mode>,所以首先,您可能要使用AES-256-CBC才能使用256位密鑰。 [source]

無論如何,AES塊大小固定爲128位,因此您無需調整此參數。 [source]

此外,Ruby似乎默認使用PKCS7 Padding,因此無需調整它。 [source]

因此,你要善於去只有

c = OpenSSL::Cipher.new('AES-256-CBC') 
c.key = key 
c.iv = iv 
+0

你的答案感謝。我已經按照你的建議更改了密碼,並且解密*似乎已經成功了,儘管我實際上還沒有證實,因爲我現在正在對解密數據進行膨脹問題(可能是'C#'和'Ruby'之間的問題re:'Zlib'放氣和充氣)。無論如何,關於Ruby的默認填充,我發現[一個SO回答說PKCS5是默認的](http://stackoverflow.com/a/12611287/664833)。 [文檔](http://www.ruby-doc.org/stdlib-1.9.2/libdoc/openssl/rdoc/OpenSSL/Cipher.html)對此詳細信息(或者至少我沒有找到它)。 – user664833

+1

Wiki上關於填充的文章說:「PKCS5填充與PKCS7相同,只是技術上它只能用於填充64位塊,實際上兩者可以互換使用。」 (http://en.wikipedia.org/wiki/Padding_(cryptography))所以AES根據定義不能使用PKCS5填充,因爲塊大小固定爲128(> 64) –

+1

對於某些人(如我)如果這個答案更新,包括如何指定填充和其他參數在紅寶石。謝謝您的回答 –