密码学 实现64bit DES C语言
算法描述:
1.Feistel网络结构
- 其特性参数:
①明文(输入)块大小(Block Size):64bit~128bit,且是2的倍数;
②密钥长度/大小(Key Size):56~256
③Number of Rounds:循环次数
④Round Function:轮函数,一定是非线性的,不要求可逆
- 加解密过程
明文(Plaintext)长度为2W位(该结构加密的名文bit数长度必须为偶数,比如DES的明文长度为64bit)。
①先将2w位的明文分为左半部分(前w位L0)和右半部分(后w位R0)。
②将输入的右侧R0,直接输出到输出的左侧为密文的左半部分L1。
③将输入的右侧R0与子密钥K1进行F函数操作(K1和R0作为自变量)得到运算结果,即Output_1 = F(K1,R0)。
④将经过F函数运算的结果Output_1与L0进行异或操作,得到结果作为密文的右半部分R1。
⑤第一轮Round1的密文作为第二轮Round2的明文进行相同步骤的加密操作,循环操作。
注意:最后一轮的结果在基本流程上要再交换左右两部分以保证加密与解密的结构相同。
Feistel网络结构有一个特点,就是加密与解密流程是完全相同的。也就是加密解密算法相同,不同的只是初始输入值与子密钥的使用顺序(即所谓加密解密对称性)。
2.DES算法
- IP置换
IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:
表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。
要注意一点,位数是从左边开始数的,即最0x0000 0080 0000 0002最左边的位为1,最右边的位为64。
- 子密钥的生成(密钥置换)
不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表置换生成(注意表中没有8,16,24,32,40,48,56和64这8位):
在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如
1).将56位的密钥分成两部分,每部分28位。
2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。压缩置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):
- DES的F函数
(1)将64bit的明文右半部分即32bit扩展为48bit:
采用的是4个bit一组,分为8组,每一组前后各加1bit(增加的bit数=2*1*8=16bit)。其增加按照下表进行(虚线以外的为增加的bit所在位置,如:第一组前是32,即在第一组前加一个bit为整个右半部分的32bit的第32位的bit值{0,1}):
(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;
(3)将扩充信息和子密钥异或后的结果进行压缩(48bit压缩到32bit),压缩的方式是经过S盒(4*16的矩阵)进行替换,S盒函数是经过严格计算获得的,其S1盒的替换表与流程如下所示:
一个组6bit,共8组(6bit*8=48bit),即有8个S盒,每个S盒是固定的但是都是不相同的。拿S1盒来说:B1B2B3B4B5B6,第一个比特和最后一个比特,即B1B6确定表中的行数;每一组的中间四个比特确定列数。
eg:B1B2B3B4B5B6=101011。则B1B6=11(3)确定最后一行,B2B3B4B5=0101(5)确定第5列。3行5列即值为9(1001),所以101011的6bit经过压缩后的4bit为1001。
(4)置换运算P(经过一个P盒进行置换):
指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。
表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第16位放到新数据的第1位,第7位放到第2位,……依此类推,第25位放到第32位。
例如0x10A1 0001进行P盒置换后变为0x8000 0886。
- IP-1末置换
末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:
实验内容:
- IP置换
IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:
- 子密钥的生成(密钥置换)
(1)56位密钥置换生成:
(2)在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式
1).将56位的密钥分成两部分,每部分28位。
2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
(3)移动后,从56位中选出48位。压缩置换。压缩置换规则如下表
完整代码:
- DES的F函数
(1)将64bit的明文右半部分即32bit扩展为48bit:
(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;
(3)压缩(48bit->32bit): S盒(4*16的矩阵)进行替换
一个组6bit,共8组(6bit*8=48bit),即有8个S盒,每个S盒是固定的但是都是不相同的。拿S1盒来说:B1B2B3B4B5B6,第一个比特和最后一个比特,即B1B6确定表中的行数;每一组的中间四个比特确定列数。
(4)置换运算P(经过一个P盒进行置换):
指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。
(5)L0与经过F变换的R0异或,放到R1位置,L0位置放R0
完整代码:
- IP-1末置换
末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:
【DES加解密】:
加密:mingwen.txt
解密:miwen.txt
区别在于:输入的子密钥SK顺序不同,一个是正序,一个是逆序。
【DES输出密文变化bit数】:
(1)随机生成明文和密钥,组成明文密钥对。(因为每组明文密钥对只能输出64条结果,所以需要生成多组明文密钥对)
(2)生成每组明文密钥对所对应的初始密文
(3)循环64次,按位更改明文,每次更改第J位的明文(M[j])使它取反,生成密文,比较完两个密文后复位M[j]
(4)比较密文与更改明文后得到密文,得到变化bit数并输出
密码学 实现64bit DES C语言相关推荐
- 【历史上的今天】6 月 5 日:洛夫莱斯和巴贝奇相遇;公钥密码学先驱诞生;函数语言设计先驱出生
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 6 月 5 日,世界环境日.1972 年 6 月 5 日至 16 日,联合国人类环境会议在斯德哥尔摩 ...
- 密码学 AES算法实现 c语言
基础知识: 最后轮没有列混合 初始变换: 明文4*4=16字节=128bit 密钥4*4=128bit 明文和初始密钥 异或 字节代换 S-Box 行移位 列混合 乘法 乘2时 左移 ...
- des加密密码补位_密码学中的数据加密标准(DES)
des加密密码补位 This is a Data Encryption Standard that is the asymmetric key generation for the encryptio ...
- 一种伪DNA密码学方法
https://arxiv.org/pdf/0903.2693.pdf 这篇是论文的翻译加个人理解,就其中有些问题邮件询问了Kang Ning老师,得到的回复就是--Will update short ...
- R语言命令行写linux,linux命令行下使用R语言绘图实例讲解
使用系统:centos 6.4 64bit 在R语言中可以使用png()等函数生成图片,例如: png("aa.png")可以生成图片. 但是如果你是通过shell远程连接到系统上 ...
- 密码技术--对称加密算法及Go语言应用
对称加密算法 DES Data Encryption Standard (数据加密标准)是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码.DES一直以来被美国以及其他国家的政府和银行 ...
- R语言的导数计算(转)
转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识. 我在学习高数的时候绞 ...
- DES加密算法安全吗,有哪些优点和缺点?
在密码学中,DES算法是一种常见的分组加密算法,它是应用最为广泛的对称加密算法.加密算法有很多种,DES算法只是其中的一种,那么DES加密算法安全吗?DES加密算法有哪些优点和缺点?下面本文将对这些问 ...
- 《密码学系列》—— 分组密码
我无论做什么,始终在想着,只要我的精力允许我的话,我就要首先为我的祖国服务.--<巴甫洛夫选集> 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https:// ...
最新文章
- matlab7.1(ERROR STARTING DESKTOP)解决
- matlab中如何求零极点,Matlab中绘制零极点
- android学习资料
- 金融行业信息系统信息安全等级保护实施指引_中国人民银行发布金融行业网络安全等级保护实施指引...
- delphi如何让程序最小化到任务栏(使用Shell_NotifyIcon API函数)
- HTML使用vue的 event,vue-js 特殊变量$event常识
- 谷歌街景新功能——帮警方抓毒贩
- 对象池回收对象_回收对象以提高性能
- 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
- 银河麒麟操作系统添加字体
- ArcGIS基础学习笔记之空间数据库管理工具ArcCatalog基础
- 10 种为React应用程序设计样式的方法
- 积分商城搭建的要点与优势有哪些?
- Docker一键部署MySQL
- CSS中设置页面背景图片
- win7安装vs2012失败
- 全球与中国湿式剃须刀市场深度研究分析报告
- c语言trim库函数用法,c语言编写trim 函数
- 继电保护原理1.2-反时限过流保护
- npm安装私有指定路径的依赖包
热门文章
- 使用angularJs实现tab切换
- 如何提取(复制)图片(书本)上的文字
- WebService应用通信
- 计算机火影忍者的谱子,火影忍者动漫曲谱大全
- linux getpid()和getppid()函数功能以及使用方法
- 为什么局域网网段不同不能通信?
- signature=a335cd7040789f936f75c72e4ba37676,用X射线衍射定量分析纸张中的无机填料
- 元祖字典 java_和你学Python之Python数据类型之字典、元组和集合
- 服装门店管理软件告诉你门店数据该怎么分析
- 南京邮电大学数据结构实验三(图的基本运算及飞机换乘次数最少问题)