AES / CBC / PKCS5Padding加密在java解密ruby中

我试图加密java中的数据并解密ruby中的数据。

我发现几乎相同的问题,但我的情况有点不同。

  • 用Ruby加密和用Java解密 – 为什么它不起作用?

  • AES / CBC在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 node = new HashMap(); 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和key / iv的类型。 但我不知道如何完成ruby代码。

请让我知道如何完成此代码。

谢谢。

您的Ruby代码存在两个问题。

首先,当您使用AES 128时,您使用的是AES 256. Java根据您使用的密钥大小使用AES 128或256,并且您使用的是128位密钥。

其次,你需要在Ruby中解码你的keyivencrypted_string值。 OpenSSL Cipher期待二进制,而不是hex字符串。

 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"}