AES加密算法说明

2024-09-07 04:28
文章标签 aes 加密算法 说明

本文主要是介绍AES加密算法说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,我们得了解AES加密算法的一些基本概念。AES是一种对称加密算法,所谓对称,是说它的加密、解密过程使用相同的密钥。还有非对称加密算法,例如RSA,加密解密使用的是公私钥对。
AES同时是一种分组加密算法,分组的长度一般是16字节(128bit)。分组是什么意思呢?假设我有一段很长的明文T,我没法用AES加密整个T,只能将T分成若干16byte的明文组,接着对这些明文组逐个进行加密,得到一堆密文组,把密文组组合起来,才是最终的密文。如果T的长度并非16byte的整数倍,还需做padding,填充到16byte的整数倍。
AES的密钥长度则必须是16byte(对应AES-128)、24byte(对应AES-192)、32byte(对应AES-256),密钥越长,暴力破解难度越大,算法的安全性更好。如果密钥长度不满足上述要求,也需做padding。
加解密模式,如EBC、CBC等。EBC只是将分组加密的密文简单组合在一起,有很多的弱点(例如密文呈现与明文一样的规律性、可以在不做密钥破译的情况下篡改密文等),不建议使用。用的比较多的是CBC模式,本文也以CBC来示例。
初始化向量,简称IV,用作干扰,IV必须是强伪随机数(java下使用SecureRandom而非Random)。CBC模式下IV的长度必须跟分组长度相同,原因是IV要用来跟第一个明文分组做异或
我们使用python3的Crypto库来写个例子:

from Crypto.Cipher import AES
from Crypto.Random.random import StrongRandom
from Crypto.Util.number import long_to_bytes
from Crypto.Hash import SHA256
from Crypto.Util.Padding import pad, unpadENC = 'utf-8'def str2byte(s: str):return s.encode(ENC)def byte2str(buf: bytes):return buf.decode(ENC)def any2byte(data):return str2byte(data) if isinstance(data, str) else dataclass AESHelper(object):"""docstring for AESHelper"""def __init__(self, key):super(AESHelper, self).__init__()self.key = any2byte(key)self.iv = 'This is an IV456'self.mode = AES.MODE_CBCdef encrypt(self, msg: str | bytes) -> bytes:encrypt_cipher = AES.new(self.key, self.mode, str2byte(self.iv))return encrypt_cipher.encrypt(pad(any2byte(msg), AES.block_size))def decrypt(self, cipher_msg: bytes) -> bytes:decrypt_cipher = AES.new(self.key, self.mode, str2byte(self.iv))return unpad(decrypt_cipher.decrypt(cipher_msg), AES.block_size)def decrypt2str(self, cipher_msg: bytes) -> str:return byte2str(self.decrypt(cipher_msg))

java的例子略有不同,需要说明的是,java8自带的加密算法只支持AES-128,要支持AES-256,得先去oracle的官网下载JCE(java加密扩展)的两个jar包:local_policy.jar和US_export_policy.jar,覆盖jre\lib\security下的同名文件(注意提前做好备份)。
java的例子如下:

//我们这里使用PKCS5Padding而非NoPadding,这样可以省掉手动明文填充的工作
private static final String AES_MODE = "AES/CBC/PKCS5Padding"; //NoPadding
private static void testCipher()
{String pwd = "helloworld";//key size必须是32字节String key = "keytoolskeytoolskeytoolskeytools";String iv = "This is an IV456";try{Cipher encryptCipher = Cipher.getInstance(AES_MODE);javax.crypto.spec.IvParameterSpec sr = new javax.crypto.spec.IvParameterSpec(iv.getBytes());SecretKey k = new SecretKeySpec(key.getBytes(), "AES");encryptCipher.init(Cipher.ENCRYPT_MODE, k, sr);byte[] encText = encryptCipher.doFinal(pwd.getBytes());Cipher decryptCipher = Cipher.getInstance(AES_MODE);decryptCipher.init(Cipher.DECRYPT_MODE, k, sr);String origin = new String(decryptCipher.doFinal(encText));System.out.println("pwd:" + origin);}catch(Exception e){e.printStackTrace();}
}    

padding

padding有一些标准的方法,例如:PKCS5Padding、PKCS7Padding。PKCS5是PKCS7的子集,其假设块大小固定为8字节。

  • ZeroPadding,数据长度不对齐时使用0填充,否则不填充
  • PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小
  • PKCS5Padding,PKCS7Padding的子集,块大小固定为8字节。

IV和key的保存

有一些要遵循的原则:

  • Key must be secret at all times (must not be anywhere near the database)
  • IV must be different for each record.
  • IV must be “indistinguishable from random” and unpredictable, preferably it must come from the same source as your AES keys; other option is to encrypt some value (different for each record) with a secret key.
  • IV needs not to be secret

所以,IV使用强随机数,跟密文一起存放即可。

那么key呢?key的存放是个难题,建议如下:

  1. 保存在文件里,对文件设置用户权限
  2. 程序启动时,由用户输入一个密码,从而获得key,这个技术称为PBE(password based encryption)

这篇关于AES加密算法说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144049

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

【机器人工具箱Robotics Toolbox开发笔记(二十)】机器人工具箱SerialLink I类函数参数说明

机器人工具箱中的SerialLink表示串联机器人型机器人的具体类。该类使用D-H参数描述,每个关节一组。SerialLink I类包含的参数如表1所示。 表1 SerialLink I类参数 参  数 意    义 参  数 意    义 plot 显示机器人的图形表示 jacobn 工具坐标系中的雅可比矩阵 plot3D 显示机器人3D图形模型 Jacob_dot