AES / CBC / PKCS5Padding加密在java解密ruby中 [英] AES/CBC/PKCS5Padding encrypt in java decrypt in ruby
问题描述
我正在尝试加密java中的数据并解密ruby中的数据。
I am trying to encrypt data in java and decrypt data in ruby.
我发现几乎相同的问题,但我的情况略有不同。
I found almost same asks, but my case is little bit different.
< a href =https://stackoverflow.com/questions/6475469/aes-cbc-encrypt-in-java-decrypt-in-ruby>用Java加密AES / CBC,用Ruby解密
我的代码是...
加密java
My code is ... Encrypt in 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中解密(加密字符串)
and I hope to decrypt (encrypted string) in Ruby
Ruby代码是...(得到错误)
Ruby code is ...(got error)
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代码。
I think the problem is cipher.padding and type of key/iv. But I don't know exactly how to complete ruby code.
请告诉我如何填写此代码。
Please let me know How to complete this code.
谢谢。
推荐答案
您的Ruby代码存在两个问题。
There's two problems with your Ruby code.
首先,当您使用AES 128时,您使用的是AES 256. Java根据您使用的密钥大小使用AES 128或256,并且您使用的是128位密钥。
First, you're using AES 256 when you should be using AES 128. Java uses AES 128 or 256 based on the size of the key you use, and you're using a 128 bit key.
其次,你需要Hex解码你的键
, iv $ c $ Ruby中的c>和
encrypted_string
值。 OpenSSL Cipher期待二进制,而不是十六进制字符串。
Second, you need to Hex decode your key
, iv
, and encrypted_string
values in Ruby. OpenSSL Cipher is expecting binary, not hex strings.
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"}
这篇关于AES / CBC / PKCS5Padding加密在java解密ruby中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!