理解AES加密解密的使用方法

很多人对于AES加密并不是很了解,导致互相之间进行加密解密困难。
本文用简单的方式来介绍AES在使用上需要的知识,而不涉及内部算法。最后给出例子来帮助理解AES加密解密的使用方法。

AES的麻烦

相比于其他加密,AES加密似乎模式很多,包括ECB、CBC等等等等,每个模式又包括IV参数和Padding参数,并且,不同语言对AES加密的库设计有区别。这些导致AES加密在不同人之间联调会很麻烦。

AES属于块加密

不难理解,对越长的字符串进行加密,代价越大,所以通常对明文进行分段,然后对每段明文进行加密,最后再拼成一个字符串。块加密的一个要面临的问题就是如何填满最后一块?所以这就是PADDING的作用,使用各种方式填满最后一块字符串,所以对于解密端,也需要用同样的PADDING来找到最后一块中的真实数据的长度。

加密模式

AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别。具体可参考 wiki说明
另外,AES分为AES128,AES256等,表示期待秘钥的长度,比如AES256秘钥的长度应该是256/8的32字节,一些语言的库会进行自动截取,让人以为任何长度的秘钥都可以。而这其实是有区别的。

IV的作用

IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。
IV的长度为16字节。超过或者不足,可能实现的库都会进行补齐或截断。但是由于块的长度是16字节,所以一般可以认为需要的IV是16字节。

PADDING

AES块加密说过,PADDING是用来填充最后一块使得变成一整块,所以对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。

加密解密端

所以,在设计AES加密的时候

  • 对于加密端,应该包括:加密秘钥长度,秘钥,IV值,加密模式,PADDING方式。
  • 对于解密端,应该包括:解密秘钥长度,秘钥,IV值,解密模式,PADDING方式。

Nodejs实现

这里使用Nodejs的cryptojs库模拟AES加密解密

var crypto = require("crypto");var algorithm='aes-256-cbc';
var key = new Buffer("aaaabbbbccccddddeeeeffffgggghhhh");
var iv = new Buffer("1234567812345678");
function encrypt(text){var cipher=crypto.createCipheriv(algorithm,key,iv);cipher.update(text,"utf8");return cipher.final("base64");
}
function decrypt(text){var cipher=crypto.createDecipheriv(algorithm,key,iv);cipher.update(text,"base64");return cipher.final("utf8");
}var text="ni你好hao";
var encoded=encrypt(text)
console.log(encoded);
console.log(decrypt(encoded))

结果如下

WfH4hzIc3dc0pjxa9V/RgQ==
ni你好hao

nodejs自带的并不能自动配置padding等参数,演示起来并不方便。
于是使用另一个框架crypto-js的nodejs库实现和之前完全相同的版本

var CryptoJS = require("crypto-js");
var key ="aaaabbbbccccddddeeeeffffgggghhhh";
var iv = "1234567812345678";function encrypt(text){return CryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7})
}function decrypt(text){var result = CryptoJS.AES.decrypt(text,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7})return result.toString(CryptoJS.enc.Utf8)
}var text="ni你好hao";
var encoded=encrypt(text)
console.log(encoded.toString());
console.log(decrypt(encoded))

现在aes的参数都变成可配置的,接下来验证一下之前对AES的理解。

  • 改变IV的长度,发现当IV大于16字节的时候,不管16字节之后的是什么,都不影响加密结果,应该是种自动截取机制(nodejs原生库IV不是16字节,就会报错)
  • 改变IV的长度,当IV小于16字节,还可以成功加密,可能是自动补齐机制
  • 加密IV和解密IV不同的时候,并不影响解密是否成功,但是解密的结果有差别,比如将解密的IV变成1234567813345678,则解密结果变为ni你好h`o
    修改padding,加密解密的padding换成NoPadding,发现解密之后生成utf8字符串出错
  • 经过多次尝试,加密为Pkcs7和ZeroPadding时,加密后的字符串变化显著,这时解密用任何padding模式,都可以成功解密。

ni你好hao,经过Pkcs7后,输出为

WfH4hzIc3dc0pjxa9V/RgQ==

nopadding后,输出为

OtSNypfx1SF6C2E=

zeropadding后,输出为

OtSNypfx1SF6C2GfyXMidA==

Pkcs7的结果和其他结果相差很大,很难相信其padding是补充最后一块
有趣的是Pkcs7的结果和zeropadding的结果通过同样的解密设置,能解出同样的字符串ni你好hao

总结

AES加密解密的秘钥有一对,一个是IV一个是KEY,并且他们的长度都有严格要求。
Padding的作用似乎不只是补齐最后,如果自己什么都对,但是加密失败,可以尝试不同Padding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中,引用作为函数参数

引用作为函数参数 C之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能。 ———————————————————— c,函数传参:(1)将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向…

全排列算法原理和实现

From: http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。1、首先看最后两个数4, 5。 它们的全排列为…

ext笔记

如何创建对象实例:var app function() { var privVar11; return {p1:11, p2:22,init:function(){}};}(); js创建对象的原理:实际上创建了一个匿名函数(没有名字的函数),经过解释之后让它立刻运行(注意函数后面的())。…

Linux:建立内核代码树

为什么建立内核代码树?菜鸟简单的以为,好比为某户型的房子(某个版本的Linux)设计门窗,那么当然需要根据该户型房子的具体参数进行设计了,或者说内核模块要基于内核版本或者该版本的内核代码。那么内核的编译…

输出一个等边三角形(由*拼接),实心或空心,连长为n

开发环境&#xff1a;VC6 /*功能&#xff1a;输出一个等边三角形(由*拼接)&#xff0c;实心或空心&#xff0c;连长为n*/#include <stdio.h>/*将str重复输出len遍*/void Print(char str[], int len){while(len-- > 0)printf("%s", str);}/*功能&#xff1a…

年底了,总结一下大型网站的入侵经验[t00ls转载]

事先声明&#xff1a;1、拒绝跨省。2、拒绝人肉&#xff0c;猪肉&#xff0c;牛肉。本文并不涉及内网。纯属经验谈&#xff0c;以前oldjun有写过类似的。俺这里挑不重复的补充&#xff1a;0x00大型某类别门户世界排名top100以内&#xff1a;- 低调求发展1、一个点&#xff0c;特…

File System Auditor 安装全程截图

最近在家里用h-v做了一下&#xff26;&#xff33;&#xff21;的一些测试&#xff0c;测试记录如下。 FSA安装需求: .net 2.0 SQL2000及更高版本数据库 FSA的组成: 三个部分: 1、FSA 服务器控制台&#xff1a;管理与配置 2、文件服务器&#xff1a;安装FSA agent&#x…

vue中使用cookies和crypto-js实现记住密码和加密

使用crypto-js加解密 第一步&#xff0c;安装 npm install crypto-js 第二步&#xff0c;在你需要的vue组件内import import CryptoJS from “crypto-js”; 第三步&#xff0c;使用 // Encrypt 加密 var cipherText CryptoJS.AES.encrypt("my message","secret…

Linux:编译生成内核模块(来自国嵌的视频教学)

内核模块的代码文件 文件 yyyy.c &#xff08;yyyy可以与模块xxxx同名也可以不同名&#xff09; &#xff08;类似模板的东西&#xff09; #ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE //直接添加到内核时去掉&#xff0c;生成模块时保留 #d…

iOS开发UI篇—实现一个私人通讯录小应用(二)

一、实现功能说明 &#xff08;1&#xff09;点击注销按钮&#xff0c;弹出一个对话框&#xff0c;点击确定后移除当前栈顶的控制器&#xff0c;返回开始界面&#xff0c;点击取消&#xff0c;不做任何操作。 注意&#xff1a;注销按钮的单击事件已经进行了连线。实现-(void)ac…

IIS内部错误:500之解决方案

将自己很早以前做的一个asp.net网站从自己的笔记本上迁移到公司电脑上&#xff0c;在作好相关配置后&#xff0c;打开网站首页&#xff0c;出现HTTP500错误&#xff0c;上网查了发现这是服务器内部错误。 接着我查看了下系统事件日志信息&#xff0c;发现了错误: 服务器无法加…

AGPM(高级组策略管理)3.0之二操作

续AGPM&#xff08;高级组策略管理 &#xff09;3.0之一部署。1、设置默认AGPM服务器打开组策略管理控制台&#xff08;GPMC.MSC&#xff09;&#xff0c;打开默认的Default Domain Policy进行编辑。打开用户配置、策略、管理模板、Windows 组件、AGPM&#xff0c;进行如下设置…

Linux:串口通信

以前跟着做过VxWorks的开发&#xff0c;主要通信方式是串口&#xff0c;因为底层BSP包已经做好了&#xff0c;串口通信非常简单。后来接触Linux&#xff0c;在一块OK6410上跑Linux串口通信&#xff0c;才发现原来天真的以为甚是简单的串口变得如此的不简单。 #include <ter…

结合netstat和awk命令来统计网络连接数

结合netstat和awk命令来统计网络连接数netstat -n | awk /^tcp/ {state[$NF]} END {for(key in state) print key,"\t",state[key]}会得到类似下面的结果&#xff0c;具体数字会有所不同&#xff1a;LAST_ACK 1SYN_RECV 14ESTABLISHED 79FIN_WAIT1 28FIN_WAIT2 3CLOS…

屏幕实战效果解析:IPS/TFT/AMOLED/SLCD

现在手机市场上&#xff0c;智能手机种类繁多&#xff0c;手机屏幕材质也是五花八门。对于一般消费者来说&#xff0c;一款手机是否值得购买&#xff0c;除了关心它的硬件参数以外&#xff0c;更重要的一点就是看它的屏幕。除了屏幕尺寸以外&#xff0c;影响着大家对该手机的第…

结构体继承自结构体

C Code: /*功能&#xff1a;结构体继承自结构体结论&#xff1a;1. 结构体可以继承自结构体2. 结构体同样有构造函数和析构函数*/#include <iostream>using namespace std;struct MNode{int val;MNode(){val 10;cout<<"MNode(): "<<val<<e…

非对称加密算法(公钥和私钥)

非对称加密算法需要两个密钥来进行加密和解密&#xff0c;这两个秘钥是公开密钥&#xff08;public key&#xff0c;简称公钥&#xff09;和私有密钥&#xff08;private key&#xff0c;简称私钥&#xff09;。 公钥&#xff08;Public Key&#xff09;与私钥&#xff08;Pri…