首页 > 编程知识 正文

如何使用aes加密,aes128加密算法破解要多久

时间:2023-05-04 00:49:06 阅读:169686 作者:584

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

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

一. AES简介

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

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

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

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

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

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

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

二. OFB128模式输出反馈模式输出模式(ofb )。 输出反馈模式与CFB类似,唯一的区别在于,在CFB中密文进入加密过程的下一个阶段,在OFB中初始化向量加密过程的输入进入加密过程的下一个阶段。

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

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

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

void AES _ ofb 128 _ encrypt (constunsignedchar * in,unsigned char *out,size_t length,const AES_KEY *key, unsigneey参数名称的含义输入数据、任意长度的out输出数据、长度与输入数据相等的length输入数据的长度、字节数key是使用AES_set_encrypt_key生成的Keyivec读写的长度必须为16字节。 num必须始终为0。 否则,断言AES_ofb128_encrypt会在加密期间更改ivec的内容。 因此,ivec参数不能是常数,并且不能在传递给加密函数后立即传递给解密函数。 必须重新赋值,然后传递给解密函数。

此函数显示标识参数enc未加密和解密。 这意味着如果in是明文,则表示正在执行加密操作。 如果in是密文,则执行解密操作,对等。

3、编程实现(1)特别注意在OFB模式的加密和解密中使用加密密钥。 这是异常的,所以请一定要记住。 在OFB模式下,不需要输入输入数据。 AES_ofb128_encrypt函数既加密又解密。 in为明文时,执行加密操作。 如果in是密文,则执行解密操作,对等。 )2)实现OFB128模式和解密以下,函数封装如下。

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

// 检查密钥合法性(只能是16、24、32字节) Q_ASSERT(key.size() == 16 || key.size() == 24 || key.size() == 32); Q_ASSERT(ivec.size() == 16); // 初始向量为16字节 // 特别注意:OFB模式加密和解密均使用加密key。 // 生成加密key AES_KEY aes_key; if (AES_set_encrypt_key((const unsigned char*)key.data(), key.size() * 8, &aes_key) != 0) { return false; } Q_UNUSED(enc); // 特别注意:加密与解密执行相同的操作 // 执行OFB128模式加密或解密 int num = 0; QByteArray ivecTemp = ivec; // ivec会被修改,故需要临时变量来暂存 out.resize(in.size()); // 调整输出buf大小 AES_ofb128_encrypt((const unsigned char*)in.data(), (unsigned char*)out.data(), in.size(), &aes_key, (unsigned char*)ivecTemp.data(), &num); return true;}

加解密过程:

生成加密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 ofb128模式加密验证 AES aes; aes.ofb128_encrypt(plainText, encryptText, key, ivec, true); // 加密 aes.ofb128_encrypt(encryptText, decryptText, key, ivec, false); // 解密 qDebug() << "AES ofb128 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


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

同时,fzdggx为大家准备了丰富的学习资料,欢迎关注公众号“sxdwn学编程”,即可领取。

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