AES加密未提供预期结果

如何解决AES加密未提供预期结果

我已经解密了一个字符串,它可以正常工作,但是当我尝试加密输出字符串时,不会得到相同的结果。

public static void main(String[] args) {
  // TODO Auto-generated method stub


  String cipherstring = "9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=";
  byte[] cipherByte = Base64.getDecoder().decode(cipherstring);
  String cum006333 = decrypt(cipherstring,"KEY@CRISIL123");
  System.out.println("decrpted output:  " + cum006333);
  String enc = encrypt(cum006333,"KEY@CRISIL123");
  System.out.println("encrpted output:  " + enc);

}

public static String decrypt(String cipherText,String passphrase) {
  String s = null;
  try {
    System.out.println("decrpted input :  " + cipherText);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    byte[] bytes = Base64.getDecoder().decode(cipherText);
    int keySize = 256;
    int iterCount = 1000;
    int ivLength = 16;
    byte[] saltByte = new byte[] {
      0x49,0x76,0x61,0x6e,0x20,0x4d,0x65,0x64,0x76
    };
    // KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),saltByte,iterCount,(keySize + (8 * ivLength))); // 32 + 16
    KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),(keySize + 128)); // 32 + 16
    byte[] rawKey = factory.generateSecret(spec).getEncoded(); // 48 bytes
    byte[] keyDerived = Arrays.copyOf(rawKey,(keySize / 8)); // first 32 bytes
    byte[] ivB = Arrays.copyOfRange(rawKey,(keySize / 8),rawKey.length); // last 16 bytes
    SecretKey key = new SecretKeySpec(keyDerived,"AES");
    IvParameterSpec iv = new IvParameterSpec(ivB);
    cipher.init(Cipher.DECRYPT_MODE,key,iv);
    //byte[] original = cipher.doFinal(data);
    byte[] original = cipher.doFinal(bytes);
    s = new String(original,StandardCharsets.UTF_16LE);


  } catch (Exception ex) {
    ex.printStackTrace();
  }
  return s;
}
public static String encrypt(String cipherText,String passphrase) {
  String s = null;
  try {
    System.out.println("encrypted input :  " + cipherText);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    // byte[] bytes = Base64.getDecoder().decode(cipherText);
    cipherText = new String(cipherText.getBytes(),StandardCharsets.UTF_16LE);
    int keySize = 256;
    int iterCount = 1000;
    int ivLength = 16;
    byte[] saltByte = new byte[] {
      0x49,0x76
    };
    KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),(keySize + (8 * ivLength))); // 32 + 16
    // KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),"AES");
    IvParameterSpec iv = new IvParameterSpec(ivB);
    cipher.init(Cipher.ENCRYPT_MODE,iv);
    //byte[] original = cipher.doFinal(data);
    byte[] original = cipher.doFinal(cipherText.getBytes());

    s = Base64.getEncoder().encodeToString(original);
    //s = new String(original,StandardCharsets.UTF_16LE);
  } catch (Exception ex) {
    ex.printStackTrace();
  }
  return s;
}

当前输出

decrpted input :  9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=
decrpted output:  CUM006333
encrypted input :  CUM006333
encrpted output:  YVhOFyq9PAOkegIFDR/Ojw==

预期产量

decrpted input :  9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=
decrpted output:  CUM006333
encrypted input :  CUM006333
encrpted output:  9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=

解决方法

这个答案无非就是将 @Topaco 中的评论纳入代码,因此所有荣誉归他所有。

请注意我的安全警告-将PBKDF2迭代次数增加到至少10000,并且不要使用静态盐。

我更改了一些表示法,以便变量获得它们正在命名的数据,并且将短例程更改为常规行为(采用plainText,对其进行加密,然后对其进行解密)。

输出与预期的一样:

plaintext input :  CUM006333
encrypted output:  9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=
decrypted input :  9AnBHCNAZkfJiY5DW+DwtHVGDmJtTwU4G3yg3JLeELc=
decrypted output:  CUM006333

完整代码:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;

public class MainSo {
    public static void main(String[] args) {
        // https://stackoverflow.com/questions/64386104/aes-encryption-not-giving-expected-result
        String plainText = "CUM006333";
        String passphrase = "KEY@CRISIL123";
        String enc = encrypt(plainText,passphrase);
        System.out.println("encrypted output:  " + enc);
        String dec = decrypt(enc,passphrase);
        System.out.println("decrypted output:  " + dec);
    }

    public static String decrypt(String cipherText,String passphrase) {
        String s = null;
        try {
            System.out.println("decrypted input :  " + cipherText);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            byte[] bytes = Base64.getDecoder().decode(cipherText);
            int keySize = 256;
            // ### SECURITY WARNING - use minimum 10000 iterations ###
            int iterCount = 1000;
            int ivLength = 16;
            // ### SECURITY WARNING - don't use a static salt
            byte[] saltByte = new byte[] {
                    0x49,0x76,0x61,0x6e,0x20,0x4d,0x65,0x64,0x76
            };
            KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),saltByte,iterCount,(keySize + 128)); // 32 + 16
            byte[] rawKey = factory.generateSecret(spec).getEncoded(); // 48 bytes
            byte[] keyDerived = Arrays.copyOf(rawKey,(keySize / 8)); // first 32 bytes
            byte[] ivB = Arrays.copyOfRange(rawKey,(keySize / 8),rawKey.length); // last 16 bytes
            SecretKey key = new SecretKeySpec(keyDerived,"AES");
            IvParameterSpec iv = new IvParameterSpec(ivB);
            cipher.init(Cipher.DECRYPT_MODE,key,iv);
            //byte[] original = cipher.doFinal(data);
            byte[] original = cipher.doFinal(bytes);
            s = new String(original,StandardCharsets.UTF_16LE);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return s;
    }
    public static String encrypt(String plainText,String passphrase) {
        String s = null;
        try {
            System.out.println("plaintext input :  " + plainText);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            // byte[] bytes = Base64.getDecoder().decode(cipherText);
            //cipherText = new String(cipherText.getBytes(),StandardCharsets.UTF_16LE);
            int keySize = 256;
            // ### SECURITY WARNING - use minimum 10000 iterations ###
            int iterCount = 1000;
            int ivLength = 16;
            // ### SECURITY WARNING - don't use a static salt
            byte[] saltByte = new byte[] {
                    0x49,(keySize + (8 * ivLength))); // 32 + 16
            // KeySpec spec = new PBEKeySpec(passphrase.toCharArray(),"AES");
            IvParameterSpec iv = new IvParameterSpec(ivB);
            cipher.init(Cipher.ENCRYPT_MODE,iv);
            //byte[] original = cipher.doFinal(data);
            byte[] cipherText = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_16LE));
            //byte[] original = cipher.doFinal(cipherText.getBytes());
            s = Base64.getEncoder().encodeToString(cipherText);
            //s = new String(original,StandardCharsets.UTF_16LE);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return s;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-