OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

image.png

image.png

image.png

image.png

image.png

  • 对称分组加密常用算法:

·DES
·3DES
·AES

·国密SM4

  • 对称分组加密应用场景:

文件或者视频加密

加密比特币私钥

消息或者配置项加密

SSL通信加密

对称分组加密

使用异或实现一个简易的对称加密算法

A明文 B秘钥
AB=密文AB
(AB)B =A

密码补全和初始化
数据补全策略:PADDING_PKCS7(补其他) PADDING_ZERO(补0)

举例:

block = 8

12345678 9
12345678 90000000 ZERO

12345678 97777777 PKCS7

更详细请看:DES加密初探 - 乙太的小屋 (52ying.top)DES算法填充方式

#include <iostream>using namespace std;//对称加解密数据
//@para data 输入数据
//@para data_size 输入数据大小
//@para out 输出数据
//@para pass 密钥
//@para pass_size 密钥长度
//@return  加解密后数据大小
#define XOR_BLOCK 8
int XorCipher(const unsigned char* data, int data_size,unsigned char* out,const unsigned char* pass,int pass_size
) 
{static const char iv[] = "abcdefgt";//初始化密钥auto p = *(unsigned long long*)iv;//密钥补全,并且异或初始化向量//密钥小于XOR_BLOCK或者大于XOR_BLOCKfor (int i = 0; i < pass_size; i += XOR_BLOCK){unsigned long long tmp = 0;int size = XOR_BLOCK;//密钥小于 XOR_BLOCKif (pass_size - i < XOR_BLOCK) {size = pass_size - i;}memcpy(&tmp, (pass + i), size);p = (p ^ tmp);}//数据源转换成8字节数据类型auto d = (unsigned long long*)data;//输出数据auto o = (unsigned long long*)out;//数据分组处理int i = 0;for (; i < data_size / XOR_BLOCK; i++){o[i] = (d[i] ^ p);}//输入数据的补充int mod = data_size % XOR_BLOCK;if (mod != 0){unsigned long long tmp = 0;memcpy(&tmp, (d + i), mod);}int re_size = data_size;return re_size;
}int main1(int argc, char* argv[])
{unsigned char data[] = "测试加解密数据TEST123测试";unsigned char out[1024] = { 0 };unsigned char out2[1024] = { 0 };unsigned char pass[] = "12345678";int pass_size = strlen((char*)pass);int len = XorCipher(data, sizeof(data),out, pass, pass_size);cout << len << "|"<<out << endl;len = XorCipher(out, len, out2, pass, pass_size);cout << len << "|" << out2 << endl;return 0;
}

DES_ECB攻击

#include <iostream>
#include <openssl/des.h>
using namespace std;//交易数据
struct Slip
{char from[16] = { 0 }; //A=>B 10000char to[16] = { 0 };	//篡改为B=> 10000long 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)
{const 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);p += 8;o += 8;out_size += 8;}
}void AttackSlip(unsigned char* out)
{//修改秘文的from和to对调unsigned char tmp[1024] = { 0 };//frommemcpy(tmp, out, 16);memcpy(out, out + 16, 16);memcpy(out + 16, tmp, 16);}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;}
}int main()
{{unsigned char out[1024] = { 0 };int out_size = 0;Slip s1 = { "USER_A","USER_B",10000 };cout << "s2 from: " << s1.from << endl;cout << "s2 to: " << s1.to << endl;cout << "s2 ammout: " << s1.amount << endl;EnSlip(s1, out, out_size);cout << "En:"<< out_size <<"---->" << out << endl;//攻击密文1AttackSlip(out);Slip s2;DeSlip(out, out_size, s2);cout << "s2 from: " << s2.from << endl;cout << "s2 to: " << s2.to << endl;cout << "s2 ammout: " << s2.amount << endl;}unsigned char data[] = "1234567";//数据unsigned char out[1024] = { 0 };//输出数据unsigned char out2[1024] = { 0 };//1.设置密钥DES_set_key(&key, &key_sch);//数据加密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;
}
DES_CBC
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 };//初始化向量//初始化向量 DES_cbc_encrypt 调用后值不变    DES_ncbc_encrypt保存上次的值//如果数据不是8的倍数,会自动补0if (size % 8!= 0){out_size = size + (8 - size % 8);}DES_cbc_encrypt(p, o, sizeof(s), &key_sch, &iv,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);
}
int main()
{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 ammout: " << s3.amount << endl;
}

封装DES实现CBC和ECB的PKCS7Padding分块填充

#pragma once
#include <string>
#include <openssl/des.h>
//枚举类型
enum XSecType
{XDES_ECB,XDES_CBC
};/*
Xsec sec;
sec.Init(XDES_ECB,"12345678",ture);
*/
class  XSec
{
public:/// 初始化加密对象/// <param name="type">加密类型</param>/// <param name="pass">密钥,可以是二进制</param>/// <param name="is_en">true加密,false解密</param>/// 是否成功virtual bool Init(XSecType type, const std::string& pass, bool is_en);/// <summary>/// 加解密数据/// </summary>/// <param name="in">输入数据</param>/// <param name="in_size">数据大小</param>/// <param name="out">输出数据</param>/// <returns>成功返回加解密后数据大小,失败返回0</returns>virtual int Encrypt(const unsigned char* in, int in_size, unsigned char* out);private:/// <summary>///DES_ECB加密模式/// </summary>int EnDesECB(const unsigned char* in, int in_size, unsigned char* out);//DES_ECB解密模式int DeDesECB(const unsigned char* in, int in_size, unsigned char* out);///DES_CBC加密模式/// </summary>int EnDesCBC(const unsigned char* in, int in_size, unsigned char* out);//DES_CBC解密模式int DeDesCBC(const unsigned char* in, int in_size, unsigned char* out);//加密算法密钥DES_key_schedule ks_;//加秘算法类型XSecType type_;bool is_en_;//数据块分组大小int block_size_ = 0;//初始化向量unsigned char iv_[128] = { 0 };
};

#include "xsec.h"
#include <iostream>
using namespace std;bool XSec::Init(XSecType type, const std::string& pass, bool is_en)
{this->type_ = type;this->is_en_ = is_en;this->block_size_ = DES_KEY_SZ;//初始化iv_memset(iv_, 0, sizeof(iv_));const_DES_cblock key = { 0 };//密码策略,超出8字节丢弃,少的补充0int key_size = pass.size();if (key_size > block_size_) key_size = block_size_;memcpy(&key, pass.data(), key_size);DES_set_key(&key, &ks_);return true;
}int XSec::Encrypt(const unsigned char* in, int in_size, unsigned char* out)
{if(type_ == XDES_ECB)if (is_en_){return EnDesECB(in, in_size, out);}else {return DeDesECB(in, in_size, out);}else if (type_ == XDES_CBC)if (is_en_){return EnDesCBC(in, in_size, out);}else {return DeDesCBC(in, in_size, out);}return 0;
}int XSec::EnDesECB(const unsigned char* in, int in_size, unsigned char* out)
{//数据填充PKCS7 Padding//PKCS7Padding:假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。unsigned char padding[8] = { 0 };int padding_size = block_size_ - (in_size % block_size_);//填入补充的字节大小memset(padding, padding_size, sizeof(padding));int i = 0;for ( ; i < in_size; i += block_size_){//最后一块数据,小于block_size_ 需要填充if ( in_size-i<block_size_){//填入数据memcpy(padding, in + i, in_size - i);break;}DES_ecb_encrypt((const_DES_cblock*)(in + i), (DES_cblock*)(out + i), &ks_, DES_ENCRYPT);}//补充 PKCS7结尾DES_ecb_encrypt((const_DES_cblock*)padding, (DES_cblock*)(out + i), &ks_, DES_ENCRYPT);return in_size + padding_size;
}int XSec::DeDesECB(const unsigned char* in, int in_size, unsigned char* out)
{for (int i = 0; i < in_size; i += block_size_){DES_ecb_encrypt((const_DES_cblock*)(in + i), (DES_cblock*)(out + i), &ks_, DES_DECRYPT);}return in_size - out[in_size - 1];
}int XSec::EnDesCBC(const unsigned char* in, int in_size, unsigned char* out)
{//数据填充PKCS7 Paddingunsigned char padding[8] = { 0 };int padding_size = block_size_ - (in_size % block_size_);//填入补充的字节大小memset(padding, padding_size, sizeof(padding));//ncbc保留iv修改 减去需要补充的数据DES_ncbc_encrypt(in, out, in_size - (in_size % block_size_),&ks_,(DES_cblock*)iv_,DES_ENCRYPT);//PKCS7 Paddingif (in_size % block_size_ != 0){memcpy(padding, in + (in_size - (in_size % block_size_)), in_size % block_size_);}DES_ncbc_encrypt(padding, out+(in_size - (in_size % block_size_)),sizeof(padding), &ks_, (DES_cblock*)iv_, DES_ENCRYPT);return in_size+padding_size;
}int XSec::DeDesCBC(const unsigned char* in, int in_size, unsigned char* out)
{DES_ncbc_encrypt(in, out, in_size, &ks_, (DES_cblock*)iv_, DES_DECRYPT);return in_size - out[in_size-1];
}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;cout << sizeof(data) << "[" << data << "]" << endl;size = sec.Encrypt(data, sizeof(data), out);cout << size << ":" << out << endl;//CBC解密sec.Init(XDES_CBC, "12345678", false);size = sec.Encrypt(out, size, out2);cout << size << "[" << out2 << "]" << endl;getchar();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据操作学习

1.导入torch。虽然被称为PyTorch&#xff0c;但应导入torch而不是pytorch import torch 2.张量表示一个数值组成的数组&#xff0c;这个数组可能有多个维度 xtorch.arange(12)x 3.通过张量的shape属性来访问张量的形状和张量中元素的总数 x.shape x.numel() 4.要改变张量的形…

LangGraph - Hierarchical Agent Teams

本文翻译整理自 Hierarchical Agent Teams https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/ 文章目录 一、前言二、设置三、创建工具四、Helper Utilities五、定义代理 Team研究 Team文档写作Team 六、添加图层 一、前言 在前面的…

【高阶数据结构】揭开红黑树‘恶魔’的面具:深度解析底层逻辑

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;二叉搜索树AVL树 大家好&#xff0c;我是店小二&#xff0c;欢迎来到本篇内容&#xff01;今天我们将一起探索红黑树的工作原理及部分功能实现。红黑树的概念相对抽象&#xff0c;但只要我们一步步深入…

Java使用HttpClient5实现发送HTTP请求

1、HttpClient5 的介绍 HttpClient5 是 Apache HttpComponents 项目中的一个重要组件&#xff0c;它是一个功能齐全且高度可定制的 HTTP 客户端库&#xff0c;专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。 以下是对 HttpClient5 的详细介绍&#xff1a…

部署Qwen2.5-7b大模型详解

部署Qwen2.5-7b大模型详解 本文参考教程&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html 下载模型 https://modelscope.cn/organization/qwen 搜索 qwen2.5-7b 可以看到它提供了六个模型&#xff0c;以满足不同的需求&#xff0c;从下…

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

【MATLAB代码,带TDOA数据导入】TDOA三维空间的位置(1主锚点、3副锚点),多个时间点、输出位置的坐标

TDOA介绍 TDOA&#xff08;到达时间差&#xff09;是一种用于定位和跟踪信号源的技术&#xff0c;常用于无线通信、导航和雷达系统。它通过测量信号到达不同接收器的时间差&#xff0c;来计算信号源的位置。 基本原理 TDOA的基本原理是利用多个接收器&#xff08;或锚点&…

Power BI - 设置Waterfall Chart第一个Pillar的颜色

1.简单介绍 有的用户可能会单独设置Column Chart&#xff08;条形图&#xff09;的第一个柱子的颜色&#xff0c;如下图所示&#xff0c; 这种其实可以通过Column Chart的Conditional formating进行设置&#xff0c; - SWICH SELECTEDVALUE 或者也可以直接对单独的Column进行…

用户界面设计:视觉美学与交互逻辑的融合

1、什么是用户界面 用户界面&#xff08;UI&#xff09;是人与机器之间沟通的桥梁&#xff0c;同时也是用户体验&#xff08;UX&#xff09;的重要组成部分。用户界面设计包括两个核心要素&#xff1a;视觉设计&#xff08;即产品的外观和感觉&#xff09;和交互设计&#xff…

CSS 入门

1. CSS 1.1 概念 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表&#xff0c;用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的样式和结构分离&#xff08;类似于…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…

十大云手机排行榜:哪个云手机更好用?

近些年&#xff0c;市场上涌现出许多云手机产品&#xff0c;不同产品适合的应用场景也各不相同。在选用云手机之前&#xff0c;企业和个人用户需要了解它们的功能、特点以及适用的场景。本文将对当前主流的云手机进行对比&#xff0c;帮助大家挑选出最适合的云手机产品。 1. 红…

【数据结构与算法】之链表详解

链表是一种常用的数据结构&#xff0c;它是一种线性数据结构&#xff0c;但与数组不同&#xff0c;它并非连续存储数据&#xff0c;而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性&#xff0c;使其在某些…

九种排序,一次满足

我们在算法题进行练习提升时&#xff0c;经常会看到题目要求数据从大到小输出&#xff0c;从小到大输出&#xff0c;前一半从小到大输出&#xff0c;后一半从大到小输出等&#xff0c;那么这时候就需要用到排序算法&#xff0c;通过排序算法将数据按照一定的顺序进行排序。本文…

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后&#xff0c;这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/…

设计模式之-策略模式配合枚举

1、定义枚举接收不同的参数使用不同的handler, 2、定义个handerl接口&#xff0c;统一方法处理&#xff0c;每个handler实现该接口 public interface IMethodHandler<T, R> {/*** 处理统一入口** param req*/R process(T req); } java3、定义一个简单工厂统一处理 Comp…

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了,零基础入门到精通,收藏这一篇就够了

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xf…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…

RTSP流图片采样助手(yolov5)

在监控和视频分析领域&#xff0c;实时采样视频流中的图像数据是十分重要的。本文将介绍一个基于Python和Tkinter构建的RTSP流图片采样助手的设计与实现&#xff0c;旨在简化RTSP流的采样过程&#xff0c;并支持根据用户定义的特殊标签进行筛选。 项目概述 该项目的主要功能包…

Data+AI下的数据湖和湖仓一体发展史

DataAI下的数据湖和湖仓一体发展史 前言数据湖的“前世今生”AI时代的救星&#xff1a;湖仓一体湖仓一体实践演进未来趋势&#xff1a;智能化、实时化结语 前言 数据湖&#xff1f;湖仓一体&#xff1f;这是什么高科技新名词&#xff1f; 别急&#xff0c;我们慢慢聊。想象一…