2011-08-25 60 views
0

我有一些測試數據鍵/文本/從API提供者加密,現在我試圖用下面的函數產生相同的加密結果,但是我的結果從最後16位提供的結果中轉移241位數字。你有什麼想法,原因可能是什麼? 我保證,'bf-ecb'是正確的模式,並嘗試使用url編碼,但目前爲止沒有成功。紅寶石河豚在最後幾位的差異

require 'openssl' 

def encrypt(key, data) 
    cipher = OpenSSL::Cipher::Cipher.new('bf-ecb').send(:encrypt) 
    cipher.key = key 
    result = cipher.update(data) << cipher.final 

    hexed = '' 
    result.each_byte { |c| hexed << '%02x' % c } 
    hexed.upcase 
end 

UPDATE

還試圖解密的OpenSSL的::密碼:: CipherError 「壞解密」

回答

1

這確實是填充問題。我解決它並自己實現它。 到目前爲止它的工作。

這是它的樣子:

require 'openssl' 

def encrypt(key,data) 
    cipher = OpenSSL::Cipher::Cipher.new "bf-ecb" 
    cipher.padding = 0 
    cipher.key = key 
    cipher.encrypt 
    enhex(cipher.update padd data) 
end 
def decrypt(key,data,len) 
    cipher = OpenSSL::Cipher::Cipher.new "bf-ecb" 
    cipher.padding = 0 
    cipher.key = key 
    cipher.decrypt 
    (cipher.update dehex(data)).slice(0,len) 
end 
def enhex(data) 
    hexed = '' 
    data.each_byte { |c| hexed << '%02x' % c } 
    hexed.upcase 
end 
def dehex(data) 
    data.scan(/../).map{ |b| b.to_i(16) }.pack('C*') 
end 
def padd(data) 
    data + " "*(8 - (data.length % 8)) 
end 
3

如果示例結果導致你最後的16位(= 128位)是不正確的,然後最後一個區塊可能存在問題。可能這是一個填充問題,你的加密是使用一種填充形式,而你的解密期望有一個不同的填充。我建議你明確指定兩邊的填充。 PKCS5或PKCS7是通常的選擇。錯誤的填充也將解釋「錯誤的解密」錯誤消息。

0

你可以簡單地做ECB加密模式的Blowfish加密就像這樣:

def blowfish_encrypt(key,data) 
    cipher = OpenSSL::Cipher::Cipher.new("bf-ecb").send :encrypt 
    cipher.key = key 
    cipher.update(data) << cipher.final 
end 

而你並不需要關心填充在這種情況下。