首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年7月10日 星期四 0:07am

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

  • 23-09-19 13:42
  • 3862
  • 6817
blog.csdn.net

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

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

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

一、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开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

二、ECB模式

电子密码本模式 Electronic Code Book(ECB)。这种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密 密钥长度相同,然后每组都用相同的密钥进行加密。

1、命令行操作

使用des-ede3-ecb对hello.txt加密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,密文为hello.en。

openssl enc -e -des-ede3-ecb -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46
  • 1

使用des-ede3-ecb对hello.en解密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,解密后的文件为hello.de。

openssl enc -d -des-ede3-ecb -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46
  • 1

2、函数说明

ECB模式加密/解密:

void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
                      DES_key_schedule *ks1, DES_key_schedule *ks2,
                      DES_key_schedule *ks3, int enc);
  • 1
  • 2
  • 3
参数名称含义
input输入数据,长度固定为8字节
output输出数据,长度与输入数据一致,固定为8字节。
ks1使用DES_set_key_unchecked生成的Key
ks2使用DES_set_key_unchecked生成的Key
ks3使用DES_set_key_unchecked生成的Key
encDES_ENCRYPT代表加密, DES_DECRYPT代表解密

3、编程实现

(1)特别注意

由于ECB模式,每次只能处理一个块的数据,即8字节,所以如果需要处理任意长度的数据,那么需要在原始数据末尾,先进行填充,使得数据长度为8的整数倍,随后再分块进行加密。解密时,也需要分块解密,最后将解密后的数据,进行取消填充。

故,建议将输入数据进行PKCS7填充后,再进行加密,以便解密时,正确还原明文数据。关于PKCS7填充,可参考《实战篇-OpenSSL之AES加密算法-ECB模式》中有介绍。

(2)实现ECB模式加解密

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

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

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

    // 进行加解密
    if (enc)
    {
        // 进行PKCS7Padding填充
        QByteArray inTemp = Padding::PKCS7Padding(in, DES_BLOCK_SIZE);

        // 执行加密
        out.resize(inTemp.size()); // 调整输出buf大小
        for (int i = 0; i < inTemp.size() / DES_BLOCK_SIZE; i++)
        {
            DES_ecb3_encrypt((const_DES_cblock*)(inTemp.constData() + i * DES_BLOCK_SIZE),
                             (DES_cblock *)(out.data() + i * DES_BLOCK_SIZE),
                             &sch1, &sch2, &sch3, DES_ENCRYPT);
        }
    }
    else
    {
        // 执行解密
        out.resize(in.size()); // 调整输出buf大小
        for (int i = 0; i < in.size() / DES_BLOCK_SIZE; i++)
        {
            DES_ecb3_encrypt((const_DES_cblock*)(in.constData() + i * DES_BLOCK_SIZE),
                             (DES_cblock *)(out.data() + i * DES_BLOCK_SIZE),
                             &sch1, &sch2, &sch3, DES_DECRYPT);
        }

        // 解除PKCS7Padding填充
        out = Padding::PKCS7UnPadding(out);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

加密过程:

  • 生成key
  • 进行PKCS7Padding填充
  • 执行加密

解密过程:

  • 生成key
  • 执行解密
  • 去除PKCS7Padding填充

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

(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 ecb模式加密验证
    TripleDES tripleDES;
    tripleDES.ecb_encrypt(plainText, encryptText, key, true);    // 加密
    tripleDES.ecb_encrypt(encryptText, decryptText, key, false); // 解密
    qDebug() << "TripleDES ecb 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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

执行结果:

在这里插入图片描述

本文涉及工程代码地址:http://iyenn.com/index/link?url=https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



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

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

在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览50757 人正在系统学习中
注:本文转载自blog.csdn.net的百里杨的文章"https://blog.csdn.net/zyhse/article/details/112433715"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top