2011-08-23 99 views
1

我是相當新的加密和解密,所以請原諒我在主題方面的知識不足。使用Ruby解密PHP加密字符串

我想解密Ruby中的字符串。該字符串是從使用MCRYPT_RIJNDAEL_128在PHP中進行加密的服務器中讀取的。我有代碼解密它在PHP中工作,我試圖將其轉換爲Ruby。我需要使用Rhodes(Ruby中的移動應用程序框架)進行身份驗證。

這是PHP端解密的代碼片段。

$key = "This is a test key"; 

    $string2 = hex2bin($string); // The encrypted string 

    $iv = '1111F321414LOJL018473914DSADAS'; // Just given a random Initialisation vector for the example 

    $encrypted = mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $string2, MCRYPT_DECRYPT, $iv); 

function hex2bin($str) { 
    $bin = ""; 
    $i = 0; 
    do { 
     $bin .= chr(hexdec($str{$i}.$str{($i + 1)})); 
     $i += 2; 
     } while ($i < strlen($str)); 
    return $bin; 
} 

hex2bin是一種將十六進制轉換爲二進制的函數。

到目前爲止,我的失敗嘗試是使用Ruby提供的crpt:rijndael庫進行解密。

key = "This is a test key" 
rd = Crypt::Rijndael.new(key, 128, 128) 
string = @params['body'] // The encrypted string 
encrypted_string = hex2bin(string) 
decrypted_string = rd.decrypt_block(encrypted_string) 

def hex2bin(str) 
    bin = "" 
    i = 0 
    begin 
    bin = bin + ((str[i]+str[i+1]).hex).chr 
    i = i+2 
    end while i<str.length 
    return bin 
end 

我收到一個錯誤,說「應用程序錯誤:塊必須是16個字節長」。我嘗試添加代碼以使其接受來自http://pastebin.com/m1rsJUXM的初始化向量。我仍然得到同樣的錯誤。任何形式的幫助或方向將不勝感激。

問候,

回答

1

看你的PHP代碼,你似乎可以用128位Rijndael算法在CBC模式具有顯式IV和未規定的填充。最好明確指定填充,通常是PKCS5或PKCS7。鑑於你的錯誤信息是在談論你的一個塊不是16字節長,那麼我會傾向於首先懷疑填充問題。您的明文的最後一個塊可能未被填充到下一個塊邊界,因此它將缺少所需的16個字節,因此會出現錯誤消息。

除此之外,您還需要確保在Ruby代碼中指定CBC模式,以便它與PHP代碼匹配,並且在兩個系統上的字節級別上的密文,密鑰和IV都相同。轉換字符串和從字符串轉換可能會導致差異,從而導致問題。這是我對你的塊大小問題的第二個想法。如果將密碼字節從字節轉換爲字符串並再次轉換爲字節將改變密文的長度,那麼您將得到相同的錯誤消息。

+0

嘿,謝謝你的回答。這個Ruby庫(crypt)只有一種模式,那就是CBC。我嘗試使用CBC模塊中名爲decrypt_string()而不是decrypt_block()的函數,並且似乎已經擺脫了錯誤。然而,解密的字符串仍然不是我所期望的。我會根據你的建議嘗試改變。 感謝您的幫助。乾杯。 –