AES算法
对接资方的时候用到了AES加密算法,之前经常用但是没好好梳理一下,这次有空就简单梳理一下,方面日后整理学习。AES是加密算法其中的一种,它是属于对称加密,对称加密的意思就是,加密以及解密用的都是同一个Key。相比于非对称加密RSA,SM2等,它的优点就是快。为了了解AES,我们大概从以下几个方面入手
密钥支持的长度常用的工作模式(ECB模式/CBC模式)Padding 的填充模式2. 密钥密钥是AES算法实现加解密的根本。AES 支持三种长度的密钥: 128bit (16B), 192bit(24B) , 256bit(32B)。AES256 安全性最高,AES128性能最优。本质是它们的加密处理轮数不同。
AES128 | 10轮 |
---|---|
AES192 | 12轮 |
AES256 | 14轮 |
而我们默认的就是AES128,也就是会循环10轮。
(资料图)
public static String generateAESKey() {KeyGenerator keyGenerator = null;try {keyGenerator = KeyGenerator.getInstance("AES");} catch (NoSuchAlgorithmException e) {return null;} // 这里代码秘钥的长度,128,192,256keyGenerator.init(128);SecretKey key = keyGenerator.generateKey();byte[] keyExternal = key.getEncoded();return Base64.encodeBase64String(keyExternal);}
我们可以从如下图看出,生成的key的秘钥数组大小为 16,其中有些字符不是正常显示的ASCII。也就是说, 我们可以随机生成一段长度为16、24、32大小的字符串也可以充当秘钥。
System.out.println(RandomUtil.randomString(16));
当然这种秘钥我理解是不安全的,不建议使用
3. 工作模式3.1. ECB模式ECB 模式是最简单块密码加密模式,加密前根据加密块大小(AES 128位)分成若干块,之后将每块使用相同的密钥单独加密,在该模式下,每个明文块的加密都是独立的,互不影响的。解密同理。优势
简单有利于并行计算缺点
相同的明文块经过加密会变成相同的密文块,因此安全性较差。3.2. CBC模式CBC模式引入一个新的概念:初始向量IV。IV的作用和MD5的"加盐"有些类似,目的是防止同样的明文块始终加密成相同的密文块。CBC模式原理:在每个明文块加密前会让那个明文块和IV向量先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每个明文块和它前一个明文块所加密出的密文块相异或,这样相同的明文块加密出来的密文块显然不一样。优势
安全性更高缺点
无法并行计算,性能上不如ECB引入初始向量IV,增加复杂度4. 常用的填充方式AES 算法在对明文加密的时候,并不是把整个明文加密成一整段密文,而是把明文拆分成几组独立的明文块,每一个明文块的长度128bit(16B),最后不足128bit(16B),会根据不同的Padding 填充模式进行填充,然后进行加密。总结:加密过程是先处理pading,后加密。解密过程是先进行分块解密,最后在处理Padding。例如:一段明文的长度198bit,按照128bit 拆分,第二个之后70bit,不足128bit,就需要对明文块进⾏填充(Padding)。
4.1 NoPadding不做任何填充,要求明文必须是16字节的整数倍。
4.2 PKC5Padding(推荐)明文块少于128bit(16B),在明文块的末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。如 明文:{1,2,3,4,5,6,7,8, a,b,c},缺少5个字节,则补全为{1,2,3,4,5,6,7,8, a,b,c,5,5,5,5,5,5}
4.3 ISO10126Padding明文块少于128bit(16B),在明文块的末尾补足相应数量的字符,最后一个字符值等于缺少的字符数,其他字符填充随机数如 明文{1,2,3,4,5,6,7,8, a,b,c},缺少5个字节,则补全为{1,2,3,4,5,6,7,8, a,b,c,e,i,o,p,k,5}具体接口使用,请根据自己的业务需求去选择。
5. AES代码示例private static final String KEY_ALGORITHM = "AES";private static final String ENCODING = StandardCharsets.UTF_8.name();private static final String AES_ECB_MODE = "AES/ECB/PKCS5Padding";private static final String AES_CBC_MODE = "AES/CBC/PKCS5Padding";// 因为AES块 为16字节,所以IV必须为16字节private static final String IV = RandomUtil.randomString(16);private static final IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
5.1 对称key的生成// key只要在16、24、32大小即可
public static String generateAESKey() {KeyGenerator keyGenerator = null;try {keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);} catch (NoSuchAlgorithmException e) {return null;}keyGenerator.init(128);SecretKey key = keyGenerator.generateKey();byte[] keyExternal = key.getEncoded();return Base64.encodeBase64String(keyExternal);}
5.2 加密public static String encrypt(String content, String key) {try {byte[] bytesKey = Base64.decodeBase64(key);SecretKeySpec secretKey = new SecretKeySpec(bytesKey, KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_ECB_MODE);// 创建密码器byte[] byteContent = content.getBytes(ENCODING);cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 初始化byte[] result = cipher.doFinal(byteContent);// 加密return Base64.encodeBase64String(result);} catch (Exception e) {}return null;}
5.3 解密public static String decrypt(String content, String key) {try {byte[] bytesKey = Base64.decodeBase64(key);SecretKeySpec secretKey = new SecretKeySpec(bytesKey, KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_ECB_MODE);// 创建密码器cipher.init(Cipher.DECRYPT_MODE, secretKey);// 初始化byte[] result = cipher.doFinal(Base64.decodeBase64(content));// 解密return new String(result);} catch (Exception e) {}return null;}
备注:如果是CBC的模式,只要在cipher.init加入向量的ips即可
-
AES算法
博客园 2023-06-26
-
鸡肉怎么炒才香 ?厨师长秘制蒜香鸡,鸡肉皮脆鲜嫩,蒜茸香味十足
红五百科 2023-06-26
-
【环球播资讯】特斯拉推Dojo超级计算机 埃隆·马斯克:比专家发现的先进得多
中关村在线 2023-06-26
-
【环球速看料】买房贷款多久能批下来,买房贷款流程介绍?
探其财经网 2023-06-25
-
端午节假期遇上“龙舟水” 市民出游热度不减 文博游成为南宁人新宠
南宁云—南宁晚报 2023-06-25
-
华硕驱动官网下载_华硕驱动官网
互联网 2023-06-25
-
从2021智博会看编辑技术同数字经济发展深度融合
中国网 2021-09-02
-
防止孩子沉迷网游,两块“阵地”都要守好
检察日报 2021-09-02
-
9月1日北京等28个城市272万人领取电子驾驶证
新华网 2021-09-02
-
以算法对算法 “浙江外卖在线”为互联网监管蹚路
科技日报 2021-09-02
-
AES算法
博客园 2023-06-26
-
谁说Uzi不会用霞?EDG前期打窝子,就等乐言来送! 每日观察
囧王者 2023-06-26
-
端午节期间日均132.1万人次出入境
国家移民管理局 2023-06-26
-
笨丫头小说 笨丫头和小狐狸_环球短讯
互联网 2023-06-26
-
海关总署:杭州亚运会暂时进境物资可采用通关一体化模式-环球热门
人民网 2023-06-26
-
鸡肉怎么炒才香 ?厨师长秘制蒜香鸡,鸡肉皮脆鲜嫩,蒜茸香味十足
红五百科 2023-06-26
-
世界新资讯:宁波甬城妇科医院怎么样?宁波甬城专业妇科收费透明
中华网健康 2023-06-26
-
头条焦点:粤港海关开展跨境缉毒合作 查获各类毒品达561.3公斤
央视新闻客户端 2023-06-26
-
环球今头条!茄子煲怎么做? 吃了十几年也不腻的“茄子粉丝煲”,鲜香四溢,大人小孩都爱吃
红五百科 2023-06-26
-
“遇到这种情况,在哪里都得帮!”济广高速送车祸婴儿就医的山东好大哥找到了
山东讯息 2023-06-26
-
醉酒误吞碎玻璃扎进胃壁 医生制作“吊篮”将其胃镜下取出_世界最新
荆楚网 2023-06-26
-
中国移动与南京大学签署战略合作协议 天天快播报
云财经 2023-06-26
-
win7ide改成ahci蓝屏如何解决
互联网 2023-06-26
-
焕耀夏日光芒,QD瓷砖霸启爆品王牌矩阵
中国陶瓷网 2023-06-26
-
男孩查分显示全省前31名 两次考上大学又复读!_世界快播报
互联网 2023-06-26
-
【环球播资讯】特斯拉推Dojo超级计算机 埃隆·马斯克:比专家发现的先进得多
中关村在线 2023-06-26
-
12GB版Ubuntu镜像放出:可刷入虚拟机或制作USB启动盘
中关村在线 2023-06-26
-
俄媒:反制日本,普京签令将9月3日更名为对日本军国主义战争胜利纪念日|环球速看料
中钢网 2023-06-25
-
着墨数字赋能 浙江细绘未来乡村“共富图”-天天新要闻
中国新闻网 2023-06-25
-
亲豆网小姐_亲豆网2019|全球热点
互联网 2023-06-25
-
国机精工:伊滨产业园一期工程正在建设过程中 预计2024年上半年完工
界面新闻 2023-06-25
-
环球快播:理想,再“狂”一次?
搜狐科技 2023-06-25
-
迎大运丨绿色办赛进行时:以“赛事侧”清洁能源保障推动“城市侧” 低碳转型 今日要闻
本站原创 2023-06-25
-
今日精选:2023年6月25日云南省韭菜批发价格行情
中商产业研究院 2023-06-25
-
洛阳已连续23年实现耕地占补平衡|当前快讯
掌上洛阳客户端 2023-06-25
-
天天视讯!青岛到上海为什么没有高铁
互联网 2023-06-25
-
上汽名爵印度市场投资风险
老林说车 2023-06-25
-
全球看点:【科普中国军事科技】为什么大数据技术已成为兵家必争之地?
科普中国-军事科技前沿 2023-06-25
-
“土味奶茶”热销40万杯,年轻人为什么总爱这一招?
CBNData 2023-06-25
-
金正学习机引诱欺骗消费者
华声投诉 2023-06-25