2013-08-27 122 views
3

我試圖加密java中的數據並在ruby中解密數據。AES/CBC/PKCS5Padding在java中解密ruby加密

我發現幾乎相同的要求,但我的情況有點不同。

我的代碼... 加密在java中

import java.util.HashMap; 
import java.util.Map; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
import net.sf.json.JSONObject; 
import org.apache.commons.codec.binary.Hex; 

class Crypt { 
    public static void main(String[] args) throws Exception { 
     Map<String, String> node = new HashMap<String, String>(); 
     node.put("timestamp", "1377499097199"); 
     JSONObject jsonObject = JSONObject.fromObject(node); 
     String json = jsonObject.toString(); 
     System.out.println(json); 

     //key 
     String skeyString = "97128424897797a166913557a6f4cc8e"; 
     byte[] skey = Hex.decodeHex(skeyString.toCharArray()); 
     System.out.println("key : " + skeyString); 

     //iv 
     String ivString = "84e8c3ea8859a0e293941d1cb00a39c3"; 
     byte[] iv = Hex.decodeHex(ivString.toCharArray()); 
     System.out.println("iv : " + ivString); 

     //encrypt 
     SecretKeySpec skeySpec1 = new SecretKeySpec(skey, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec1, new IvParameterSpec(iv)); 
     byte[] encrypted = cipher.doFinal(json.getBytes()); 
     String encryptedString = Hex.encodeHexString(encrypted); 
     System.out.println("=============>"); 
     System.out.println("encrypted string: " + encryptedString); 
     } 
} 

結果是

{"timestamp":"1377499097199"} 
key : 97128424897797a166913557a6f4cc8e 
iv : 84e8c3ea8859a0e293941d1cb00a39c3 
=============> 
encrypted string: 395f6c0e8ad27f57c4a5a8975aa633e5b26f288d37ce18c6971779951f3b3527 

,我希望解密(加密的字符串)在Ruby中

Ruby代碼是...(有誤差)

require 'openssl' 

key = "97128424897797a166913557a6f4cc8e" 
iv = "84e8c3ea8859a0e293941d1cb00a39c3" 
encrypted_string = "395f6c0e8ad27f57c4a5a8975aa633e5b26f288d37ce18c6971779951f3b3527" 

de_cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC") 
de_cipher.decrypt 
de_cipher.key = key 
de_cipher.iv = iv 

de_cipher.update(encrypted_string) << de_cipher.final 

我有望獲得

{"timestamp":"1377499097199"} 

但它返回錯誤

`final': bad decrypt (OpenSSL::Cipher::CipherError) 

我認爲問題是cipher.padding和鍵/ iv的類型。 但我不知道如何完成ruby代碼。

請讓我知道如何填寫此代碼。

謝謝。

回答

6

Ruby代碼有兩個問題。

首先,您應該使用AES 128時使用AES 256. Java使用基於您使用的密鑰大小的AES 128或256,並且您使用的是128位密鑰。其次,您需要用十六進制解碼您的Ruby中的keyivencrypted_string值。 OpenSSL Cipher期待二進制,而不是十六進制字符串。

require 'openssl'; 

key = "97128424897797a166913557a6f4cc8e"; 
iv = "84e8c3ea8859a0e293941d1cb00a39c3"; 
encrypted_string = "395f6c0e8ad27f57c4a5a8975aa633e5b26f288d37ce18c6971779951f3b3527"; 

de_cipher = OpenSSL::Cipher::Cipher.new("AES-128-CBC"); 
de_cipher.decrypt; 
de_cipher.key = [key].pack('H*'); 
de_cipher.iv = [iv].pack('H*'); 

puts de_cipher.update([encrypted_string].pack('H*')) << de_cipher.final; 

輸出:

{"timestamp":"1377499097199"} 
+0

請你幫我出加密的紅寶石也或者只是告訴寶石名稱 – VKatz