DES算法子密钥的生成过程

news2025/2/26 22:13:21

DES算法的一次执行中将进行16轮迭代加密;
从原始的56位密钥中得到16个轮密钥k,每个轮密钥ki是48位;
轮密钥也叫子密钥;

下面看一下子密钥的生成过程;

大体过程是这样;看下图,
 

此图来自 34.《密码学》.DES算法原理讲解_子密钥生成及总结_哔哩哔哩_bilibili

64位的密钥,去掉8位校验位,剩下56位;

按PC-1表进行置换,打乱顺序;然后分成2个28位;一个28位是C0,一个28位是D0,

然后要进行循环左移,循环左移要移1位或2位,根据是第几轮来判断,可查上图的循环左移查表;

移位之后得到Ci和Di,i是轮数;

把Ci和Di组合得到56位;

得到的56位按PC-2表进行置换,置换中有8位会被去除,得到此轮的48位子密钥ki;

PC-1表是56位,PC-2表是48位;

或者更简洁看下图;

 

 

此图来自,DES加密解密算法(简单、易懂、超级详细)_des加密算法_sunny-ll的博客-CSDN博客

过程为:64位密钥输入,PC1置换,分成2个28位,循环左移,得到一个56位,PC2置换,得到48位子密钥ki;

看了一下DES加密算法代码;还没完全看清楚;

算法描述中的位应该是二进制bit位;

代码中操作并不是用C语言的位运算;应该是一个二进制串例如 11001010 ,是作为一个字符串,取字符串的每一个来按算法操作;完了之后再把二进制的字符串转换为整型,由整型可取得字符的ASCII码;应该是这样;

它的PC1置换代码是这样的,

int pc1Table[56] =
{
    57,49,41,33,25,17,9,1,
    58,50,42,34,26,18,10,2,
    59,51,43,35,27,19,11,3,
    60,52,44,36,63,55,47,39,
    31,23,15,7,62,54,46,38,
    30,22,14,6,61,53,45,37,
    29,21,13,5,28,20,12,4
};

string miyao, miyaoBinary, pc1MiyaoBinary;

    //从64bit密钥中依据PC-1盒子取出56bit
    for (i = 0; i < 56; i++)
    {
        pc1MiyaoBinary += miyaoBinary[pc1Table[i] - 1];
    }

其中 miyaoBinary 和 pc1MiyaoBinary 是string类型;

它的代码中还有2个函数是实现二进制的字符串和整型数之间的转换,

int binaryToInt(string s),输入一个二进制的字符串返回整型数;
string intToBinary(int i),输入一个整数返回二进制的字符串;

下面单独先把这2个函数在MFC中看一下;我把它的string类型换成了MFC的CString;

int binaryToInt(CString );
CString intToBinary(int );

void CInbyView::OnDraw(CDC* pDC)
{
	CInbyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CString str1;

	CString b1 = "0101";
	int b2 = binaryToInt(b1);
	str1.Format("0101的整数:%d", b2);
	pDC->TextOut(50, 50, str1);

	CString b3 = "1100101";
	int b4 = binaryToInt(b3);
	str1.Format("1100101的整数:%d", b4);
	pDC->TextOut(50, 80, str1);

	str1 = intToBinary(12);
	pDC->TextOut(50, 110, "12的二进制:" + str1);
	
	CString str3 = intToBinary(14);
	pDC->TextOut(50, 140, "14的二进制:" + str3);

	CString str4 = intToBinary(37);
	pDC->TextOut(50, 170, "37的二进制:" + str4);
}

//二进制转整型
int binaryToInt(CString s)
{
    int i, result = 0, p = 1;
    for (i = s.GetLength() - 1; i >= 0; i--)
    {
        result += ((s[i] - '0') * p);   //数字字符转成字符
        p *= 2;
    }
    return result;
}

//整型转二进制
CString intToBinary(int i)
{
    int k = 0;
    CString result;
    while (k < 4) //此处,处理进入S盒后取出的数据转为2进制,此处最多用4bit
 
    {
        if (i)
        {
            result += ((i % 2) + '0');
            i /= 2;
        }
        else result += '0';
        k++;
    }
    result.MakeReverse();
    return result;
}

输出如下; 

 

 

其中 intToBinary() 根据它的说明最多用4bit;37的二进制如下,输入37时只返回低4位;

 

有时间继续; 

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

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

相关文章

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了&#xff0c;平台也有各种各样的中秋发文活动&#xff0c;正在翻阅时偶然间我看到了这篇文章&#xff1a;《兔饼大作战》&#xff1a;吃月饼、见月亮&#xff0c;还能咬自己&#xff1f;| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…

XML文件序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

重装系统(配置环境)

这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据&#xff0c;更多内容请参考&#xff1a;Python学习指南 Selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我…

数据包络分析(DEA)——CCR模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…

惯性动捕+数据手套,让“虚拟”触手可及

当今&#xff0c;虚拟现实技术已经从科幻电影走进现实生活。在数字化时代&#xff0c;惯性动作捕捉系统与数据手套的结合使用&#xff0c;带给我们全新的虚拟互动体验&#xff0c;使虚拟世界更能够“触手可及”。 01 惯性动作捕捉系统 FOHEART MAGIC是一款高性能的惯性动作捕…

windows 安装Linux子系统 Ubuntu 并配置python3

环境说明&#xff1a; Windows 11 Ubuntu 20.04.6 安装步骤以及问题&#xff1a; 1、开启Windows Subsystem for Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 2、开启虚拟机特性 dism.exe /online /enabl…

【Linux】常用工具(下)

Linux常用工具 一、Linux 项目自动化构建工具 - make/Makefile1. 依赖关系和依赖方法2. 伪目标3. make/Makefile 具有依赖性的推导能力&#xff08;语法扩展&#xff09;4. 编写一个进度条代码&#xff08;1&#xff09;缓冲区&#xff08;2&#xff09;\n 和 \r&#xff08;3&…

一句话设计模式12:适配器模式

适配器模式: 继承原对象,持有目标对象; 文章目录 适配器模式: 继承原对象,持有目标对象;前言一、适配器模式的作用二、如何适配器模式直接上代码 总结 前言 适配器模式一般使用场景是: 将一个类(接口)转换成客户希望的另外一个类(接口)。其中适配器充当一个假的原类的作用; 一…

读高性能MySQL(第4版)笔记12_查询性能优化(下)

1. “快速、精确和实现简单” 1.1. 三者永远只能满足其二&#xff0c;必须舍掉一个 2. 排序优化 2.1. 无论如何排序都是一个成本很高的操作&#xff0c;所以从性能角度考虑&#xff0c;应尽可能避免排序或者尽可能避免对大量数据进行排序 2.2. 文件排序&#xff08;filesor…

数组和指针笔试题解析之【指针】

目录 &#x1f342;笔试题1&#xff1a; &#x1f342;笔试题2&#xff1a; &#x1f342;笔试题3&#xff1a; &#x1f342;笔试题4&#xff1a; &#x1f342;笔试题5&#xff1a; &#x1f342;笔试题6&#xff1a; &#x1f342;笔试题7&#xff1a; &#x1f342;笔试题…

实施主品牌进化战略(一):确立主品牌进化架构

主品牌进化战略&#xff0c;即以主品牌为核心创造、巩固、转化竞争优势应对竞争环境变化&#xff0c;避免衰退&#xff0c;回归增长&#xff0c;让主品牌进化的方法论体系。主品牌进化战略制定要从 4 个方面出发&#xff1a;确立主品牌进化架构、更新和明确主品牌竞争方向、建立…

Java高级-注解

注解 1.介绍2.元注解3.注解的解析4.注解的应用场景 1.介绍 注解 Annotation 就是Java代码里的特殊标记&#xff0c;作用是让其他程序根据注解信息来决定什么是执行该程序注解&#xff1a;注解可以在类上、构造器上、方法上、成员变量上、参数上等位置 自定义注解 /*** 自定…

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台&#xff0c;但对SaaS的了解还不是完全全面&#xff0c;对于一些产品的定位以及设计还在探索中 本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题&#xff0c;核心是产品设计&#xff0c;主要从需…

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理 第9章 Qt 5文件及磁盘处理9.1 读写文本文件9.1.1 QFile类读写文本9.1.2 QTextStream类读写文本 9.2 读写二进制文件9.3 目录操作与文件系统9.3.1 文件大小及路径获取实例9.3.2 文件系统浏览 9.4 获取文件信息9.5 监视文件和目录变化…

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟&#xff0c;数字化转型逐步成为企业发展的必选项&#xff0c;企业数字化转型不再是一道选择题&#xff0c;而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式&#xff0c;激发内生动力&#xff0c;成为企业顺应时代变…

Nacos服务列表有服务,但是配置列表不起作用。

目录 bug现场解决思路POM文件启动日志排查完整pom文件nacos配置中心部署流程 想要重新再写一下springcloud alibaba 的组件配置&#xff0c;再另一个服务renren-product引入&#xff0c;nacos的注册发现和配置中心。前面都很顺利但是修改配置中心配置的时候不起作用&#xff01…

Spring Boot实现对超大文件进行异步压缩下载

在Web应用中&#xff0c;文件下载功能是一个常见的需求&#xff0c;特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API&#xff0c;通过该API&#xff0c;用户可以下载问价为ZIP压…

linux下CentOS安装mysql-5.7

linux下安装mysql只需要在root用户下安装&#xff0c;普通用户也能使用 1.检查&#xff1a; 通过以下两条命令查看改系统下是否已存在mysql。 ps ajx | grep mysql ps ajx | grep mariadb通过指令如果只显示如下两条信息&#xff0c;则当前系统下不存在MySQL。 就可以直接进…