图文并茂之AES加密
本文改编自:http://www.sohu.com/a/198681357_505794
假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”
如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密。
因此我们不再直接传送明文,而改用对称加密的方式传输密文,画风就变成了下面这样:
具体工作的步骤如下:
1.发送方利用密钥123456,加密明文“我是小灰”,加密结果为TNYRvx+SNjZwEK+ZXFEcDw==。
2.发送方把加密后的内容TNYRvx+SNjZwEK+ZXFEcDw==传输给接收方。
3.接收方收到密文TNYRvx+SNjZwEK+ZXFEcDw==,利用密钥123456还原为明文“我是小灰”。
1.密钥
密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES支持三种长度的密钥:
128位,192位,256位
平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。
2.填充
要想了解填充的概念,我们先要了解AES的分组加密特性。
什么是分组加密呢?我们来看看下面这张图:
AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个铭文块长度128bit。
这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
但是这里涉及到一个问题:
假如一段明文长度是196bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。
NoPadding:
不做任何填充,但是要求明文必须是16字节的整数倍。
PKCS5Padding(默认):
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
ISO10126Padding:
如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
3.模式
AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:
CBC、ECB、CTR、CFB、OFB
模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。
CBC模式:
电码本模式 Electronic Codebook Book
ECB模式(默认):
密码分组链接模式 Cipher Block Chaining
CTR模式:
计算器模式 Counter
CFB模式:
密码反馈模式 Cipher FeedBack
OFB模式:
输出反馈模式 Output FeedBack
1. kgen.init传入的第一个参数128决定了密钥的长度是128bit。
2. Cipher.getInstance("AES/CBC/NoPadding")决定了AES选择的填充方式是NoPadding,工作模式是CBC模式。
注意:
1.我们在调用封装好的AES算法时,表面上使用的Key并不是真正用于AES加密解密的密钥,而是用于生成真正密钥的“种子”。
2.填充明文时,如果明文长度原本就是16字节的整数倍,那么除了NoPadding以外,其他的填充方式都会填充一组额外的16字节明文块。
3.JAVA对秘钥的位数有限制,默认你只能使用128位的秘钥,也就是16个字节字符串。要想突破此限制需要替换jdk下的2个jar文件。详细可参看文章:
http://www.mamicode.com/info-detail-1879825.html
图文并茂之AES加密相关推荐
- cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通
对于PHP7与CryptoJS的AES加密的方式互通代码不能正确执行,我的测试代码为: JS端:let iv = CryptoJS.enc.Utf8.parse('1111111111111111') ...
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- AES加密时抛出java.security.InvalidKeyException:#160;Illegal#160;key#160;size#160;or#160;def...
原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...
- AES加密_ js与C#互通
为什么80%的码农都做不了架构师?>>> javascript部分 npm install crypto-js --save 定义文件jm.js const CryptoJS = r ...
- cryptojs aes加密每次结果不同_Javascript加密算法标准库,支持Nodejs+浏览器——crypto-js...
介绍 crypto-js是一个前端Javascript标准加密算法库,CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法.有时候项目涉及到的敏感数据比较多,为 ...
- aes加密内容不定长_浅谈加密技术
1.加密算法术语 假设我们将ABCD中的每个字母替换为其后的第二个字母,例如A替换为C,最终ABCD替换为CDEF. 明 文:ABCD 加密算法:字母替换 密 钥:每个字母替换为其后的第二 ...
- java php aes加密解密_php aes 加密解密可与java对接
php aes 加密解密可与java对接 博主:liu1693 发表时间:2017-02-23 16:52:27 浏览量:100 class Encrypt{ //加密方法 public static ...
- 记一次Python与C#的AES加密对接
前言 这几天做自动化测试的同事找到我,说是帮她看看有个AES加密的问题要怎么处理. 大概就是文档中贴了一段C#的AES加密代码,然后她要翻译成python的版本,去做一些测试相关的工作. 在我印象中, ...
- Java使用AES加密解密
AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...
最新文章
- 左右上下都能滚动的效果
- 社区团购的终局会是近景零售版的拼多多吗?
- Integer overflow, simple but not easy
- 山东大学计算机系统原理,山东大学计算机组成原理三套题汇总
- jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)
- Java Long类的valueOf()方法及示例
- Java描述设计模式(11):观察者模式
- 智能机器人热点技术大揭秘!
- 浏览器中的JavaScript
- LeetCode-144:二叉树的前序遍历
- mybatis xml sql
- 无法使用带括号的初始值设定项初始化数组_leetcode32. 最长有效括号
- java文件乱码 环境变量_JAVA安装后,环境变量的PATH被我改了,后来发现改错了,但是不知道怎么改回去了,就是一堆乱码的...
- 计算大数阶乘--VB Script 版
- 搭建samba映射网络驱动器
- 《大话数据结构》参考
- centOS7安装redis单例配置主从+哨兵+VIP
- webx3对请求的处理流程详解一
- Vue中Class和Style几种v-bind绑定的用法-详解案例
- 非对称加密算法--RSA