实战篇-OpenSSL之TripleDES加密算法-CFB64模式[通俗易懂]

本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。实战篇-OpenSSL之TripleDES加密算法-CFB64模式一、TripleDES简介二、CFB64模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB64模式加解密(3)测试代码一、TripleDES简介3DES又称TripleDES,是DES加密算法的一种模式,它使用2条不同的56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年

大家好,又见面了,我是你们的朋友全栈君。

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

一、TripleDES简介

3DES又称Triple DES,是DES加密算法的一种模式,它使用2条不同的56位的密钥对数据进行三次加密。

数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。

DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。

3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。
它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

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

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

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

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

二、CFB64模式

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

1、命令行操作

使用des-ede3-cfb对hello.txt加密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,初始化向量为667b02a85c61c786,密文为hello.en。

openssl enc -e -des-ede3-cfb -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46 -iv 667b02a85c61c786

使用des-ede3-cfb对hello.en解密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,初始化向量为667b02a85c61c786,解密后的文件为hello.de。

openssl enc -d -des-ede3-cfb -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46 -iv 667b02a85c61c786

2、函数说明

CFB64模式加密/解密:

void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out,
                            long length, DES_key_schedule *ks1,
                            DES_key_schedule *ks2, DES_key_schedule *ks3,
                            DES_cblock *ivec, int *num, int enc);
参数名称 含义
in 输入数据,长度任意
out 输出数据,长度与输入数据相等。
length 输入数据的实际长度。
ks1 使用DES_set_key_unchecked生成的Key
ks2 使用DES_set_key_unchecked生成的Key
ks3 使用DES_set_key_unchecked生成的Key
ivec 可读写的一块内存。长度必须是8字节。
enc DES_ENCRYPT代表加密, DES_DECRYPT代表解密

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

3、编程实现

(1)特别注意

  • CFB模式不需要对输入数据进行填充。

(2)实现CFB64模式加解密

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

/** * @brief TripleDES::cfb64_encrypt * CFB64模式加解密,支持对任意长度明文进行加解密。 * @param in 输入数据 * @param out 输出结果 * @param key 密钥,长度必须是24字节,否则加密失败 * @param ivec 初始向量,长度必须是8字节 * @param enc true-加密,false-解密 */
void TripleDES::cfb64_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
{ 
   
    // 检查密钥合法性(只能是24字节)
    Q_ASSERT(key.size() == 24);
    Q_ASSERT(ivec.size() == 8); // 初始向量为8字节

    // 设置key
    DES_key_schedule sch1, sch2, sch3;
    setKey(key, sch1, sch2, sch3);

    // 进行加解密
    int num = 0;
    QByteArray ivecTemp = ivec; // 此参数被自动修改,故使用局部变量传递
    int encVal = enc ? DES_ENCRYPT : DES_DECRYPT;
    out.resize(in.size()); // 调整输出buf大小
    DES_ede3_cfb64_encrypt((const unsigned char *)in.constData(),
                         (unsigned char *)out.data(),
                         in.size(), &sch1, &sch2, &sch3,
                         (DES_cblock *)ivecTemp.data(), &num, encVal);
}

加解密过程:

  • 生成key
  • 执行加解密

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

(3)测试代码

void createTestData(QByteArray& data, int size)
{ 
   
    data.resize(size);
    for (int i = 0; i < size; i++)
    { 
   
        data[i] = i % 128;
    }
}

void testTripleDES(const QByteArray& data)
{ 
   
    QByteArray plainText = data;
    QByteArray encryptText;
    QByteArray decryptText;

    QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46");
    QByteArray ivec = QByteArray::fromHex("667b02a85c61c786");

    // TripleDES cfb64模式加密验证
    TripleDES tripleDES;
    tripleDES.cfb64_encrypt(plainText, encryptText, key, ivec, true);    // 加密
    tripleDES.cfb64_encrypt(encryptText, decryptText, key, ivec, false); // 解密
    qDebug() << "TripleDES cfb64 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);

    // 测试TripleDES
    testTripleDES(data);

    return a.exec();
}

执行结果:

在这里插入图片描述

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


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

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

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126942.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 全网最硬核解读计算机启动原理

    全网最硬核解读计算机启动原理

    2020年11月20日
  • 柯尼卡美能达c754e维修手册_柯尼卡美能达c3451代码

    柯尼卡美能达c754e维修手册_柯尼卡美能达c3451代码柯尼卡美能达C754、C654E打印机国产系统设置A3小册子

  • C语言数组 一维数组篇

    C语言数组 一维数组篇前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。因为是个人复习,会有部分压缩和省略。一、数组1.数组的定义:2.C语言规定:数组的每个元素都有下标,且下标是从0开始的。3.数组的使用4.数组使用时可能出现的错误越界访问:经典题型5.判断两个数组类型是否相同:…

  • 一文认识PYNQ

    零、前言PYNQ可以认为是Python+ZYNQ,但不是简单的相加。在使用上,可以说PYNQ开发是ZYNQ开发的集大成,也可以说PYNQ是ZYNQ的全栈式开发,里面涉及到的内容不仅包括FPGA设计、PS与PL的协同交互、HLS、linux驱动开发,而且还要熟悉Python开发并且使用Python各种库。PYNQ是Xilinx推出的一个开源项目,目的是使用Python开发Xilinx平台更加容易。使用Python语言和库,设计人员可以利用Xilin

  • 引入vuejs文件_引入vue文件

    引入vuejs文件_引入vue文件 一、引入vue.js文件 1.用脚本标签&lt;script&gt;引入外部vue.js文件&lt;scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"&gt;&lt;/script&gt;2.下面在一个新的 &lt;script&gt;&lt;script&gt;标签里写vue的代码&lt;script..

  • php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]

    php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]在mysql中,可以利用“DELETE”和“TRUNCATE”关键字来清空数据表中的数据,具体语法为“DELETEFROM数据表;”和“TRUNCATETABLE数据表;”。本教程操作环境:windows7系统、mysql8版、DellG3电脑。MySQL提供了DELETE和TRUNCATE关键字来删除表中的数据。MySQLDELETE关键字在MySQL中,可以使用D…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号