当前位置: 首页 > news >正文

openssl+ DES开发实例(Linux)

文章目录

  • 一、DES介绍
  • 二、DES原理
  • 三、DES C++实现源码

一、DES介绍

DES(Data Encryption Standard)是一种对称密钥加密算法,最初由 IBM 设计,于1977年成为美国国家标准,用于加密非机密但敏感的政府数据。DES 使用相同的密钥进行数据的加密和解密,因此属于对称密钥加密算法。

以下是 DES 算法的一些基本特点和细节:

  1. 密钥长度: DES 使用56位的密钥,虽然实际上是64位,但其中有8位用于奇偶校验,因此实际参与加密计算的位数是56位。

  2. 分组长度: DES 将数据分成64位的块进行处理。每个64位的分组被视为一个数据块,并被输入到加密或解密算法中。

  3. 替代-置换网络(Substitution-Permutation Network,SPN): DES 使用了 SPN 结构,包括初始置换、16轮的迭代、最终置换。在每轮迭代中,都会涉及到置换、替代和异或运算。

  4. 密钥的使用: 密钥通过置换和选择运算变成16个子密钥,每个子密钥48位长。这些子密钥被用于每一轮的轮密钥加操作。

  5. 初始置换(Initial Permutation): 明文块的位被重新排列,以作为初始输入。

  6. Feistel 结构: DES 使用了 Feistel 结构,其中明文块被分成两半,然后经过一系列迭代。在每一轮中,右半部分经过一系列替代、置换和异或运算,然后与左半部分进行异或,形成新的右半部分。

  7. 扩展置换(Expansion Permutation): 在 Feistel 结构中,右半部分的位数被扩展,以便与轮密钥异或。

  8. S 盒(Substitution Box): DES 使用了8个不同的S盒,每个S盒将6位输入映射到4位输出,提供非线性性。

  9. 最终置换(Final Permutation): 最终输出的64位块通过最终置换进行重新排列。

DES 曾经是加密领域的标准,但随着计算机性能的提高和密码学攻击技术的发展,DES 的56位密钥长度变得不够安全。因此,现代加密通常使用更强大的对称密钥加密算法,如 AES。DES 已经被其后继者替代,但仍然在一些遗留系统中可能存在。

二、DES原理

DES(Data Encryption Standard)是一种对称密钥加密算法,它使用相同的密钥进行数据的加密和解密。以下是 DES 的基本原理和步骤:

  1. 密钥生成: 初始的密钥是56位,但实际上是64位,其中有8位用于奇偶校验。密钥被置换和选择生成16个子密钥,每个子密钥48位长。这些子密钥用于加密和解密的轮密钥加操作。

  2. 初始置换(Initial Permutation): 明文块被初始置换,位被重新排列形成初始输入。这个置换对输入数据进行初步的混淆。

  3. Feistel 结构: DES 使用 Feistel 结构,即将明文块分成左半部分(L0)和右半部分(R0),然后通过一系列的迭代进行处理。

  4. 迭代过程: DES 采用16轮迭代的过程。在每一轮中,右半部分(Ri)经过一系列的置换、替代和异或运算,然后与左半部分(Li-1)进行异或。这产生新的右半部分(Ri)和新的左半部分(Li)。迭代过程的主要特点是右半部分直接影响下一轮的计算。

  5. 扩展置换(Expansion Permutation): 在 Feistel 结构中,右半部分的位数被扩展,以便与轮密钥异或。

  6. S 盒替代(Substitution Box Substitution): 扩展后的右半部分被分成6位的块,然后通过8个不同的S盒进行替代。S盒是非线性变换,提供算法的非线性性。

  7. P 盒置换(Permutation Box Permutation): 经过S盒替代后,结果通过P盒进行置换,以提供进一步的扩散。

  8. 轮密钥加(Round Key Addition): 在每一轮结束时,进行轮密钥加操作,即将当前状态与生成的轮密钥异或。轮密钥是由初始密钥生成的16个子密钥之一。

  9. 最终置换(Final Permutation): 最终的64位块通过最终置换进行重新排列,形成最终的加密结果。

这个 Feistel 结构的设计使得 DES 具有一定的安全性。然而,随着计算机性能的提高和密码分析技术的发展,DES 的56位密钥长度变得不够安全,因此已经被更强大的加密算法替代,如 AES。

三、DES C++实现源码

使用 OpenSSL 在 C++ 下实现 DES 加密和解密涉及一些基本的库调用。以下是一个简单的例子,假设你已经安装了 OpenSSL 库:

#include <iostream>
#include <openssl/des.h>void des_encrypt(const unsigned char *input, unsigned char *output, const DES_key_schedule &ks) {DES_encrypt1(input, &ks, output);
}void des_decrypt(const unsigned char *input, unsigned char *output, const DES_key_schedule &ks) {DES_decrypt1(input, &ks, output);
}int main() {// 设置密钥const char *key_str = "01234567";DES_cblock key;DES_key_schedule ks;DES_string_to_key(key_str, &key);DES_set_key_unchecked(&key, &ks);// 待加密的数据const unsigned char plaintext[8] = "12345678";unsigned char ciphertext[8];unsigned char decryptedtext[8];// 加密des_encrypt(plaintext, ciphertext, ks);std::cout << "Ciphertext: ";for (int i = 0; i < 8; ++i) {std::cout << std::hex << (int)ciphertext[i];}std::cout << std::endl;// 解密des_decrypt(ciphertext, decryptedtext, ks);std::cout << "Decrypted text: " << decryptedtext << std::endl;return 0;
}

请注意,这个例子中使用了 ECB 模式(Electronic Codebook),它将每个 64 位的块独立地加密。在实际应用中,你可能需要考虑更加安全的模式,如 CBC(Cipher Block Chaining)。

编译时需要链接 OpenSSL 库。在 Linux 中,可以使用以下命令:

g++ -o des_example des_example.cpp -lssl -lcrypto

请确保你的系统中已经安装了 OpenSSL 库。这只是一个简单的示例,实际应用中可能需要更多的安全性和错误处理。

相关文章:

openssl+ DES开发实例(Linux)

文章目录 一、DES介绍二、DES原理三、DES C实现源码 一、DES介绍 DES&#xff08;Data Encryption Standard&#xff09;是一种对称密钥加密算法&#xff0c;最初由 IBM 设计&#xff0c;于1977年成为美国国家标准&#xff0c;用于加密非机密但敏感的政府数据。DES 使用相同的…...

结构体几种实用的用法

结构体的初始化 结构体的初始化是指在声明结构体变量时&#xff0c;为其成员变量赋初值。结构体的初始化可以通过以下几种方式实现&#xff1a; 1. 在声明结构体变量的同时进行初始化&#xff1a; struct Student { char name[20]; int age; float score; } student {…...

React Native 源码分析(四)—— TurboModules JSI通信机制

本文会详细分析React Native 基于JSI的通信方式,除不会涉及Hemers引擎部分,其余代码都会详细分析,但比较简单的,不会很啰嗦,可以说是网上最完整详细的分析文章,代码通过断点截图,可以更方便查看运行的过程 1、React Native 源码分析(一)—— 启动流程 2、React Nativ…...

【C#学习】ToString() 格式化数值

格式字符串采用以下形式&#xff1a;Axx&#xff0c;其中 A 为格式说明符&#xff0c;指定格式化类型&#xff0c;xx 为精度说明符&#xff0c;控制格式化输出的有效位数或小数位数。 格式说明符 说明 示例 输出 C 货币 2.5.ToString(“C”) &#xffe5;2.50 D 十进制数 25.…...

install YAPI MongoDB

docker 运行 mongodb sudo docker run -d \ --name mongodb \ --restart always \ --netdocker \ -p 27017:27017 \ -v ./db:/data/db \ -e MONGO_INITDB_DATABASEyapi \ -e MONGO_INITDB_ROOT_USERNAMEroot \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo…...

大数据Doris(二十三):取消导入与其他导入案例参考

文章目录 取消导入与其他导入案例参考 一、取消导入...

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位&#xff0c;也就是没有报错的内容&#xff0c;尝试用盲注 布尔型 length&#xff08;&#xff09;返回长度 substr&#xff08;&#xff09;截取字符串&#xff08;语法substr&a…...

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例&#xff0c;来给你解释一下&#xff0c;数据的增删改操作具体是如何进行的。 我…...

物理引擎介绍

物理引擎介绍 文章目录 物理引擎介绍Panda3D物理引擎在节点上启用物理场对节点应用物理效果例子一 重力例子二 旋转的推力力的类型线性力旋转力注意事项线性力的一个例子旋转力的一个例子Bullet 如何演示重力虽然碰撞检测解决了防止对象在大多数应用中碰撞的问题,但某些游戏和…...

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…...

定时器setTimeout()、setInterval()详解

定时器是JavaScript中常用的一种功能&#xff0c;它可以通过代码控制在指定的时间间隔或者时间点执行特定的代码。常见的定时器有setTimeout()和setInterval()两种。 setTimeout() setTimeout()函数可以让代码在指定的时间后执行一次&#xff0c;其语法如下&#xff1a; setT…...

测试端口开通的几种方法

一、前言 在平时使用中&#xff0c;当测试服务器端口是否开通时&#xff0c;我们首先想到的是Telnet&#xff0c;如下&#xff1a; [rootk8s-master01 ~]# telnet 192.168.1.33 6443 Trying 192.168.1.33... Connected to 192.168.1.33. Escape character is ^].但是实际生产…...

Linux每日智囊

每日分享三个Linux命令&#xff0c;悄悄培养读者的Linux技能。 rename 作用 批量修改文件名称 rename命令能够基于正则表达式对文件名进行批量修改 语法 rename [option] expression replacement file expression:文件命中需要替换的字符串 replacement:将文件名中指定…...

Word添加附件(附件图标被挡住的问题)

本文主要是为了记录一下自己使用word添加附件的时候遇到的一个坑&#xff0c;就是添加了附件&#xff0c;附件图标没有展示的问题。 选择 插入——对象&#xff0c;然后点击由文件创建然后再点击浏览本地电脑中的文件&#xff0c;选择需要添加的文件&#xff0c;当然也可以选择…...

【数据结构】单链表 | 详细讲解

线性表顺序存储结构的优缺点 顺序表优点 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间&#xff1b;因为以数组形式存储&#xff0c;可以快速地存取表中任一位置的元素。 顺序表缺点 插入和删除操作需要移动大量元素&#xff0c;时间复杂度为O(N)&#xff1b;…...

每日一题:编写程序,使程序分别输出两个整数的加减乘除运算结果

文章目录 每日一题一、编写程序&#xff0c;使程序分别输出两个整数的加减乘除运算结果以下是一个使用 Java 编写的程序&#xff0c;可以输出两个整数的加减乘除运算结果&#xff1a;以下是一个简单的 Python 程序&#xff0c;可以计算两个整数的加减乘除运算结果&#xff1a; …...

alpine linux如何指定软件包安装源

永久修改apk下载源 vi etc/apk/repositories替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/ http://mirrors.aliyun.com/alpine/v3.8/community/更新源 apk update临时修改下载源 直接在软件安装后面 添加源地址 apk add php5.6 --repository http://nl.alpine…...

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…...

cobol-简介

cobol学习笔记 cobol概述 COBOL是一门高级语言。我们必须了解COBOL的工作方式。计算机只能理解机器代码&#xff0c;0和1的二进制流。 COBOL代码必须使用编译器转换成机器代码。通过编译器运行程序源码。编译器首先检查是否有任何语法错误&#xff0c;然后将其转换为机器语言。…...

使用 JMeter 分布式性能测试

作为一个纯 JAVA 的GUI应用&#xff0c;JMeter 对于CPU和内存的消耗还是很惊人的&#xff0c;所以当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至还会引起JAVA内存溢出的错误。不过&#xff0c;JMeter 也可以像 Loa…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...