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 binascii

key = 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 binascii

key = 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();

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM网络在线考试系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,在线考试管理,试题管理,考试管理,系统管理 前台账号功能包括:系统首页,个人中心,在线考试,公告信…

最新物流行业CRM系统应用数字化解决方案

因势利导 ——全球化物流的挑战与机遇 在全球经济一体化与互联网技术快速发展的双重驱动下,物流行业正经历着前所未有的变革时期。这一变革不仅影响 着行业的发展模式,还对运营效率和客户体验提出了新的要求。 随着市场需求的不断演变,物流行业已呈现出多元化和专业 化并行的发…

OpenCV双目视觉三角测量代码实现C++

在双目视觉系统中,三角测量是一种基于几何原理的三维重建技术,通过分析同一场景在两个不同视角下的二维图像来确定物体的三维坐标。这种方法的核心在于利用摄像机的内参和相对位姿(由旋转矩阵和平移向量描述),将图像中…

数据科学家必须掌握的12个Python功能

Python 已经成为数据科学家的必选语言,从数据处理到机器学习,它几乎无所不能。本文将探讨一些Python特性,这些特性不仅能帮助你编写更高效、更易读、更易维护的代码,还特别适合数据科学的需求,使你的代码简洁且优雅。 …

mysql8 使用idb文件实现数据备份

文章目录 1.备份脚本示例2.设置 Cron 任务3. 数据恢复 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 需求,在离线情况下实…

【Linux】————磁盘与文件系统

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示: 其中具体的物理存储结构如下: 磁盘中存储的基本单位为扇区,一个扇区的大小一般为512字…

研发运营一体化(DevOps)能力成熟度模型

目录 应用设计 安全风险管理 技术运 持续交付 敏捷开发管理 基于微服务的端到端持续交付流水线案例 应用设计 安全风险管理 技术运 持续交付

14 django管理系统 - 注册与登录 - 注销

首先先创建注销的入口&#xff0c;在base.html中修改 <ul class"nav navbar-nav navbar-right"><li><a href"/account/login/">登录</a></li><li><a href"/account/register/">注册</a></l…

2024互联网大厂营收排名:京东/阿里/华为前三,超多技术岗都在热招!

2024年已经过去一大半&#xff0c;各大互联网大厂的竞争如火如荼&#xff0c;营收都取得了不俗的成绩&#xff0c;京东、阿里、华为分别占领前三&#xff01; 第四第五名则为华为和拼多多。 根据排行榜里的公司名单&#xff0c;小码特意为大家整理了一批各大厂的招聘岗位。 阿…

信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法

PDF文档回复:20241021 1 P9748 [CSP-J 2023] 小苹果 [题目描述] 小 Y 的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 1 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会从中拿走一些苹果。 每天在拿的时候&#xff0c;小苞都是从左侧第 1 个苹果开始、每隔…

微信碰一碰支付系统有哪些好的?教程详解抢先看!

支付宝“碰一碰支付”的风刚刚刮起来&#xff0c;它的老对手微信便紧随其后&#xff0c;推出了自己的碰一碰支付设备&#xff0c;再次印证了这个项目市场前景广阔的同时&#xff0c;也让与碰一碰支付系统相关问题的热度又上了一层楼&#xff0c;尤其是微信碰一碰支付系统有哪些…

设计模式(UML图、类之间关系、设计原则)

目录 一.类的UML图 1.类的UML图 2.类之间的关系 2.1 继承关系&#xff1a; 2.2关联关系 2.2.1单项关联 2.2.2双向关联 2.2.3自关联 2.3聚合关系 2.4组合模式 2.5依赖关系 二、设计三原则 2.1单一职责原则 2.2开放封闭原则 2.3依赖倒转原则 一.类的UML图 1.类的…

Originlab正态分布处理数据

一、图线绘制 首先&#xff0c;导入数据 点击左下角生成柱状图 绘制完成后&#xff0c;点击菜单栏【分析】-【拟合】-【非线性曲线拟合】-【打开对话框】 在函数中选择高斯即可 二、设置画布 宽、高为300.02 三、坐标轴格式 显示&#xff1a;上下左右轴 刻度线标签&#…

网络编程中容易踩的坑罗列,谨记!

1、TCP没考虑粘包分包 TCP是面向连接的可靠协议&#xff0c;TCP是流式协议&#xff0c;创建TCP套接字的类型为SOCK_STREAM int sockfd socket(AF_INET, SOCK_STREAM, 0);很多同学面试时对书上的话背诵如流&#xff0c;在实际TCP编程中却没有处理粘包和分包的代码&#xff0c;以…

十年编程路,一生踏征途

时光荏苒流逝&#xff0c;白驹匆匆过隙&#xff0c;不知不觉间&#xff0c;我已经在程序开发这条道路上走过了整整十年。从最初的求学&#xff0c;到如今成为一名较为资深的职业开发者&#xff0c;这一路充满了挑战、学习、成长与感动。在这1024程序员节的特殊时刻&#xff0c;…

mysql5.7.30绿色版安装

下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 参考&#xff1a;【绿色版】Mysql下载、安装、配置与使用&#xff08;保姆级教程&#xff09;_mysql 绿色安装-CSDN博客 从下载地址中下载mysql&#xff0c;解压zip安装包&#xff0c;到想…

A Graph-Transformer for Whole SlideImage Classification文献笔记

基本信息 原文链接&#xff1a;[2205.09671] A graph-transformer for whole slide image classification (arxiv.org) 源码&#xff1a;https://github.com/vkola-lab/tmi2022 提出了一种融合了基于图的WSI表示和用于处理病理图像的视觉转换器&#xff0c;称为GTP&#xff…

听说现在二建不值钱了,还有必要考吗?

面对这样的现状&#xff0c;新手们都会不禁要问:考证真的有用吗?它是否值得我们投入时间和精力?首先&#xff0c;我觉得我们需要对自己有一个清晰的认识&#xff0c;包括你的就业状况。 ①如果你已经在事业单位工作&#xff0c;那么考证可能对你来说并不是那么必要 在事业单…

图片写入GPS经纬高信息

近期项目中需要往java平台传输图片&#xff0c;直接使用QNetworkAccessManager和QHttpMultipart类即可&#xff0c;其他博文中有分享。 主要是平台接口对所传输图片有要求&#xff1a;需要包含GPS信息&#xff08;经度、纬度、高度&#xff09;。 Qt无法直接实现&#xff0c;…

【React】React18核心源码解读

前言 本文使用 React18.2.0 的源码&#xff0c;如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章&#xff1a;VsCode查看React源码全是类型报错如何解决。 阅读源码的过程&#xff1a; 下载源码 观察 package…