密码学:分组密码.(块密码:是一种对称密码算法)
密码学:分组密码.
分组加密(Block Cipher) 又称为分块加密或块密码,是一种对称密码算法,这类算法将明文分成多个等长的块 (Block) ,使用确定的算法和对称密钥对每组分别加密或解密。分组加密是极其重要的加密体制,如DES和AES曾作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转账,非常广泛。
本质上,块加密可以理解为一种特殊的替代密码,只不过每次替代的是一大块。因为明文空间非常巨大,所以对于不同的密钥,无法制作一个对应明密文的密码表,只能用特定的解密算法来还原明文。
目录:
密码学:分组密码.
分组密码常见工作模式:
(1) ECB
(2) CBC
(3)OFB
(4)CFB
(5)CTR
费斯妥密码和DES:
(1)费斯妥密码
(2) DES
(2.1)初始置换 (Initial Permutation)
(2.2)subkeys 的生成
(2.3)轮函数
AES:
(1)有限域
(2)Rijndael 密钥生成:
(3)AES步骤:
(4)常见攻击:
1.Byte-at-a-Time
2..CBC-IV-Detection
3.CBC-Bit-Flipping
分组密码常见工作模式:
密码学中,分组密码的工作模式允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据需要使用合适填充方式将数据扩展到匹配密码块大小的长度。分组密码的工作模式描述了加密每个数据块的过程,并常常使用基于一个称为初始化向量 (lnitialization Vector,IV) 的附加输入值进行随机化,以保证安全。
对加密模式的研究曾经包含数据的完整性保护,即在某些数据被修改后的情况下密码的误差传播特性。后来的研究则将完整性保护作为另一个完全不同的,与加密无关的密码学目标。部分现代的工作模式用有效的方法将加密和认证结合起来,称为认证加密模式。
(1) ECB
ECB (Electronic Code Book,电子密码本) 是分组加密最简单的一种模式,即明文的每个块都独立地加密成密文的每个块。
如果明文的长度不是分组长度的倍数,则需要用一些特定的方法进行填充。设明文为P,密文为C,加密算法为E,解密算法为D,则ECB模式下的加密和解密过程可以表示为:
ECB模式的缺点在于同样的明文块会被加密成相同的密文块,因此不能很好地隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议。
(2) CBC
在CBC (Cipher Block Chaining),密码分组链接)模式中,每个明文块先与前一个密文块进行异或(XOR)后再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块;同时,为了保证每条消息的唯一性,在第1个块中需要使用初始化向量。
(3)OFB
OFB (Output FeedBack,输出反馈模式)可以将块密码变成同步的流密码,将之前一次的加密结果使用密钥再次进行加密(第1次对IV进行加密),产生的块作为密钥流,然后将其与明文块进行异或,得到密文。由于异或(XOR)操作的对称性,加密和解密操作是完全相同的。
OFB模式的公式表示为:
(4)CFB
CFB (Cipher FeedBack,密文反馈)类似OFB,只不过将上一组的密文作为下一组的输入来加密进行反馈,而OFB反馈的是每一组的输出再次经过加密算法后的输出。
CFB的加密与解密可以表示为:
(5)CTR
CTR模式 (Counter Mode,CM) 也被称为ICM模式 (Integer Counter Mode,整数计数模式)、SIC模式(Segmented nteger Counter) 。与OFB类似,CTR将块密码变为流密码,通过递增一个加密计数器来产生连续的密钥流。其中,计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。CTR模式的特征类似OFB,但允许在解密时进行随机存取。
图中的“Nonce”与其他图中的IV (初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。
费斯妥密码和DES:
(1)费斯妥密码
在密码学中,费斯妥密码(Feistel Cipher)用于构造分组密码的对称结构,以德国出生的物理学家和密码学家Horst Feistel命名,通常称为Feistel网络。他在美国IBM工作期间完成了此项开拓性研究。多种知名的分组密码都使用该方案,包括DES、Twofish、XTEA、Blowfish等。Feistel密码的优点在于加密和解密操作非常相似,在某些情况下甚至是相同的,只需要逆转密钥编排即可。图是Feistel密码的加密、解密结构。
(2) DES
DES (Data Encryption Standard,数据加密标准)是一种典型的基于 Feistel 结构的加密算法,1976年被美国国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛应用。DES 是基于 56bit 密钥的对称算法,因为包含一些机密设计元素,密钥长度相对较短,并且被怀疑内含美国国家安全局(NSA)的后门,DES算法在刚推出时饱受争议,受到了严密的审查,并推动了现代的块密码及其密码分析的发展。
(2.1)初始置换 (Initial Permutation)
首先,DES会对用户的输入进行处理,称为初始置换 (nitial Permutation) ,用户的输入将会按照表的顺序进行置换。
按照表中的索引,用户输入M的第58位会成为这个过程的结果IP的第1位,M的第50位会成为IP的第2位,以此类推。下面是一个特定的输入M经过IP后的结果:
M=0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 11101111IP 1100 1100 0000 0000 1100 1100 11111111 1111 0000 1010 1010 1111 0000 10101010
将IP分成等长的左右两部分,可以获得初始的L和R的值:
L0 1100 1100 0000 0000 1100 1100 1111 1111R0 1111 0000 1010 1010 1111 0000 1010 1010
(2.2)subkeys 的生成
首先,传入的原始key会根据表7-3-2置换生成64位密钥。表中的第一个数为57,这意味着原始密钥key的第57位成为置换密钥key+的第1位;同理,原始密钥的第49位成为置换密钥的第2位。注意,这里的置换操作只从原始密钥取了56位,原始密钥中每字节的最高位是没有被使用的.
下面是一个输入的key被转换成置换密钥key+的一个例子:
key=00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001key+=1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
得到key+后,再将其分成两部分CO和DO:
C0=1111000 0110011 0010101 0101111D0=0101010 1011001 1001111 0001111
得到C0和D0后,对CO和D0进行循环左移操作,即可得到C1 ~ C16和D1~D16的值,每一次循环移位的位数分别如下:
1122222212222221
例如,对于之前的CO和D0,第一轮对其进行循环左移一位操作,即可得到C1和D1,而在C1和D1的基础上继续循环左移一位,即可得到C2和D2。
C1=1110000110011001010101011111D1 1010101011001100111100011110C2=1100001100110010101010111111D2=0101010110011001111000111101
接下来,将每组Cn和Dn进行组合,就得到了16组数据,每组数据有56位。最后将每组数据按照表的索引进行誉换,就可以得到K1~K16
比如,对于之前提到的C1D1,通过计算可以得到对应的K1:
C1D1=1110000 1100110 0101010 1011111 1010101 0110011 0011110 0011110K1=000110 110000 001011 101111 111111 000111 000001 110010
(2.3)轮函数
DES中使用的轮函数F结构见图:
每轮的输入会进入E函数并扩展成48位,扩展的方法与前面所使用的索引替换是一样的,替换时直接按照表进行索引即可。
下面是一个输入被E函数扩展的例子:
R0=1111 0000 1010 1010 1111 0000 1010 1010E(R0)=011110 100001 010101 010101 011110 100001 010101 010101
完成扩展后,这个输入会与对应的subkeys进行异或,得到48位的数据。这48位分为8组,每组6位,再分别去索引S1~S8数组中对应的元素。而S1~S8中元素的大小都在0~15范围,即4位。最后,这8个4位的数会被重新拼起来,成为一个32位的数据,再经过置换操作得到F函数的输出。这里的置换操作与前面没有区别,只不过是索引的表变了,所以不再赘述。
AES:
AES(Advanced Encryption Standard) 又称为Rijndael加密法,是美国政府曾采用的一种分组加密标准,用来替代DES,已经被多方分析且广为全世界所使用。与DES不同,AES使用的并不是Feiste的结构,它在每轮都对全部的128位进行了加密。AES的加密过程是在一个4x4字节大小的矩阵上运作的,这个矩阵又称为“体(state) ”,其初值是一个明文区块(矩阵中的一个元素就是明文区块中的1 Byte)。
各轮AES加密循环 (除最后一轮外) 均包含4个步骤:
(1)AddRoundKey: 矩阵中的每字节都与该回合密钥 (round key) 做XOR运算,每个子密钥由密钥生成方案产生(2) SubBytes: 透过一个非线性的替换函数,用查找表的方式把每字节替换成对应字节.(3) ShiftRows: 将矩阵中的每个横列进行循环式移位(4)MixColumns: 充分混合矩阵中各列的操作,使用线性转换混合每列的4字节。最后一个加密循环中省略本步骤,而以AddRoundKey取代。
因为AES的部分操作是在有限域上完成的,所以我们需要了解有限域的相关知识。
(1)有限域
(2)Rijndael 密钥生成:
AES的加密过程中用到的并不是输入的128~256位的短密钥,而是基于该短密钥生成的一系列子密钥,通过原密钥生成子密钥的算法称为Riindael密钥生成方案 (Riindael Key Schedule) 。每轮中,数据都需要与128位的子密钥异或,根据原始密钥生成各轮子密钥的过程是由Rindael密钥生成方案完成的。
(3)AES步骤:
(3.4)常见攻击:
1.Byte-at-a-Time
例如,对于pwnable.kr的crypto1,核心代码如下:
2..CBC-IV-Detection
3.CBC-Bit-Flipping
好用的解密网站:在线AES加密解密、AES在线加密解密、AES encryption and decryption--查错网
学习书籍:从0到1:CTFer成长之路...
密码学:分组密码.(块密码:是一种对称密码算法)相关推荐
- 密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)
文章目录 1. 分组密码(Twine) 1.1 加解密方式 1.1.1 加密 1.1.2 密钥生成算法 1.1.3 解密 1.1.4 全部代码 1.2. 分组密码的模式 1.2.1 ECB模式 1.2 ...
- 密码学入门(2):对称密码
密码学入门(2):对称密码 文章目录 密码学入门(2):对称密码 历史上的密码 凯撒密码 简单替换密码 一次性密码本 DES 三重DES AES 应该使用哪种密码 参考 对称密码是指加密和解密都使用相 ...
- md5不是对称密码算法_密码学中的消息摘要算法5(MD5)
md5不是对称密码算法 In cryptography, MD5 (Message-Digest algorithm 5) is a mainly used cryptographic hash fu ...
- PHP-密码学算法及其应用-对称密码算法
转自:http://www.smatrix.org/bbs/simple/index.php?t5662.html // 目录 1. PHP的散列函数及其应用 2. PHP中的对称密码算法 ...
- 01. 对称密码——算法
密码算法 DES 首先声明!!! 由于DES的密文可以在短时间内被破译,现已不再使用. 是什么? DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS) ...
- 密码学–数字签名Digital Signature五种分类
密码学–数字签名Digital Signature五种分类 基于数字签名用途的分类 基于数学难题的分类 基于密码体制的分类 基于数字签名安全性的分类 基于签名用户的个数分类 A. 基于数字签名用途的分 ...
- 密码学实验报告c语言程序,密码学_实验一_古典密码算法_C语言.doc
您所在位置:网站首页 > 海量文档  > 高等教育 > 实验设计 密码学_实验一_古典密码算法_C语言.doc8页 本 ...
- 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
编译 | 林椿眄 出品 | AI科技大本营(公众号ID:rgznai100) [AI科技大本营导读]Python 被称为是最接近 AI 的语言.最近一位名叫Anna-Lena Popkes的小姐姐在G ...
- 数据科学家必须要掌握的5种聚类算法
编译 | AI科技大本营 参与 | 刘 畅 编辑 | 明 明 [AI科技大本营导读]聚类是一种将数据点按一定规则分群的机器学习技术.给定一组数据点,我们可以使用聚类算法将每个数据点分类到一个特定的 ...
最新文章
- ubuntu 编辑器中文乱码
- Python查询MySQL进行远程采集图片实例
- android关于控件中setTag(key,Object)的设置的相关问题
- 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
- python编写脚本教程_python编写一个会算账的脚本的示例代码
- mysql-plus多数据库_MyBatis-Plus实现多数据源的示例代码
- win10任务栏开始菜单等系统图标点击无反应的解决方法
- USB-PPI数据电缆驱动
- Elsevier论文模板没有author biography的解决办法
- lua web快速开发指南(7) - 高效的接口调用 - httpc库
- [POI2008]枪战Maf
- # 学号12 2016-2017-2 《程序设计与数据结构》第9周学习总结
- ML 能解决哪些问题?
- 【原创】新韭菜日记55--20190412----各行业龙头股
- 6-2 指针与数组-矩阵的各列求和分数 10 本题要求实现一个函数,求一个n (小于10)行7列的二维数组各列的和。将各列和存放在一个至少7个单元的一维数组中。函数接口定义:
- 基于Matlab的双馈风力发电机模型
- apr协议的使用粗解和练习
- 英语词汇--索马里海盗事件
- c++——string的模拟实现
- 浅谈linux的命令行解析参数之getopt_long函数