AES256加解密java语言实现

写在前面

基于项目安全性需要,有时候我们的项目会使用AES 256加解密算法。以下,是针对实现AES256 Padding7加密算法实现的关键步骤解析以及此过程遇到的一些问题总结。

一些概念

对称加密算法

加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合;缺点是密钥的传输比较麻烦。

非对称加密算法

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合;优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal等。

实际应用中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

关于AES 256

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法:简单来说就是加密和解密过程中使用的秘钥(根据一定的规则生成)是相同的。

img

下面简单介绍下各个部分的作用与意义:

明文P

需要加密的明文

密钥K

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据

AES加密算法

设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C

密文C

经加密函数处理后,可以在网络传输中传递的密文数

AES解密算法

设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P

AES 256加解密算法实现

本博客重点讲解AES 256加解密算法实现过程;有关AES算法原理部分,网上有很多相关的博客,这里不再赘述。这里要特别指出的一点是,AES 256中的256指的是秘钥K的长度,常见的密钥长度还有128位、192位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES

密钥长度(32位比特字)

分组长度(32位比特字)

加密轮数

AES-128

4

4

10

AES-192

6

4

12

AES-256

8

4

14

生成秘钥

生成秘钥的方式是需要另一端解密人员一起协定的,不同的厂商乃至不同的项目,生成秘钥的方式理论上都要是不同的。

这里只是为简单举例:

使用用户名username,密码password和随机数random经过MD5加密后再经过HAS-256 hash后生成一组密钥

byte[] pkey = generatePkey("zhijunhong", "123456", "1111");

......

/**

* 生成秘钥

*

* @param username

* @param password

* @param random

* @return

* @throws NoSuchAlgorithmException

*/

private byte[] generatePkey(String username, String password, String random) throws NoSuchAlgorithmException {

String mD5Str = MD5Utility.getMD5DefaultEncode(username + random + password);

return Sha256Utils.getSHA256ByteArray(random + mD5Str);

}

使用密钥加密明文

从步骤1获取的密钥pkey,还需要指定向量IV,这里随机指定IV为一组数据串,实际项目中,需要协定统一的IV向量来加密明文。

String base64EncryptStr = AESUtils.aesEncryptStr("我是明文 ", pkey, AESUtils.IV); //密文

......

/**

* @param content 加密前原内容

* @param iv

* @return base64EncodeStr aes加密完成后内容

* @throws

* @Title: aesEncryptStr

* @Description: aes对称加密

*/

public static String aesEncryptStr(String content, byte[] pkey, String iv) {

byte[] aesEncrypt = aesEncrypt(content, pkey, iv);

System.out.println("加密后的byte数组:" + Arrays.toString(aesEncrypt));

String base64EncryptStr = Base64Utils.encode(aesEncrypt);

System.out.println("加密后 base64EncodeStr:" + base64EncryptStr);

return base64EncryptStr;

}

加密方法,参数说明:

content:待加密的明文

pkey:上一步骤生成的加密秘钥

iv:加密向量IV

其中,具体加密方法aesEncrypt(String content, byte[] pkey, String IV)如下:

/**

* @param content 需要加密的原内容

* @param pkey 密匙

* @param

* @return

*/

public static byte[] aesEncrypt(String content, byte[] pkey, String IV) {

try {

//SecretKey secretKey = generateKey(pkey);

//byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec skey = new SecretKeySpec(pkey, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");// "算法/加密/填充"

IvParameterSpec iv = new IvParameterSpec(IV.getBytes());

cipher.init(Cipher.ENCRYPT_MODE, skey, iv);//初始化加密器

byte[] encrypted = cipher.doFinal(content.getBytes("UTF-8"));

return encrypted; // 加密

} catch (Exception e) {

Log.i(TAG,"aesEncrypt() method error:", e);

}

return null;

}

最后,进行一轮base64转码String base64EncryptStr = Base64Utils.encode(aesEncrypt);操作后,输出密文字符串base64EncryptStr。

使用密钥解密密文

秘钥解密的过程就是加密的逆过程,如下:解密方法

String decodeStr = AESUtils.aesDecodeStr3(base64EncryptStr, pkey, AESUtils.IV);

解密方法,传递三个参数:

base64EncryptStr:base64编码过的加密密文

pkey:秘钥(同加密秘钥)

IV:向量

具体解密过程:先通过base64还原密文编码,再通过aesDecode(byte[] encryptStr, byte[] pkey, String IV)方法进行解密

/**

* @param base64EncryptStr base64处理过的字符串

* @param pkey 密匙

* @param

* @return String 返回类型

* @throws Exception

* @throws

* @Title: aesDecodeStr

* @Description: 解密 失败将返回NULL

*/

public static String aesDecodeStr3(String base64EncryptStr, byte[] pkey, String IV) throws Exception {

byte[] base64DecodeStr = Base64Utils.decode(base64EncryptStr);

byte[] aesDecode = aesDecode(base64DecodeStr, pkey, IV);

if (aesDecode == null) {

return null;

}

String result;

result = new String(aesDecode, "UTF-8");

return result;

}

其中,aesDecode(byte[] encryptStr, byte[] pkey, String IV)方法的具体实现,基本和加密过程相差不大,如下:

/**

* 解密

*

* @param encryptStr 解密前的byte数组

* @param pkey 密匙

* @param IV

* @return result 解密后的byte数组

* @throws Exception

*/

public static byte[] aesDecode(byte[] encryptStr, byte[] pkey, String IV) throws Exception {

//SecretKey secretKey = generateKey(pkey);

//byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec skey = new SecretKeySpec(pkey, "AES");

IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");// 创建密码器

cipher.init(Cipher.DECRYPT_MODE, skey, iv);// 初始化解密器

byte[] result = cipher.doFinal(encryptStr);

return result; // 解密

}

通过上述一系列操作后,最后将获取的字符数组,通过new String(aesDecode, "UTF-8")操作,就可以将密文重新解密成明文"我是明文"。

2021-02-24 18:05:33.651 21560-21560/com.example.aes256 I/MainActivity: encryptStr: y9COgiC06V2E1CIuhJbPfg==

2021-02-24 18:05:33.652 21560-21560/com.example.aes256 I/MainActivity: decodeStr: 我是明文

最后,别忘了点一下star哟~

参考

aes 256 cbc java,AES256加解密java语言实现相关推荐

  1. java aes ctr_AES CBC和CTR加解密实例

    http://www.metsky.com/archives/585.html 2012 AES(Advanced Encryption Standard,高级加密标准) 又叫Rijndael加密法, ...

  2. 【AES256】Java实现AES256加解密

    AES256加解密比较常见,这里简单记录以供参考! 一.下载 官方JDK默认支持AES-128,在 1.8.0_151 和 1.8.0_152 版本之前,需要从Oracle官网下载安全JAR包方可支持 ...

  3. openresty 与 java RSA加解密

    上一篇搞定了openresty与java之间的aes加解密.这一篇就来说说openresty与java之间RSA的加解密.在测试的过程中.发现了与aes同样的问题.就是openresty支持的填充模式 ...

  4. java中加解密合集

    1.背景 项目过程中遇到很多需要加密和解密的数据,用于记录学习 2.对称加密和非对称加密 3.对称加密 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密,这种方法在密码学中叫 ...

  5. 基于RSA和AES混合加密实现的加解密小工具

    基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...

  6. AES实现加解密-Java

    一.加解密算法生态圈 目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统.对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其 ...

  7. Delphi与JAVA互加解密AES算法

    搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util;import java.io.UnsupportedEncodingException; impo ...

  8. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  9. C# AESCBC256 与 java AESCBC256 加解密

    和某上市公司对接接口,他们试用 java AES CBC PKCS5 256 加解密.网上C# 基本不合适. 注意:C# PKCS7 对应 java PKCS5 /// <summary> ...

最新文章

  1. apache集成tomcat,并根据域名进行分发 屏蔽端口显示
  2. c++ 在哪里找文档来看_FPX双C十四连败引热议!Doinb:我再也不跟LWX双排了
  3. Spring手动回滚事务
  4. HDU 2993 MAX Average Problem(斜率优化DP)
  5. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换
  6. MySQL工作笔记-解决导入外部sql中文乱码问题
  7. service get list一般规范
  8. Unity Inspector 给组件自动关联引用
  9. Linux磁盘管理--RAID原理
  10. java 夏令时 容器 问题,Java夏令时有关问题
  11. Windows安装Oracle与PlSql教程
  12. 毕向东java视频js_js foteach 传智播客毕向东老师 新版JAVASE基础学习视频教程 ...(8)...
  13. 信利Truly M128128 的研究和驱动方法记录
  14. win10熄屏时间不对_Windows10下显示时间不正确的原因及解决技巧
  15. x,y,w,h与xmin,ymin,xmax,ymax的关系
  16. 华为教父任正非的别样视野(转)
  17. 【Chrome扩展程序】content_script 的跨域问题
  18. 【PyTorch深度学习项目实战100例】—— 基于ResNet50实现多目标美味蛋糕图像分类 | 第51例
  19. 任意重循环(循环阶数不定、循环层数不定)
  20. 手机和电脑如何连接无线投影仪

热门文章

  1. 杀人女魔被捕大数据立功,数据存储架构决定研判效率
  2. 【工厂模式与抽象工厂】—— 每天一点小知识
  3. NBA十大不可能破的纪录
  4. 网站升级https访问,webscoket升级wss问题
  5. python 模拟浏览器操作_python 使用 mechanize 模拟浏览器访问网页
  6. 前端大数字使用千分位(逗号)分隔
  7. OpenCV字符识别
  8. 鸢尾花数据集可视化分析
  9. JavaScript基础知识(3)
  10. 机器学习 数学_机器学习的数学先决条件