首页 > 编程知识 正文

aes加密,openssl加密算法设置函数

时间:2023-05-03 23:55:43 阅读:57910 作者:3676

这篇文章是《OpenSSL加密算法库使用系列教程》之一。 欢迎加入其他文章。

实际战争篇-OpenSSL的AES加密算法-CFB1模式1、AES配置文件2、CFB1模式1、命令行操作2、函数说明3、编程实现(1)特别注意)2) CFB1模式加解密的实现

一. AES介绍

也称为密码学中的高级加密标准(AES )高级加密标准、Rijndael加密法,是美国联邦政府采用的块加密标准。

这个标准代替了原来的DES,已经被很多人分析,在世界上广泛使用。 经过5年的评选过程,高级加密标准于2001年11月26日由美国国家标准技术研究院(NIST )发布在FIPS上

PUB 197于2002年5月26日成为有效标准。 2006年,高级加密标准成为对称密钥加密中最流行的算法之一。

AES属于对称加密算法,加解密使用同一个秘钥。

对称加密算法通常至少有四种模式: ECB、CBC、CFB和OFB。

虽然不介绍具体的加密原理,但本文主要从使用的角度进行说明。

以下命令行和编程实现基于OpenSSL开源库。 在命令行中,可以使用命令实现来解密文件,并检查编程实现是否正确。

二、CFB1模式加密反馈模式cipherfeedbackmode(CFB )。 流加密法用于面向字符的APP应用程序的加密,可以使用加密反馈模式。 在此模式下,数据以更小的单位加密。 例如,它可以是8位。 此长度小于定义的块长度(通常为64位)。

1、命令行操作使用aes-128-cfb1加密hello.txt,128位密钥为8 cc72 b 05705 D5 c 46 f 412 a F8 cbed 55 aad,初始化向量为667 b 02 a 85 c 61 c 786 def 4521

OpenSSL enc-e-AES-128-cf B1-in hello.txt-out hello.en-k8cc 72 b 05705 D5 c 46 F8 cbed 55 aad-iv 667 b 02 a 85 c 61 c 786 def 48 en解密初始化向量为667 b 02 a 85 c 61 c 786 def 4521 b 060265 e 8,解密后的文件为hello.de。

OpenSSL enc-d-AES-128-cf B1-in hello.en-out hello.de-k8cc 72 b 05705 D5 c 46 F8 cbed 55 aad-iv 667 b 02 a 85 c 61 c 786 def 4556

void AES _ cf B1 _ encrypt (constunsignedchar * in,unsigned char *out,size_t length,const AES_KEY *key,unsigned char ) 读取u参数名含义in输入数据、任意长度的out输出数据、与输入数据相同长度的length输入数据的位数、即使用输入数据长度*8keyAES_set_encrypt_key生成的Keyivec 长度必须为16字节。 num必须始终为0。 否则,断言encAES_ENCRYPT表示加密,AES_DECRYPT表示解密AES_cfb1_encrypt,并且ivec参数是常量,因为在加密过程中ivec的内容发生改变需要重新赋值后再传递

3、编程实现(1)使用加密密钥对CFB模式进行加密和解密是异常的,请务必记住。 在CFB模式下,不需要输入输入数据。 AES_cfb1_encrypt函数的length参数是输入数据的位数,即输入数据长度*8,不是字节数。 )2)实现CFB1模式的加密和解密后,函数封装如下:

/* * @ brief AES :3360 CFB1_ encrypt * cf B1模式的解密支持任意长度的明文加密。 * @param in输入数据* @param out输出结果* @param key密钥的长度必须为16/24/32字节。 否则,加密失败的* @param ivec初始向量必须是长度为16字节* @param enc true-加密。 false-解密* @return执行结果*/bool AES : CFB1_ encrypt (constqbytearrayin,QByteArray out,const QByteArray key,conty )

|| key.size() == 24 || key.size() == 32); Q_ASSERT(ivec.size() == 16); // 初始向量为16字节 // 特别注意:CFB模式加密和解密均使用加密key。 // 生成加密key AES_KEY aes_key; if (AES_set_encrypt_key((const unsigned char*)key.data(), key.size() * 8, &aes_key) != 0) { return false; } // 执行CFB1模式加密或解密 int num = 0; QByteArray ivecTemp = ivec; // ivec会被修改,故需要临时变量来暂存 int encVal = enc ? AES_ENCRYPT : AES_DECRYPT; out.resize(in.size()); // 调整输出buf大小 AES_cfb1_encrypt((const unsigned char*)in.data(), (unsigned char*)out.data(), in.size() * 8, &aes_key, (unsigned char*)ivecTemp.data(), &num, encVal); return true;}

加密过程:

生成加密key执行加密

解密过程:

生成加密key执行解密

经测试,本函数支持对任意长度输入数据进行加解密。

(3)测试代码 void createTestData(QByteArray& data, int size){ data.resize(size); for (int i = 0; i < size; i++) { data[i] = i % 128; }}void testAES(const QByteArray& data){ QByteArray plainText = data; QByteArray encryptText; QByteArray decryptText; QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad"); QByteArray ivec = QByteArray::fromHex("667b02a85c61c786def4521b060265e8"); // AES cfb1模式加密验证 AES aes; aes.cfb1_encrypt(plainText, encryptText, key, ivec, true); // 加密 aes.cfb1_encrypt(encryptText, decryptText, key, ivec, false); // 解密 qDebug() << "AES cfb1 encrypt verify" << ((decryptText == plainText) ? "succeeded" : "failed");}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍 QByteArray data; createTestData(data, 1*1024*1024+3); // 测试AES testAES(data); // 测试,直接调用OpenSSL中AES算法函数 return a.exec();}

执行结果:

本文涉及工程代码地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,谦让的月光为大家准备了丰富的学习资料,欢迎关注公众号“香蕉小蚂蚁学编程”,即可领取。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。