当前位置: 首页 > 面试题库 >

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

罗昱
2023-03-14
问题内容

我正在尝试在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代码有两个问题。

首先,应该使用AES 128时使用的是AES256。Java根据所用密钥的大小使用AES 128或256,并且使用128位密钥。

其次,你需要为十六进制解码你的keyiv以及encrypted_string在Ruby中值。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"}


 类似资料:
  • 问题内容: 我正在尝试在NodeJs中解密。它在Java中工作。但是我无法在Node中实现相同的功能。 节点版本:8.4 请找到我的NodeJs代码: 请找到有效的Java解密代码 我得到了不同的解密文本。在NodeJ中,我无法获得与Java中相同的结果。另外,我无法修改Java加密代码。所以我必须弄清楚Node中的解密。 你能帮我这个忙吗? 问题答案: 这是Java和Node.js中的完整示例,

  • 我有一些问题,解密文本的CryptoJS已经用Java加密。解密应使用AES/CBC/PKCS5Padding完成。加密的字符串是base64编码的,我在尝试解密字符串之前对其进行解码。 这就是Java代码的样子:

  • 我正在加密我的Android应用程序中的一些数据,然后这些数据被发送到一个PHP页面进行解密和处理。 这有帮助吗?

  • 这是提供的文件:- 加密算法 为了在传输和发布数据时减轻参数调整/修改,商家可以使用Telenor PoC提供的散列密钥加密请求。该加密请求与主请求一起发送,然后在OPS端对主请求进行协调,以检测参数是否更改。加密可以使用以下算法完成: Put(“StoreID”,“28”); Fields.Put(“OrderRefNum”,“11001”); Fields.Put(“ExpiryDate”,“

  • 我正在开发一个功能,需要Aes加密(Aes/CBC/PKCS5Padding)密码文本从客户端发送到后端有ASP.NET的服务器。 我在服务器端有一个解密功能如下: 我包含了用于SHA-256和AES密码计算的CryptoJS库。下面是我实现的代码。 问题是,编码后的字符串不能解密回其以前的形式。我认为客户端的加密逻辑和服务器端的解密逻辑存在一定的不匹配。 当我将CryptoJS加密密码传递给ja

  • 我使用JavaAPI生成128bit密钥。下面是我使用的算法: 我可以通过这些方法轻松地使用secretKey加密和解密消息。由于Java默认使用128bit AES加密,因此它使用SHA1生成原始密钥的哈希,并将哈希的前16字节用作AES中的密钥。然后以十六进制格式转储IV和密文。 但是,它返回一个空字符串。