aes 256 cbc java,AES256加解密java语言实现
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语言实现相关推荐
- java aes ctr_AES CBC和CTR加解密实例
http://www.metsky.com/archives/585.html 2012 AES(Advanced Encryption Standard,高级加密标准) 又叫Rijndael加密法, ...
- 【AES256】Java实现AES256加解密
AES256加解密比较常见,这里简单记录以供参考! 一.下载 官方JDK默认支持AES-128,在 1.8.0_151 和 1.8.0_152 版本之前,需要从Oracle官网下载安全JAR包方可支持 ...
- openresty 与 java RSA加解密
上一篇搞定了openresty与java之间的aes加解密.这一篇就来说说openresty与java之间RSA的加解密.在测试的过程中.发现了与aes同样的问题.就是openresty支持的填充模式 ...
- java中加解密合集
1.背景 项目过程中遇到很多需要加密和解密的数据,用于记录学习 2.对称加密和非对称加密 3.对称加密 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密,这种方法在密码学中叫 ...
- 基于RSA和AES混合加密实现的加解密小工具
基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...
- AES实现加解密-Java
一.加解密算法生态圈 目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统.对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其 ...
- Delphi与JAVA互加解密AES算法
搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util;import java.io.UnsupportedEncodingException; impo ...
- ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密
**PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...
- C# AESCBC256 与 java AESCBC256 加解密
和某上市公司对接接口,他们试用 java AES CBC PKCS5 256 加解密.网上C# 基本不合适. 注意:C# PKCS7 对应 java PKCS5 /// <summary> ...
最新文章
- apache集成tomcat,并根据域名进行分发 屏蔽端口显示
- c++ 在哪里找文档来看_FPX双C十四连败引热议!Doinb:我再也不跟LWX双排了
- Spring手动回滚事务
- HDU 2993 MAX Average Problem(斜率优化DP)
- 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换
- MySQL工作笔记-解决导入外部sql中文乱码问题
- service get list一般规范
- Unity Inspector 给组件自动关联引用
- Linux磁盘管理--RAID原理
- java 夏令时 容器 问题,Java夏令时有关问题
- Windows安装Oracle与PlSql教程
- 毕向东java视频js_js foteach 传智播客毕向东老师 新版JAVASE基础学习视频教程 ...(8)...
- 信利Truly M128128 的研究和驱动方法记录
- win10熄屏时间不对_Windows10下显示时间不正确的原因及解决技巧
- x,y,w,h与xmin,ymin,xmax,ymax的关系
- 华为教父任正非的别样视野(转)
- 【Chrome扩展程序】content_script 的跨域问题
- 【PyTorch深度学习项目实战100例】—— 基于ResNet50实现多目标美味蛋糕图像分类 | 第51例
- 任意重循环(循环阶数不定、循环层数不定)
- 手机和电脑如何连接无线投影仪