超级好用的C++实用库之Des加解密

简介: 超级好用的C++实用库之Des加解密

概述

DES(Data Encryption Standard,数据加密标准)是一种历史悠久的对称密钥加密算法,由IBM公司在1970年代设计,并于1977年被美国国家标准局选作联邦资料处理标准。DES使用56位密钥对64位的数据块进行操作,经过16轮迭代的替换、置换和异或运算后,将明文转换成长度相同的密文。

DES加解密过程主要包括以下几个步骤。

1、密钥预处理:原始的56位密钥首先通过PC-1置换进行初步变换,然后分为左右两部分(各28位),并分别循环左移不同数量的位数,最终组合生成16个子密钥。

2、加密过程。

(1)初始置换(IP):对输入的64位明文块执行初始置换。

(2)16轮迭代:每一轮迭代包含以下四个步骤:

 a、子密钥选择:根据当前轮数从16个子密钥中选取一个。

 b、扩展置换(E盒):对上一轮的结果进行扩展置换,将其扩展至48位。

 c、异或操作:将扩展后的结果与当前子密钥进行异或运算。

 d、S盒代替与P盒置换:将异或后的结果送入S盒进行非线性替换运算,然后再通过P盒进行线性置换。

(3)最终置换(FP):完成16轮迭代后,对结果执行最终置换得到64位密文。

3、解密过程:解密实际上是对加密过程的逆向操作。同样经历初始置换、16轮迭代(但子密钥的使用顺序是反向的),最后通过最终置换得到明文。

CHP_Des类

为了方便使用des加解密算法,我们封装了CHP_Des类。CHP_Des类提供了初始化、设置Key、加密、解密等四个接口。CHP_Des类的头文件,可参考下面的示例代码。

#pragma once

class CHP_Des
{
public:
    CHP_Des();
    ~CHP_Des();

    enum IDesCodecMode
    {
        DesCodecMode_Standard,                                
        DesCodecMode_Speed,
        DesCodecMode_IndependentSubKey
    };

    void Init(IDesCodecMode mode = DesCodecMode_Standard);
    
    int SetKey(char *pKey);
    
    int Encrypt(char *pData, int nDataLen);
    
    int Decrypt(char *pData, int nDataLen);

private:
    typedef struct _TDesCodecInfo
    {
        int puiSP[8][64];
        char pInitialPerm[16][16][8];
        char pFinalPerm[16][16][8];
        unsigned char pSubKeys[16][8];
        IDesCodecMode mode;
    }TDesCodecInfo;

    void EncryptOneRound(char *pBlock);
    void DecryptOneRound(char *pBlock);

    static unsigned int ByteSwap(unsigned int uiData);
    static void PermInit(char pPerm[16][16][8], char pIP[64]);
    static void SpInit(TDesCodecInfo &dci);
    static void Permute(char* pInBlock, char pPerm[16][16][8], char* pOutBlock);
    static int Feeding(TDesCodecInfo& dci, unsigned int uiData, unsigned char pSubKey[8]);
    static void Round(TDesCodecInfo& dci, int nNum, unsigned int* pBlock);

private:
    TDesCodecInfo m_dci;
};

在上面的示例代码中,我们声明了一个枚举类型IDesCodecMode,用于表示Des算法的加解密模式。

DesCodecMode_Standard:标准模式。

DesCodecMode_Speed:速度模式,没有初始置换(IP)和最终置换(FP)。

DesCodecMode_IndependentSubKey:独立模式,没有置换,密钥长度为128字节。

下面,我们逐个介绍CHP_Des类导出的公共接口。

Init:初始化函数。参数mode为加解密模式,一般默认为标准模式即可。

SetKey:设置加解密的密钥。参数pKey为密钥,标准模式和速度模式时,密钥长度为8个字节;独立模式时,密钥长度为128个字节。返回值为0表示成功,其他为错误码。

Encrypt:加密数据,函数返回后,pData为加密过的数据。参数pData为要加密的数据,参数nDataLen为要加密的数据的长度。返回值为0表示成功,其他为错误码。

Decrypt:解密数据,函数返回后,pData为解密过的数据。参数pData为要解密的数据,参数nDataLen为要解密的数据的长度。返回值为0表示成功,其他为错误码。


相关文章
|
27天前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
418 2
|
30天前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
87 11
|
1月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
1月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
250 2
|
2月前
|
并行计算 C++ Windows
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
311 6
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
262 10
|
11月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
245 4
2023/11/10学习记录-C/C++对称分组加密DES
|
10月前
|
JSON C++ 数据格式
C++20 高性能基础库--兰亭集库助力开发者构建高性能应用
这次分享的主题是《高性能基础库--兰亭集库助力开发者构建高性能应用》的实践经验。主要分为三个部分: 1. 业务背景 2. 雅兰亭库架构 3. 业务优化
289 9