本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

实战篇-OpenSSL之AES加密算法-CFB1模式

  • 一、AES简介
  • 二、CFB1模式
    • 1、命令行操作
    • 2、函数说明
    • 3、编程实现
      • (1)特别注意
      • (2)实现CFB1模式加解密
      • (3)测试代码

一、AES简介

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

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

对称加密算法,一般有至少4种模式,即ECB、CBC、CFB、OFB等。

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

以下命令行和编程实现,均基于OpenSSL开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

二、CFB1模式

加密反馈模式 Cipher Feedback Mode(CFB)。面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下, 数据用更小的单元加密,如可以是8 位,这个长度小于定义的块长(通常是64 位)。

1、命令行操作

使用aes-128-cfb1对hello.txt加密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,密文为hello.en。

openssl enc -e -aes-128-cfb1 -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8

使用aes-128-cfb1对hello.en解密,密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,解密后的文件为hello.de。

openssl enc -d -aes-128-cfb1 -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8

2、函数说明

AES CFB1加密/解密:

void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,size_t length, const AES_KEY *key,unsigned char *ivec, int *num, const int enc);
参数名称 含义
in 输入数据,长度任意
out 输出数据,长度与输入数据相等
length 输入数据的位数,即输入数据长度*8
key 使用AES_set_encrypt_key生成的Key
ivec 可读写的一块内存。长度必须是16字节。
num 应总是为0,否则会触发断言
enc AES_ENCRYPT 代表加密, AES_DECRYPT代表解密

AES_cfb1_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

3、编程实现

(1)特别注意

  • CFB模式加密和解密均使用加密key,这一点比较反常,务必记住。
  • CFB模式不需要对输入数据进行填充。
  • AES_cfb1_encrypt函数length参数,为输入数据的位数,即输入数据长度*8,而不是字节数。

(2)实现CFB1模式加解密

下面,函数已经封装完毕,如下:

/*** @brief AES::cfb1_encrypt* CFB1模式加解密,支持对任意长度明文进行加解密。* @param in 输入数据* @param out 输出结果* @param key 密钥,长度必须是16/24/32字节,否则加密失败* @param ivec 初始向量,长度必须是16字节* @param enc true-加密,false-解密* @return 执行结果*/
bool AES::cfb1_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
{// 检查密钥合法性(只能是16、24、32字节)Q_ASSERT(key.size() == 16 || key.size() == 24 || key.size() == 32);Q_ASSERT(ivec.size() == 16); // 初始向量为16字节// 特别注意:CFB模式加密和解密均使用加密key。// 生成加密keyAES_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);// 测试AEStestAES(data);     // 测试,直接调用OpenSSL中AES算法函数return a.exec();
}

执行结果:

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


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

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

实战篇-OpenSSL之AES加密算法-CFB1模式相关推荐

  1. 实战篇-OpenSSL之AES加密算法-CFB8模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之AES加密算法-CFB8模式 一.AES简介 二.CFB8模式 1.命令行操作 2.函数说 ...

  2. 实战篇-OpenSSL之AES加密算法-CFB128模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之AES加密算法-CFB128模式 一.AES简介 二.CFB128模式 1.命令行操作 2 ...

  3. 实战篇-OpenSSL之AES加密算法-ECB模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之AES加密算法-ECB模式 一.AES简介 二.ECB模式 1.命令行操作 2.函数说明 ...

  4. 实战篇-OpenSSL之TripleDES加密算法-ECB模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之TripleDES加密算法-ECB模式 一.TripleDES简介 二.ECB模式 1.命 ...

  5. 实战篇-OpenSSL之TripleDES加密算法-CFB64模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之TripleDES加密算法-CFB64模式 一.TripleDES简介 二.CFB64模式 ...

  6. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密 ...

  7. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...

  8. OpenSSL之调用EVP框架实现AES多种加密模式

    OpenSSL之调用EVP框架实现AES多种加密模式 一.OpenSSL EVP简介 二.EVP中对称加密与解密流程 三.通过EVP实现AES多种加密模式 四.测试代码 原文链接: https://b ...

  9. php openssl支持的加密算法和加密模式及加密解密示范实例

    <style> textarea{width:88%;height:188px;} </style><?php // 定义要加密的数据 $data = '我是中文@Thi ...

最新文章

  1. ECLIPSE 调试F8-------运行到下一断点处 F5-------STEP INTO F6-------STEP OVER
  2. jar包不用java命令_使不能运行的JAR文件可以使用java -jar运行
  3. Flask学习-Flask app接受第一个HTTP请求
  4. linux 添加路由_在 Linux 上使用开源软件创建 SDN | Linux 中国
  5. c/c++笔试面试题(1)
  6. 强一致性、弱一致性、最终一致性
  7. 兄弟mfc9140cdn无法识别_我共享了Brother打印设备。现在只能打印但无法扫描,该如何解决? .| Brother...
  8. AFURLRequestSerialization
  9. termios结构体详解
  10. 项目集锦 | 易基因近期m6A甲基化(MeRIP-seq)研究成果
  11. UNews | 1.8亿!优维科技完成C轮融资!
  12. c51语言访问绝对地址的方法,51单片机绝对地址访问的两种方法
  13. TMO (time-triggered message-triggered object)
  14. 计算机硬件更新快,频繁更新电脑硬件驱动程序到底好不好?真相在此
  15. python数据处理--按照数据差值大小进行聚类(归类)
  16. 网罗软件测试知识体系汇总
  17. 游戏音效分类以及运用场景
  18. 【Unity】DnSpy断点调试Unity已发行游戏的dll
  19. Zigbee——协调器组建网络
  20. Samung Galaxy III I535 黑砖救活经过

热门文章

  1. 大数乘法(华为勇敢星第三题)
  2. 数据库的逻辑结构设计步骤
  3. ReentrantLock 实现原理(公平锁和非公平锁)
  4. SQLZOO习题详解(01)——SQLZOO简介
  5. python 取余问题(%)详解
  6. 机器人植入情感芯片利与弊_一个机器人被植入有感情的芯片,喜欢上教授的妻子,什么电影...
  7. 自动驾驶场景要求(速度方面和检测速度方面)
  8. servlet过滤器中的注解配置详解
  9. C#开发,.NET生成单文件运行程序
  10. 不下载软件批量文件重命名或加前缀