封装DES_CBC加解密算法实现PKCS7填充

#include <iostream>
#include <openssl/des.h>
using namespace std;

//交易数据
struct Slip
{
    char from[16] = { 0 };  //A=>B 10000
    char to[16] = { 0 };    //篡改为 B=>A 10000
    long long amount = 0;
};
static const_DES_cblock key = "1234567";
static DES_key_schedule key_sch;

void EnSlip(const Slip& s, unsigned char* out, int &out_size)
{
    int size = sizeof(s);
    auto p = (const unsigned char*)&s;
    auto o = out;
    DES_set_key(&key, &key_sch);
    for (int i = 0; i < size; i += 8)
    {
        DES_ecb_encrypt((const_DES_cblock*)p,   //输入数据
            (DES_cblock*)o,                     //输出数据
            &key_sch,                           //秘钥
            DES_ENCRYPT                         //1 加密
        );
        p += 8;
        o += 8;
        out_size += 8;
    }
    //补充数据。。。
}

void DeSlip(const unsigned char* in, int size, Slip& s)
{
    auto p = (const unsigned char*)in;
    auto o = (unsigned char*)&s;
    DES_set_key(&key, &key_sch);
    for (int i = 0; i < size; i += 8)
    {
        DES_ecb_encrypt((const_DES_cblock*)p, (DES_cblock*)o, &key_sch, DES_DECRYPT);
        p += 8;
        o += 8;
    }
}


void AttackSlip(unsigned char* out)
{
    //修改密文 from 和to 对调
    unsigned char tmp[1024] = { 0 };
    //from
    memcpy(tmp, out, 16);
    //to copy from
    memcpy(out, out + 16, 16);
    memcpy(out + 16, tmp, 16);
}

void EnSlipCBC(const Slip& s, unsigned char* out, int& out_size)
{
    int size = sizeof(s);
    auto p = (const unsigned char*)&s;
    auto o = out;
    DES_set_key(&key, &key_sch);
    DES_cblock iv = { 0 };// 初始化向量
    out_size = size;
    //数据如果不是8的倍数,会补0
    if (size % 8 != 0)
    {
        //补充0
        out_size = size + (8 - size * 8);
    }
    DES_cbc_encrypt(
        p,              //输入
        o,              //输出
        sizeof(s),      //输入数据的大小
        &key_sch,       //秘钥
        &iv,            //初始化向量 DES_cbc_encrypt 调用后值不变
                        //DES_ncbc_encrypt 保存上次的值
        DES_ENCRYPT     //加密
    );
}
void DeSlipCBC(const unsigned char* in, int size, Slip& s)
{
    DES_cblock iv = { 0 };// 初始化向量
    DES_set_key(&key, &key_sch);
    //如果补0了 解密后无法知道实际大小,需要用户存储原数据大小
    DES_cbc_encrypt(in, (unsigned char*)&s, size, &key_sch, &iv, DES_DECRYPT);
}
#include "xsec.h"


int main(int argc, char* argv[])
{
    {

        unsigned char data[] = "123456789";
        unsigned char out[1024] = { 0 };
        unsigned char out2[1024] = { 0 };
        XSec sec;
        // ECB加密
        sec.Init(XDES_ECB, "12345678", true);
        cout << "=========== DES ECB =========== " << endl;
        cout << sizeof(data) << "[" << data <<"]"<< endl;
        int size = sec.Encrypt(data, sizeof(data), out);
        cout << size << ":" << out << endl;
        
        //ECB解密
        sec.Init(XDES_ECB, "12345678", false);
        size = sec.Encrypt(out, size, out2);
        cout << size << "|[" << out2 <<"]"<< endl;

        //CBC加密
        sec.Init(XDES_CBC, "12345678", true);
        cout << "=========== DES CBC =========== " << endl;
        size = sec.Encrypt(data, sizeof(data), out);
        cout << size << ":" << out << endl;

        //CB解密
        sec.Init(XDES_CBC, "12345678", false);
        size = sec.Encrypt(out, size, out2);
        cout << size << "|[" << out2 << "]" << endl;

        getchar();
    }
    {
        unsigned char out[1024] = { 0 };
        int out_size = 0;
        Slip  s1 = { "USER_A","USER_B",10000 };
        cout << "s1 from:" << s1.from << endl;
        cout << "s1 to:" << s1.to << endl;
        cout << "s1 amount:" << s1.amount << endl;
        EnSlip(s1, out, out_size);
        cout << "En:"<< out_size<<"|" << out << endl;


        //攻击密文
        AttackSlip(out);

        Slip s2;
        DeSlip(out, out_size, s2);
        cout << "s2 from:" << s2.from << endl;
        cout << "s2 to:" << s2.to << endl;
        cout << "s2 amount:" << s2.amount << endl;

        Slip s3;
        EnSlipCBC(s1, out, out_size);
        
        //攻击密文
        AttackSlip(out);

        DeSlipCBC(out, out_size, s3);
        cout << "s3 from:" << s3.from << endl;
        cout << "s3 to:" << s3.to << endl;
        cout << "s3 amount:" << s3.amount << endl;
    }

    unsigned char data[] = "1234567";
    unsigned char out[1024] = { 0 };
    unsigned char out2[1024] = { 0 };

    
    //1设置秘钥
    DES_set_key(&key, &key_sch);
    
    //数据加密 8字节
    DES_ecb_encrypt((const_DES_cblock*)data, (DES_cblock*)out, &key_sch, DES_ENCRYPT);
    cout << out << endl;
    
    //数据解密
    DES_ecb_encrypt((const_DES_cblock*)out, (DES_cblock*)out2, &key_sch, DES_DECRYPT);
    cout << out2 << endl;

    getchar();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值