DES对称加密算法

  DES(Data Encryption Standard,数据加密标准)是一种对称加密算法。

算法概述

  • 加密类型:对称加密(同一密钥用于加密和解密)。
  • 密钥长度:64位(8字节),其中有效密钥长度为56位,另外8位用于奇偶校验。
  • 数据块大小:64位(8字节),即DES将数据按64位的块进行加密。

DES加密过程

DES的加密过程主要包括以下几个步骤:初始置换(IP)、16轮Feistel结构加密、逆初始置换(IP⁻¹)。

明文处理

每次加密时,DES会将数据划分为64位的块进行处理。

  • 如果需要加密的数据超过64位,DES会将数据分成多个64位的块,然后逐块加密。
  • 如果数据长度不是64位的整数倍,则需要使用填充(padding)技术,使最后一块达到64位。

  因此,DES本身只能处理64位的数据块,但通过分块和填充,可以用于加密任意长度的数据。

填充方式

  • PKCS#5/PKCS#7 填充
    适用范围:最常用的填充方式,适用于各种分组加密算法,包括DES。
    规则:根据需要填充的字节数n,将每个填充字节都设置为n。
    • 例如,如果需要填充4个字节,每个填充字节为0x04。
      如果数据长度已经是块大小的整数倍,则在块末尾填充一个完整的块,填充值为块大小。
    • 示例:
      数据:“ABC”(3字节)
      填充后:“ABC\x05\x05\x05\x05\x05”(8字节)
      数据:“ABCDEFGH”(8字节)
      填充后:“ABCDEFGH\x08\x08\x08\x08\x08\x08\x08\x08”(16字节)
  • Zero Padding(零填充)
    适用范围:对一些特定数据可以使用,但不适用于所有情况,特别是数据中有可能包含0x00的情况。
    • 规则:使用0x00字节进行填充,直到数据达到64位的整数倍。如果原数据末尾恰好是0x00,则无法判断填充与数据的边界。
    • 示例:
      数据:“ABC”(3字节)
      填充后:“ABC\x00\x00\x00\x00\x00”(8字节)

初始置换(IP)

输入和输出

  • 输入:64位的数据块(例如,明文在加密时,密文在解密时)。
  • 输出:经过置换后的64位数据块。

置换规则

初始置换根据一个固定的置换表进行,这个表规定了每一位输入数据的位置在输出数据中的新位置。具体来说,置换表会定义64位输入中的每一位如何重新排列,排列规则是固定的。

置换表

初始置换表
在这里插入图片描述

  • 每个数字表示原始数据中位的位置。例如,第1个位置的位(最左上角的“58”)表示原始数据的第58位,现在被放置在置换后的第1位。
  • 原始数据的第2位由第50位的输入组成,依此类推。

16轮Feistel结构加密

&emps; Feistel结构是一种常见的对称加密构造方法,其基本原理是将数据分为两部分(左部分和右部分),通过多轮相似的操作,每一轮使用一个子密钥进行数据的替换和交换。最终的结果经过逆操作就能还原到原始数据。

数据分割

&emps; 在进入16轮Feistel结构之前,经过初始置换(IP)的64位数据被分成两部分:左半部分 (L0) 和 右半部分 (R0),每部分为32位。
每一轮都会输出新的左部分和右部分,记为 Ln和 Rn,其中n 是轮次编号(从1到16)。

每一轮的操作

每一轮使用一个Feistel函数F和一个子密钥Kn ,将输入的右半部分 与子密钥结合,生成一个新的右半部分。

  • 扩展置换
    32位的 Rn 通过一个固定的扩展置换表变成48位的数据。
  • 与子密钥异或(XOR)
    扩展后的48位数据与当前轮的48位子密钥Kn进行异或运算。
  • S盒替换
    将异或后的48位数据分成8组,每组6位(48位 ÷ 8 = 6位)。
    每一组6位数据通过一个固定的S盒(Substitution Box)转换为4位数据。DES总共有8个不同的S盒。
    每个S盒将6位输入映射为4位输出,从而将48位数据压缩回32位。
  • P置换(P-Permutation)
    将32位的S盒输出通过P置换表进行重新排列,得到一个的32位输出。
    在这里插入图片描述
  • Feistel函数的输出
    Feistel函数的输出是一个32位的结果,它与当前轮的左部分Ln进行异或,得到新的右部分 Rn+1。

数据交换

经过F函数处理之后,左右两部分交换位置:即Ln+1=Rn,Rn+1=Ln^F(Rn,Kn)

重复16轮

重复16轮得到最后的L16和R16

逆初始置换(IP⁻¹)

逆初始置换是初始置换的逆操作,用于在解密的最后一步将重新排列的数据恢复到原始顺序。它也有一个对应的置换表,IP⁻¹表如下:
在这里插入图片描述
这个表定义了如何将经过初始置换的数据重新排列回原来的顺序。

在第16轮完成后,不再进行左右交换,而是将R16和L16直接合并成64位的数据,然后通过逆初始置换得到最终64位的密文。

Python 实现

from Crypto.Cipher import DES
from Crypto.Util.Padding import pad,unpad
import binasciikey = b'12345678'
cipher = DES.new(key,DES.MODE_ECB)
data = "Bileton"
padded_data = pad(data.encode("utf-8"),DES.block_size)
encrypted_data = cipher.encrypt(padded_data)
print(binascii.hexlify(encrypted_data).decode('utf-8'))>>> 66b99748acc81443

加上iv向量

from Crypto.Cipher import DES
from Crypto.Util.Padding import pad,unpad
import binasciikey = b'12345678'
iv = b'12345678'
cipher = DES.new(key,DES.MODE_CBC,iv)
data = "Bileton"
padded_data = pad(data.encode("utf-8"),DES.block_size)
encrypted_data = cipher.encrypt(padded_data)
print(binascii.hexlify(encrypted_data).decode('utf-8'))>>> fa8669e459a42d7f

Java实现

Cipher cipher = Cipher.getInstance("DES");
byte[] keys = "12345678".getBytes("UTF-8");
Key key = new SecretKeySpec(keys, "DES");
cipher.init(Cipher.ENCRYPT_MODE,key);
String data = "Bileton";
cipher.update(data.getBytes("UTF-8"));
byte[] encryptData = cipher.doFinal();
String encodedEncryptedData = Base64.getEncoder().encodeToString(encryptData);
System.out.println(encodedEncryptedData);>>> ZrmXSKzIFEM=

加上iv向量

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
byte[] iv = "12345678".getBytes("UTF-8");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
byte[] keys = "12345678".getBytes("UTF-8");
Key key = new SecretKeySpec(keys, "DES");
cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);
String data = "Bileton";
cipher.update(data.getBytes("UTF-8"));
byte[] encryptData = cipher.doFinal();
String encodedEncryptedData = Base64.getEncoder().encodeToString(encryptData);
System.out.println(encodedEncryptedData);>>> +oZp5FmkLX8=

Android Studio

String data = "Bileton";
String key_string = "12345678";
Key key =new SecretKeySpec(key_string.getBytes("UTF-8"),"DES");
String iv_string = "12345678";
IvParameterSpec iv = new IvParameterSpec(iv_string.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key,iv);
cipher.update(data.getBytes("UTF-8"));
byte[] result = cipher.doFinal();
String encodeencrypteddata = Base64.encodeToString(result,Base64.DEFAULT);
Toast.makeText(MainActivity.this,encodeencrypteddata,Toast.LENGTH_SHORT).show();

在这里插入图片描述

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

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

相关文章

java--网络编程

网络的相关概念 网络通信 1.概念:两台设备之间通过网络实现数据传输2.网络通信:将数据通过网络从一台设备传输到另一台设备3.java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信 网络 概念:两台或多台设备通过一定物理设备连接…

UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘

目录 一、启动盘制作 1、工具准备 2、打开UltraISO后,点击左上角的文件,在打开的下拉项中,选择打开准备好的Ubuntu系统20.04 LTS镜像文件(ubuntu-20.04-desktop-amd64.iso); 3、然后点击启动->写入硬盘映像 4、在弹出的窗…

Pollard‘s p-1算法

概述 光滑数 (Smooth number):指可以分解为多个小素数乘积的正整数 当p是N 的因数,并且p−1是光滑数,可以考虑使用Pollards p-1算法来分解N 当p是N的因数,并且p1是光滑数,可以考虑使用Williamss p1算法来分解N 这里…

一个简单的Qt Console Application计算练习程序

初步体验Qt Creator 用途&#xff1a;练习20以内2位数乘法速算的程序 功能1&#xff1a;支持用户设定题目数量 std::cout << "请输入本次练习题目数量&#xff1a;";int numProblems 0;std::string num;std::cin >> num;try {numProblems std::stoi(…

飞腾X100适配Ubuntu说明

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

Docker配置网站环境

Mysql 先安装mysql 启动并后台运行&#xff1a;run -d 容器名称&#xff1a;--name 设置端口映射&#xff1a;-p 主机端口&#xff1a;容器端口 环境变量&#xff1a;-e 最后指定镜像名称 sudo docker run -d \--name mysql\-p 3306:3306\-e MYSQL_ROOT_PASSWORD123456\…

单细胞空间转录组RCTD去卷积分析学习和整理

RCTD(Robust Cell Type Decomposition)&#xff0c;是一种用于将单细胞RNA测序数据中的细胞类型注释转移到空间转录组学数据上的方法。RCTD 通过整合单细胞和空间转录组学数据&#xff0c;能够较为精确地为空间点&#xff08;spots&#xff09;分配细胞类型或细胞类型的混合&am…

LabVIEW风机滚动轴承监测系统

矿井主通风机作为矿井中最重要的通风设备&#xff0c;一旦出现故障&#xff0c;不仅会影响矿井内的空气质量&#xff0c;还可能引发安全事故。研究表明&#xff0c;通风机中约30%的故障是由轴承问题引起的。因此&#xff0c;能够实时监控矿井主通风机轴承状态的系统&#xff0c…

CSS网页布局(重塑网页布局)

一、实现两列布局 许多网站有一些特点&#xff0c;如页面顶部放置一个大的导航或广告条&#xff0c;右侧是链接或图片&#xff0c;左侧放置主要内容&#xff0c;页面底部放置版权信息等 一般情况&#xff0c;此类网页布局的两列都有固定的宽度&#xff0c;而且从内容上很容易区…

学习java第九天 简单小项目

今天简单写了小项目 import java.math.*; import java.util.*; public class Project_array{// data 拿到外面 封装的方法 共享同一个变量// static 静态上下文只能直接访问静态的变量// 一旦加上static 代表当前的变量全局共享一份static Record[] data {new Record("…

零基础Java第八期:一维数组(1)

目录 一、 一维数组的基本概念 1.1. 什么是数组 1.2. 数组的创建及初始化 1.3. 数组的使用 二、数组是引用类型 2.1. 初始JVM的内存分布 2.2. 基本类型变量与引用类型变量 2.3. 引用变量的理解 2.4. null 三、数组的应用场景 3.1. 作为函数的参数 3.2. 作为函数的返…

你可能需要的多文档页面交互方案

前言 欢迎关注同名公众号《熊的猫》&#xff0c;文章会同步更新&#xff01; 在日常工作中&#xff0c;面对不同的需求场景&#xff0c;你可能会遇到需要进行多文档页面间交互的实现&#xff0c;例如在 A 页面跳转到 B 页面进行某些操作后&#xff0c;A 页面需要针对该操作做出…

成本决定未来——AIGC 下半场,高成本阻碍发展,我们该怎么办?

你好&#xff0c;我是三桥君 你最近有没有觉得工作中用到的那些 AI 工具好像越来越便宜了呢&#xff1f;这可不是偶然哦。 今天&#xff0c;三桥君就来聊聊为啥 AIGC 的下半场成本这么重要&#xff1f; 你想想看&#xff0c;咱平时工作已经够累了&#xff0c;要是再加上用那些贵…

算法Day-2

27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&am…

zotero下载、安装、翻译和显示无法安装插件“%S”的解决办法

文章目录 zotero下载和安装和翻译还有插件英文翻译软件遇到的问题 zotero下载和安装和翻译还有插件 Zotero从入门到精通第一期–如何省心省力翻译科研文献&#xff0c;这里面主要是使用小牛翻译的过程&#xff0c;输入产品密匙需要加入个人的账号密码进行sign in 英文翻译软件…

动态规划17:123. 买卖股票的最佳时机 III

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;123.…

递归神经网络(RNN)简介

递归神经网络简介 在本文中,我们将介绍神经网络的一种新的变体,即递归神经网络,也称为 (RNN),当数据是连续的时,如时间序列数据和文本数据,它比简单的神经网络效果更好。 什么是递归神经网络 (RNN)? 循环神经网络 (RNN) 是一种神经网络,其中上一步的输出作为当前…

Quarto ppt模板制作与Rstudio git连接

本篇记录下当前ppt演示中比较流行的quarto document使用情况以及Rstudio与git相连接的一些实操。 1 Quarto ppt模板制作 1.1 Quarto简介&#xff08;来自Kimi&#xff09; Quarto 是一个由 RStudio 的母公司 Posit 团队开发的开源科学和技术出版系统&#xff0c;它建立在 Pan…

计算机网络——传输层服务

传输层会给段加上目标ip和目标端口号 应用层去识别报文的开始和结束

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示&#xff0c;提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…