【问题标题】:AES/CBC/PKCS5Padding encrypt in java decrypt in rubyAES / CBC / PKCS5Padding在java中加密在ruby中解密
【发布时间】:2013-08-27 09:53:01
【问题描述】:

我正在尝试在 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 和 key/iv 的类型。 但我不知道如何完成 ruby​​ 代码。

请告诉我如何完成此代码。

谢谢。

【问题讨论】:

    标签: java ruby aes


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多