如何在CBC模式和PKCS7填充中解码使用AES-256加密的数据?

女人:

我们正在使用下面的Java代码解密在CBC模式和PKCS7填充中使用AES-256加密的数据。

Java代码:

import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import java.security.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;


public class AES256 {

    private static byte[] initVector = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public String decrypt (String encryptedDataBase64, String keyBase64)
    {
       try {
           Security.setProperty("crypto.policy", "unlimited");
           IvParameterSpec ivSpec = new IvParameterSpec(initVector);  // Get the init vector

           // Get the Base64-encoded key
           byte[] key = Base64.decodeBase64(keyBase64.getBytes("UTF-8"));
           Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");  // AES / CBC / PKCS5 padding
           SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
           cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
           byte[] encryptedData = Base64.decodeBase64(encryptedDataBase64.getBytes("UTF-8"));
           byte[] decryptedData = cipher.doFinal(encryptedData);

           return new String(decryptedData);
       }
       catch (Exception e) {
           logger.error("AES256 Decrypt: Decryption exception: "+ e.getMessage());
           return null;
       }
    }
}

现在我们需要将解密逻辑转换为Javascript,因为我们的应用程序正在发送标头中的加密数据,同时从服务器请求index.html。我尝试使用Crypto.js解密,但是我得到的解码字符串为空。以下是我尝试使用的Javascript代码。

var key = CryptoJS.enc.Base64.parse(keyBase64);
var data = CryptoJS.enc.Base64.parse(encryptedDataBase64);
var dec_data = CryptoJS.AES.decrypt(data, key);

dec_data即将为空。

在此处输入图片说明

在阅读了一些关于栈溢出的问题后,我尝试了一下。有人可以让我知道代码中是否有错误。

迈克尔·菲尔(Michael Fehr):

不幸的是,您没有提供任何示例数据来测试您的环境,因此我设置了自己的值。使用此值:

ciphertext = rjygE0TjIqiQ4ETnpszoieRWzaSD+9oINf1c748VcL/3zD5AazSFomx4paeanihz
keyBase64 = MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=
ivBase =  AAAAAAAAAAAAAAAAAAAAAA==

我在Java上得到了这个解密结果:

The quick brown fox jumps over the lazy dog

在Javascript端,我的代码收到了相同的结果:

decrypted (str): The quick brown fox jumps over the lazy dog

可以在此处进行实时测试-Java:https//paiza.io/projects/e/dHG73CRgJojOOfLxtvJjtg和Javascript:https//playcode.io/672463

请注意,我的代码没有异常处理,仅用于教育目的。此外,您的代码是不安全的,因为它使用了静态(固定)键和初始化向量。

Java代码(随着我使用内置在Base64编码器中的Java 11的改变,):

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Base64;

public class Main {

    private static byte[] initVector = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println("How to decode data encrypted using AES-256 in CBC mode and PKCS7 padding");
        String plaintext = "The quick brown fox jumps over the lazy dog";
        byte[] key = "12345678901234567890123456789012".getBytes("UTF-8");
        String keyBase64 = Base64.getEncoder().encodeToString(key);
        System.out.println("keyBase64: " + keyBase64);
        String ivBase64 = Base64.getEncoder().encodeToString(initVector);
        System.out.println("initVector: " + ivBase64);
        String ciphertext = "rjygE0TjIqiQ4ETnpszoieRWzaSD+9oINf1c748VcL/3zD5AazSFomx4paeanihz";
        System.out.println("ciphertext: " + ciphertext);
        String decryptedtext = decrypt(ciphertext, Base64.getEncoder().encodeToString(key));
        System.out.println("decryptedtext: " + decryptedtext);
    }

    public static String decrypt (String encryptedDataBase64, String keyBase64)
    {
        try {
            Security.setProperty("crypto.policy", "unlimited");
            IvParameterSpec ivSpec = new IvParameterSpec(initVector);  // Get the init vector
            // Get the Base64-encoded key
            byte[] key = Base64.getDecoder().decode(keyBase64.getBytes("UTF-8"));
            //byte[] key = Base64.decodeBase64(keyBase64.getBytes("UTF-8"));
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");  // AES / CBC / PKCS5 padding
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
            byte[] encryptedData = Base64.getDecoder().decode(encryptedDataBase64.getBytes("UTF-8"));
            //byte[] encryptedData = Base64.decodeBase64(encryptedDataBase64.getBytes("UTF-8"));
            byte[] decryptedData = cipher.doFinal(encryptedData);
            return new String(decryptedData);
        }
        catch (Exception e) {
            System.out.println("AES256 Decrypt: Decryption exception: "+ e.getMessage());
            //logger.error("AES256 Decrypt: Decryption exception: "+ e.getMessage());
            return null;
        }
    }
}

JavaScript代码:

let keyBase64 = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=';
let ivBase64 = 'AAAAAAAAAAAAAAAAAAAAAA==';
let iv = CryptoJS.enc.Base64.parse(ivBase64);
let secret_key = CryptoJS.enc.Base64.parse(keyBase64);
ciphertext = 'rjygE0TjIqiQ4ETnpszoieRWzaSD+9oINf1c748VcL/3zD5AazSFomx4paeanihz';
console.log('ciphertext: ', ciphertext);
var decrypted = CryptoJS.AES.decrypt(ciphertext, secret_key,{
  iv: iv,
  padding: CryptoJS.pad.Pkcs7,
  mode: CryptoJS.mode.CBC,
});
console.log('decrypted (str): ', CryptoJS.enc.Utf8.stringify(decrypted).toString());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法于在Java中使用AES-GCM-256加密在解密节点数据

使用Java中的co_aes256_algorithm_pem解密SAP中加密的数据

如何使用CBC实现Java 256位AES加密

无法在Java和PHP之间交换使用AES-256加密的数据

来自PHP的自定义AES-256-CBC加密的Java解密数据

带有PKCS7填充编码数据的AES 256具有一半ECB和一半CBC块

Java使用aes256 / CBC / PKCS7Padding加密文件

.net Framework 4.7中是否可以使用AES(256位)GCM模式加密数据?

数据帧中列的AES 256加密

如何使用AES 256实现Fernet加密

如何从Hashbytes函数的SHA2_256加密数据类型转换为SQL Server 2012中的varchar(256)

如何在JAVA或SCALA中使用AES 256 CBC提取enc加密数据?

如何在Crypto ++中使用RSA OAEP SHA-256加密/解密数据

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

如何在Dart中使用PKCS5填充密钥生成256-AES CBC密钥

使用C加密的数据的JavaScript AES 256解密问题

无法在使用Swift CryptoKit加密的NodeJS中解密数据-AES-256-GCM

如何在Linux中不创建未加密文件的情况下读取openssl aes-256-cbc加密文件?

Node.js加密密码Aes256最大数据大小

如何使用OpenSSL加密/解密AES-256 CBC?

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

无法在C#bouncycastle和PHP openssl之间交换AES-256-CBC / PKCS7

使用 C# 解码 PKCS7 SMIME 数据

使用 AES/CBC/PKCS7Padding 加密/解密

如何在python中使用加密的RSA私钥(AES-256-CBC)对数据进行签名

我正在使用 AES ECB 256 填充 - 加密发送数据,但我无法实现解密

如何使用已生成的 AES 256 GCM 96 密钥(来自 Hashicorp Vault)加密数据?

Snowflake 表中的数据是使用 AES 256 位还是 128 位自动加密的?

Node.JS 使用 MD5/ECB 和填充 w/PKCS7 加密