当前位置: 首页 > 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…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...