2013-07-26 160 views
0

我一直在使用下面的代碼在我的應用程序在過去的一年,並使用此代碼有20萬的記錄:如何在ruby中重構OpenSSL pkcs5_keyivgen?

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" } 
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm]) 
cipher.send(:encrypt)  
cipher.pkcs5_keyivgen(options[:key]) 
result = cipher.update(options[:value]) 
result << cipher.final 
# => "x\xED\x14s\xFD\x0E\x97\xC5\x996[M\x1E\x94\xDEI" 

我需要(通過企業)要重構pkcs5_keyivgen部分,正確地做到這一點:對於例如,

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" } 
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm]) 
cipher.send(:encrypt) 
cipher.key = '' # ??? 1) How does pkcs5_keyivgen in above code generate key, or does it just use my options[:key] 
cipher.iv = '' # ??? 2) How does pkcs5_keyivgen in above code generate iv 
result = cipher.update(options[:value]) 
result << cipher.final 

我必須弄清楚如何pkcs5_keyivgenkeyiv。想法在這裏?我們正在使用ruby-1.9.3-p286和加密器-1.1.3

我看到this questionthis question,但他們沒有幫我解決問題。

+0

我不知道爲什麼這是建議關閉?這是一個編程問題?你能否提供反饋意見,爲什麼你會倒下,所以我可以改善這個問題。謝謝。 – Kamilski81

回答

3

試圖解決這個問題,但我認爲沒有簡單的解決方案,或者我只是看不到一個)。 Pkcs5_keyivgen()已被棄用並實現非標準通密鑰導出用於AES 256

從這docs和這個source code

Pkcs5_keyivgen (pass, SALT = nil, num = 2048, digest = "MD5") -> nil 

生成從鹽和傳遞一些密鑰和IV。你的情況沒有鹽。生成方法在v1.5 PKCS #5(已棄用)中定義

因此您正在尋找「基於密碼的密鑰推導函數」。 PBKDF1

Pkcs5_keyivgen()函數從Openssl的調用EVP_BytesToKey()EVP_BytesToKey()non-standard way

所以MD5生成大小的哈希EVP_MAX_MD_SIZE (16 + 20) // 16爲MD5

但是AES key(32) + IV(16) sizes > EVP_MAX_MD_SIZE,所以AES 256產生用於較大的密鑰尺寸密鑰字節將需要多個哈希來生成隨機密鑰和IV。這裏是算法的source code用C

這裏是的EVP_BytesToKey()

不錯pseudo-code explanation如果你真的想在這裏重新實現PBKDF1也RTC2898 standard for PBKDF1 但我不認爲這是個好主意自己實施加密

+0

令人驚歎的反饋。我試圖對此進行反向工程的真正原因是因爲我需要在Python程序中使用它,並且聽起來像我可能必須以標準方式重新實現我的ruby,然後在python中以標準方式執行它。 – Kamilski81

+0

[OpenSSL 1.1.0c更改了摘要算法](http://stackoverflow.com/q/39637388/608639)在某些內部組件中使用。以前使用MD5,1.1.0切換到SHA256。請注意,這些更改不會影響'EVP_BytesToKey'和像'openssl enc'這樣的命令。 – jww