20.3 OpenSSL 对称AES加解密算法
AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以128
比特为一个分组进行加密,其密钥长度可以是128
比特、192
比特或256
比特,因此可以提供不同等级的安全性。该算法采用了替代、置换和混淆等技术,以及多轮加密和密钥扩展等机制,使得其加密效果优秀,安全性高,被广泛应用于各种领域中,如数据加密、文件加密、网络安全等。
AES算法加密和解密使用的密钥是相同的,该算法加密和解密速度较快,适用于对大量数据进行加密解密的场景。在实际应用中,通常采用混合加密方式,即使用RSA算法加密对称加密算法中的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。
AES算法常用两种加密模式,即CBC和ECB模式,它们分别具有不同的优缺点。
ECB(Electronic Codebook,电子密码本)模式是最简单的分组密码工作模式,将每个明文块独立加密,同样的密钥加密同样的明文块得到的密文也是一样的,因此容易被攻击者利用重复的密文进行分析破解。ECB模式加密效率高,适用于短报文加密,但不适用于长报文加密。
CBC(Cipher Block Chaining,密码块链)模式是一种分组密码工作模式,先将明文分组,然后对每个分组进行加密,加密时使用上一块密文作为输入,因此相同的明文块在不同位置上得到的密文是不同的,可以防止被攻击者利用重复的密文进行分析破解。CBC模式加密效率较低,但适用于长报文加密,因为不同的明文块之间互相影响,增加了安全性。
在实际应用中,通常采用CBC
模式进行加密,因为它比ECB
模式更安全,但加密效率较低。此外,还有其他的加密模式,如CFB、OFB、CTR
等,不同的加密模式适用于不同的场景,需要根据实际需求进行选择。
OpenSSL库提供了对AES
加密的支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用的一些函数总结,其中aes_cbc_encrypt
函数用于使用CBC模式对特定字符串加密,aes_cbc_decrypt
则使用CBC模式对字符串进行解密,第二个函数AES
函数则是使用OpenSSL
库默认的加解密函数二次封装实现的。
#include <iostream>
#include <openssl/err.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <openssl/pem.h>
extern "C"
{
#include <openssl/applink.c>
}
#pragma comment(lib,"libssl_static.lib")
#pragma comment(lib,"libcrypto.lib")
// CBC模式加密
int aes_cbc_encrypt(char* in, char* key, char* out)
{
if (!in || !key || !out)
return 0;
unsigned char iv[AES_BLOCK_SIZE];
for (int i = 0; i < AES_BLOCK_SIZE; ++i)
iv[i] = 0;
AES_KEY aes;
if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len = strlen(in);
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);
return 1;
}
// CBC模式解密
int aes_cbc_decrypt(char* in, char* key, char* out)
{
if (!in || !key || !out)
return 0;
// 加密的初始化向量
unsigned char iv[AES_BLOCK_SIZE];
// iv一般设置为全0
for (int i = 0; i < AES_BLOCK_SIZE; ++i)
iv[i] = 0;
AES_KEY aes;
if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
{
return 0;
}
int len = strlen(in);
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT);
return 1;
}
// 将加密与解密整合在一起
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{
if (strcmp(Type, "encode") == 0)
{
AES_KEY AESEncryptKey;
AES_set_encrypt_key(key, 256, &AESEncryptKey);
AES_encrypt(InBuff, OutBuff, &AESEncryptKey);
}
else if (strcmp(Type, "decode") == 0)
{
AES_KEY AESDecryptKey;
AES_set_decrypt_key(key, 256, &AESDecryptKey);
AES_decrypt(InBuff, OutBuff, &AESDecryptKey);
}
}
有了上述算法封装,接下来笔者将依次演示这几种不同的加密函数是如何被应用的,首先简单介绍一下aes_cbc_encrypt
与aes_cbc_decrypt
这两个函数都是自己封装的AES加解密算法,这两个算法参数传递保持一致,第一个参数都是指定需要加密的缓冲区,第二个参数则是指定加密所使用的key,第三个参数是处理后的结果。
int main(int argc, char* argv[])
{
char szBuffer[1024] = "hello lyshark";
char szDst[1024] = { 0 };
char szSrc[1024] = { 0 };
// 计算一串密钥
char key[AES_BLOCK_SIZE] = { 0 };
for (int x = 0; x < AES_BLOCK_SIZE; x++)
{
key[x] = 32 + x;
}
// AES加密
if (aes_cbc_encrypt(szBuffer, key, szDst) != 0)
{
std::cout << "加密后长度: " << strlen(szDst) << std::endl;
}
// AES解密
if (aes_cbc_decrypt(szDst, key, szSrc) != 0)
{
std::cout << "解密内容: " << szSrc << std::endl;
}
system("pause");
return 0;
}
上述代码片段则是通过AES实现对数据加解密处理的功能,如下是这段代码的输出效果;
第二种调用方式是采用API
实现,其中的AES
函数,通过AES_set_encrypt_key
设置加密密钥,并直接调用AES_encrypt
实现数据加密,反之,通过AES_set_decrypt_key
设置解密密钥,并调用AES_decrypt
解密,这段代码调用方式如下所示;
int main(int argc, char* argv[])
{
unsigned char Buffer[1024] = "hello lyshark";
unsigned char EncodeBuf[1024] = { 0 };
unsigned char DecodeBuf[1024] = { 0 };
unsigned char aes_key[32] = { 0 };
// 随机生成密钥
for (int x = 0; x < 32; x++)
{
int ch = rand() % 5;
aes_key[x] = (char)ch;
}
AES(Buffer, EncodeBuf, (unsigned char *)aes_key, (char*)"encode");
std::cout << "加密数据长度: " << strlen((char *)EncodeBuf) << std::endl;
AES(EncodeBuf, DecodeBuf, (unsigned char*)aes_key, (char*)"decode");
std::cout << "解密数据: " << DecodeBuf << std::endl;
system("pause");
return 0;
}
如上代码,通过调用AES
函数时,传入encode
实现数据加密,传入decode
实现数据解密,如下图所示;
20.3 OpenSSL 对称AES加解密算法的更多相关文章
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...
- AES加解密算法
直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...
- 最强加密算法?AES加解密算法Matlab和Verilog实现
目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...
- 【加解密专辑】对接触到的PGP、RSA、AES加解密算法整理
先贴代码,有空再整理思路 PGP加密 using System; using System.IO; using Org.BouncyCastle.Bcpg; using Org.BouncyCastl ...
- Aes 加解密算法
public class AesHelper { /// <summary> /// 生成128位的随机AES秘钥 /// </sum ...
- PHP完整的AES加解密算法使用及例子(256位)
依赖PHP自身的mcrypt扩展 <?php class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default ...
- C#与java中的AES加解密互解算法
一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...
- RSA,AES加解密算法的实现
目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...
- Openssl aes加解密例程 更进一步
原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...
随机推荐
- 【git】基于JGit通过ssh-url拉取指定commit-id的代码
实现 1️⃣ pom依赖: <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>o ...
- Microsoft edge锁定在任务栏上,被修改主页360的解决方法
今天从桌面下边的任务栏打开Microsoft edge浏览器,突然发现主页被篡改为360导航了(生气!恶龙咆哮ooo 在桌面上是Microsoft edge,固定到任务栏就成为Microsoft ed ...
- 删除 /tmp 目录下长时间未访问的文件
#!/bib/bash DIR=/tmp cd $DIR || { echo "Dir not Found: $Dir" exit } echo "Delete a fi ...
- 微服务性能分析工具 Pyroscope 初体验
Go 自带接口性能分析工具 pprof,较为常用的有以下 4 种分析: CPU Profiling: CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主 ...
- pyqt5中的布局方法
addLayout():用于在布局中插入子布局 addWidget():用于在布局中插入控件
- 在Java中List, Set, Map是否继承自Collection接口?
List和Set是继承自Collection接口的接口,Set不允许重复的项目,List允许重复项目, Set接口派生的类有TreeSet,HashSet,LinkedHashSet. List接口派 ...
- 在Volo.Abp微服务中使用SignalR
假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能 创建SignalR服务 在项目中引用 abp add-package Volo.Abp.AspNetCore.SignalR 在Mo ...
- Dirty-Pipe Linux内核提权漏洞(CVE-2022-0847)
前言: 划水一波,哈哈,以后复现漏洞不再直接傻瓜无脑的走流程了,首先码字写加构思比较麻烦且写的不多还效率不高,现在就是当做见到了一个漏洞,在此记录一下这个漏洞,包括其来源,简单的描述,适用范围,以及其 ...
- 【技术积累】Linux中的命令行【理论篇】【六】
as命令 命令介绍 在Linux中,as命令是一个汇编器,用于将汇编语言源代码转换为可执行的目标文件.它是GNU Binutils软件包的一部分,提供了一系列用于处理二进制文件的工具. 命令说明 as ...
- Web通用漏洞--文件包含
Web通用漏洞--文件包含 文件包含原理 在项目开发过程中,开发人员通常会将重复使用的函数写入单个文件中,在使用该类函数时,直接调用文件即可,无需重新编写,这种调用文件的过程成为文件包含.在文件包含过 ...