当前位置:首页 » 密码管理 » 密码学中为什么要向左循环移动
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

密码学中为什么要向左循环移动

发布时间: 2022-12-23 14:51:06

1. 这是有关循环冗余校验码知识,求专家们指导。不懂的地方如下。

楼主你好~

生成多项式是CRC算法给定的,这个多项式可以随意给定,不过多项式有强弱之分,所以(1)里面那个a(x)对应的二进制除数是110011。
这个多项式是给定的哦~不是得出来的。
这个二进制数在通信双方通信期间不变,相当于是一个上锁箱子的钥匙,这个钥匙是给定的,不能随便一把钥匙来开这个锁。
生成多项式的原则是,例如这个二进制数是100101,那么只要把每一位1给拿出来就行了,a(x)=1*x^5+0*x^4+0*x^3+1*x^2+0*x^1+1*x^0=x^5+x^2+1,这个多项式有一个必要,就是最高位和最低位一定要为1。还有几点比如信息源改变不同位得到余数不同等,这些是生成多项式的强弱,具体请参照密码学和编码学的相关知识,不过这跟算法本身没关系。

对于第二个问题,楼主别想这么多,他说的很学术,我直接跟楼主讲:
数据比如是1101101011,CRC生成多项式比如为a(x)=x^4+x^2+1,则他对应的二进制数是A=10101,(原理在上面)。那么你看A是5位,那么R就等于4,就是A位数-1,R=4,意味着数据位要向左移动4位,也就是数据变为11011010110000,然后进行下一步算法。
以上就是楼主第二个问题的通俗说法,学算法重要的是掌握它的原理,而不是死记硬背式子。

请追问~

2. 对称密码体制和非对称密码体制的工作原理分别是什么并说明各自的优缺点

对于加密,基本上不存在一个完全不可以被破解的加密算法,因为只要你有足够的时间,完全可以用穷举法来进行试探,如果说一个加密算法是牢固的,一般就是指在现有的计算条件下,需要花费相当长的时间才能够穷举成功(比如100年)。一、主动攻击和被动攻击数据在传输过程中或者在日常的工作中,如果没有密码的保护,很容易造成文件的泄密,造成比较严重的后果。一般来说,攻击分为主动攻击和被动攻击。被动攻击指的是从传输信道上或者从磁盘介质上非法获取了信息,造成了信息的泄密。主动攻击则要严重的多,不但获取了信息,而且还有可能对信息进行删除,篡改,危害后果及其严重。 二、对称加密基于密钥的算法通常分为对称加密算法和非对称加密算法(公钥算法)。对成加密算法就是加密用的密钥和解密用的密钥是相等的。比如着名的恺撒密码,其加密原理就是所有的字母向后移动三位,那么3就是这个算法的密钥,向右循环移位就是加密的算法。那么解密的密钥也是3,解密算法就是向左循环移动3位。很显而易见的是,这种算法理解起来比较简单,容易实现,加密速度快,但是对称加密的安全性完全依赖于密钥,如果密钥丢失,那么整个加密就完全不起作用了。比较着名的对称加密算法就是DES,其分组长度位64位,实际的密钥长度为56位,还有8位的校验码。DES算法由于其密钥较短,随着计算机速度的不断提高,使其使用穷举法进行破解成为可能。三、非对称加密非对称加密算法的核心就是加密密钥不等于解密密钥,且无法从任意一个密钥推导出另一个密钥,这样就大大加强了信息保护的力度,而且基于密钥对的原理很容易的实现数字签名和电子信封。比较典型的非对称加密算法是RSA算法,它的数学原理是大素数的分解,密钥是成对出现的,一个为公钥,一个是私钥。公钥是公开的,可以用私钥去解公钥加密过的信息,也可以用公钥去解私钥加密过的信息。比如A向B发送信息,由于B的公钥是公开的,那么A用B的公钥对信息进行加密,发送出去,因为只有B有对应的私钥,所以信息只能为B所读取。牢固的RSA算法需要其密钥长度为1024位,加解密的速度比较慢是它的弱点。另外一种比较典型的非对称加密算法是ECC算法,基于的数学原理是椭圆曲线离散对数系统,这种算法的标准我国尚未确定,但是其只需要192 bit 就可以实现牢固的加密。所以,应该是优于RSA算法的。优越性:ECC > RSA > DES

3. 密码学第一次实验报告:DES算法与差分攻击

DES算法与差分攻击

了解DES算法基本工作原理,体会并理解分组密码算法的混淆和扩散概念。了解Sbox工作原理及效果。了解DES的工作模式和填充方式。了解差分攻击
的基本原理。

IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。

表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。

不考虑每个字节的第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位):

压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送人S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。

一个S盒就是一个4行16列的表,盒中的每一项都是一个4位的数。S盒的6个输入确定了其对应的输出在哪一行哪一列,输入的高低两位做为行数H,中间四位做为列数L,在S-BOX中查找第H行L列对应的数据(<32)。

S盒代替时DES算法的关键步骤,所有的其他的运算都是线性的,易于分析,而S盒是非线性的,相比于其他步骤,提供了更好安全性

S盒代替运算的32位输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去,映射规则如下表:

表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第16位放到新数据的第1位,第7位放到第2位,……依此类推,第25位放到第32位。

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:

置换方法同上

实际应用中,DES是根据其加密算法所定义的明文分组的大小(64bits),将数据割成若干64bits的加密区块,再以加密区块为单位,分别进行加密处理。根据数据加密时每个加密区块间的关联方式,可以分为4种加密模式,包括ECB,CBC,CFB及OFB。

DES算法其中主要起作用的算法有:矩阵置换、扩展、左移、异或、左右互换、s盒作用 。其中对攻击者来说最麻烦的要说s盒一步,破解des体系关键在s盒。 
乍一看六位输入与四位输出貌似没什么关系。但事实上,对于同一个s盒具有相同输入异或的所有输入六比特组的输出四比特异或值有一定规律。 
具体些说,对于输入异或相同的明文对B,B*仅有32组,而这32组输出异或却并不是均匀分布,而是仅分布在很少的几个四比特值中;也可以说具有相同输入异或且输出四比特异或也相同的六比特输入数量不多且分布不均匀。正是这种输入输出输出异或间的不均匀性可以被攻击者利用并破解密钥。

结果表格:

4. 密码学知识精粹

① 替换法
替换法很好理解,就是用固定的信息将原文替换成无法直接阅读的密文信息。例如将 b 替换成 w ,e 替换成p ,这样bee 单词就变换成了wpp,不知道替换规则的人就无法阅读出原文的含义。
替换法有单表替换和多表替换两种形式。

② 移位法
移位法就是将原文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后得出密文,典型的移位法应用有 “ 恺撒密码 ”。
例如约定好向后移动2位(abcde - cdefg),这样 bee 单词就变换成了dgg。

古典密码破解方式--频率分析法

古典密码的安全性受到了威胁,外加使用便利性较低,到了工业化时代,近现代密码被广泛应用。

恩尼格玛机
恩尼格玛机是二战时期纳粹德国使用的加密机器,其使用的加密方式本质上还是移位和替代,后被英国破译,参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。

① 散列函数加密(消息摘要,数字摘要)
散列函数,也见杂凑函数、摘要函数或哈希函数,可将任意长度的消息经过运算,变成固定长度数值,常见的有MD5、SHA-1、SHA256,多应用在文件校验,数字签名中。
MD5 可以将任意长度的原文生成一个128位(16字节)的哈希值
SHA-1可以将任意长度的原文生成一个160位(20字节)的哈希值
特点:消息摘要(Message Digest)又称为数字摘要(Digital Digest)
它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生
使用数字摘要生成的值是不可以篡改的,为了保证文件或者值的安全

MD5算法 : 摘要结果16个字节, 转16进制后32个字节
SHA1算法 : 摘要结果20个字节, 转16进制后40个字节
SHA256算法 : 摘要结果32个字节, 转16进制后64个字节
SHA512算法 : 摘要结果64个字节, 转16进制后128个字节

② 对称加密
对称密码应用了相同的加密密钥和解密密钥。对称密码分为:序列密码(流密码),分组密码(块密码)两种。流密码是对信息流中的每一个元素(一个字母或一个比特)作为基本的处理单元进行加密,块密码是先对信息流分块,再对每一块分别加密。
例如原文为1234567890,流加密即先对1进行加密,再对2进行加密,再对3进行加密……最后拼接成密文;块加密先分成不同的块,如1234成块,5678成块,90XX(XX为补位数字)成块,再分别对不同块进行加密,最后拼接成密文。前文提到的古典密码学加密方法,都属于流加密。

示例
我们现在有一个原文3要发送给B
设置密钥为108, 3 * 108 = 324, 将324作为密文发送给B
B拿到密文324后, 使用324/108 = 3 得到原文
常见加密算法
DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
AES : Advanced Encryption Standard, 高级加密标准 .在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
特点
加密速度快, 可以加密大文件
密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露
加密后编码表找不到对应字符, 出现乱码,故一般结合Base64使用
加密模式
ECB : Electronic codebook, 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密
优点 : 可以并行处理数据
缺点 : 同样的原文生成同样的密文, 不能很好的保护数据
CBC : Cipher-block chaining, 密码块链接. 每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块
优点 : 同样的原文生成的密文不一样
缺点 : 串行处理数据
填充模式:当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则
NoPadding不填充.

对应的AES加密类似,但是如果使用的是AES加密,那么密钥必须是16个字节。

加密模式和填充模式:
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)

PS: Base64是网络上最常见的用于传输8Bit字节码的可读性编码算法之一
可读性编码算法不是为了保护数据的安全性,而是为了可读性
可读性编码不改变信息内容,只改变信息内容的表现形式
所谓Base64,即是说在编码过程中使用了64种字符:大写A到Z、小写a到z、数字0到9、“+”和“/”
Base64 算法原理:base64 是 3个字节为一组,一个字节 8位,一共 就是24位 ,然后,把3个字节转成4组,每组6位(3 * 8 = 4 * 6 = 24),每组缺少的2位会在高位进行补0 ,这样做的好处在于 base取的是后面6位而去掉高2位 ,那么base64的取值就可以控制在0-63位了,所以就叫base64,111 111 = 32 + 16 + 8 + 4 + 2 + 1 =

toString()与new String ()用法区别

③ 非对称加密
非对称密码有两支密钥,公钥(publickey)和私钥(privatekey),加密和解密运算使用的密钥不同。用公钥对原文进行加密后,需要由私钥进行解密;用私钥对原文进行加密后(此时一般称为签名),需要由公钥进行解密(此时一般称为验签)。公钥可以公开的,大家使用公钥对信息进行加密,再发送给私钥的持有者,私钥持有者使用私钥对信息进行解密,获得信息原文。因为私钥只有单一人持有,因此不用担心被他人解密获取信息原文。
特点:
加密和解密使用不同的密钥
如果使用私钥加密, 只能使用公钥解密
如果使用公钥加密, 只能使用私钥解密
处理数据的速度较慢, 因为安全级别高
常见算法:RSA,ECC

数字签名
数字签名的主要作用就是保证了数据的有效性(验证是谁发的)和完整性(证明信息没有被篡改),是非对称加密和消息摘要的应用

keytool工具使用
keytool工具路径:C:\Program Files\Java\jre1.8.0_91\bin

--- END

5. 密码学三个阶段产生原因

古典密码阶段。
这一阶段主要是从古代到19世纪末。古代的时候,对信息进行隐藏的常用方式就是字谜,谜语就是明文而谜底就是密文,破解的方法也很简单,全靠猜。古典密码学中,有许多经典的密码体制,例如Caesar凯撒密码、Polybius密码、多表替代密码、维吉尼亚密码等。凯撒密码为例,就是将将英文字母向前移动k位。从而生成字母替代的密表。例如移动两位在明文中的字母A其实代表的是C,以此类推。到了20世纪20年代,随着机械技术的发展,转轮密码机诞生了,给密码学的应用带来了巨大进步。
近代密码阶段。
1945年至1975年这段时期被称作近代密码学阶段。密码学在这一阶段的发展是以计算机通信技术的发展和普及为基础的,由于信息在计算机通信中的存储和传输要求,出于对信息安全的考虑,密码学得到了极快的发展。1949年Shannon发表了一篇论文《保密系统的通信理论》,奠定了密码学的理论基础,从而使具有数千年历史的密码学正式成为一门独立学科。
现代密码阶段。
1976年至今为现代密码学阶段。在近代密码学时期,我们会发现注入密码机等设备一开始研制就是运用于军事和政治领域,到了20世纪70年代中期以前,密码学的研究也是秘密进行。W.Diffie和M.EHellman在1976年公布了一种密钥一致性算法,简称DH算法,标志着密码学进入公钥密码学阶段。

6. 【密码学笔记】第3部分 对称密码

跟诸位大牛相比,笔者阅历尚浅、经验不足,笔记中若有错误,还需继续修正与增删。欢迎大家的批评与指正。

查看上一篇请点击以下链接: 【密码学笔记】第2部分 历史上的密码

1. XOR运算

2. 一次性密码本

3. 对称密码算法

    3.1 DES

    3.2 三重DES

    3.3 AES

    3.4 Rijndael

4. 对称密码的选择

5. 对称密码的评价

参考书目

XOR运算,又称为 异或 运算,运算结果是 同0异1 。

对同一个比特序列进行两次XOR之后就会回到最初的状态,因此XOR运算可用于对称密码的加密和解密。

一次性密码本(又称为 维纳密码 )是一种非常简单的密码,它的原理是“ 将明文与一串随机的比特序列进行XOR运算 ”。

一次性密码本是无法破译的。 这是因为在对它尝试解密的过程中,所有的排列组合都会出现,既会包含规则字符串,也会包含英文单词,还会包含乱码。由于明文中所有可能的排列组合都会出现,因此 我们无法判断其中哪一个才是正确的明文 。

一次性密码本是一种非常不实用的密码。 原因如下:

a. 密钥的配送 。( 最大的问题 )如果能够有一种方法将密钥安全地发送出去,那么就可以用同样的方法安全地发送明文。

b. 密钥的保存 。 密钥的长度必须和明文的长度相等。 如果能够有办法安全保存与明文一样长的密钥,那就有办法安全保存明文本身。

c. 密钥的重用 。在一次性密码本中绝对不能重用过去用过的随机比特序列,因为作为密钥的比特序列一旦泄露,过去所有的机密通信内容将全部被解密。

d. 密钥的同步 。在通信过程中,发送者和接收者的密钥的比特序列不允许有任何错位,否则错位的比特后的所有信息都将无法解密。

e. 密钥的生成 。一次性密码本需要生成大量的随机数,这里的随机数并不是通过计算机程序生成的伪随机数,而必须是无重现性的真正随机数。

DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特。

DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为 分组 。以分组为单位进行处理的密码算法称为 分组密码 。

DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代,而迭代的具体方式就称为 模式(mode) 。

DES的基本结构又称为 Feistel网络 ,这一结构不仅被用于DES,在其他很多密码算法中也有应用。在Feistel网络中,加密的各个步骤称为 轮(round) ,整个加密过程就是进行若干次轮的循环。下图展现的是Feistel网络中一轮的计算流程。DES是一种16轮循环的Feistel网络。

一轮的具体计算步骤 如下:

a. 将输入的数据等分为左右两部分;

b. 将输入的右侧直接发送到输出的右侧;

c. 将输入的右侧发送到轮函数;

d. 轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列;

e. 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。

我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。

Feistel网络的解密操作只要按照相反的顺序来使用子密钥就可以完成了。

Feistel网络的性质 :

a. 轮数可以任意增加;

b. 加密时无论使用任何函数作为轮函数都可以正确解密(即使该函数不存在反函数);

c. 加密和解密可以用完全相同的结构来实现。

综上所述,无论是任何轮数、任何轮函数,Feistel网络都可以 用相同的结构实现加密和解密 ,且加密的结果必定能够正确解密。

三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称为 TDEA ,通常缩写为 3DES 。

明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是168比特。

三重DES并不是进行三次DES加密,而是 加密→解密→加密 的过程,目的是 让三重DES能够兼容普通的DES ,当所有密钥都相同时,三重DES也就等同于普通的DES。

尽管三重DES目前还被银行等机构使用,但其处理速度不高,除了特别重视向下兼容性的情况以外,很少被用于新的用途。

AES是取代其前任标准(DES)而成为新标准的一种对称密码算法。全世界的企业和密码学家提交了多个对称密码算法作为AES的候选,最终选出了一种名为 Rijndael 的对称密码算法,并将其确定为AES。

AES的选拔并不仅仅考虑一种算法是否存在弱点,算法的速度、实现的容易性等也都在考虑范围内。此外,这种算法还必须能够在各种平台上有效工作。

Rijndael是由比利时密码学家设计的 分组密码算法 ,被选为新一代的标准密码算法——AES。

和DES一样,Rijndael算法也是由多个 轮 构成的,其中每一轮分为 SubBytes 、 ShiftRows 、 MixColumns 和 AddRoundKey 共4个步骤。DES使用Feistel网络作为其基本结构,而Rijndael使用的是 SPN结构 。

加密过程 :

a. 首先,需要 逐个字节 地对16字节的输入数据进行SubBytes处理,即以每个字节的值(0~255)为索引,从一张拥有256个值的 替换表 (S-Box)中查找出对应值( 类似于简单替换密码 )。

b. 进行ShiftRows处理,即以4字节为单位的 行(row) 按照一定的规则向左平移,且每一行平移的字节数是不同的。

c. 进行MixColumns处理,即对一个4字节的值进行比特运算,将其变为另外一个4字节值。

d. 最后,将MixColumns的输出与轮密钥进行 XOR ,即进行AddRoundKey处理。至此,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10~14轮计算。

在SPN结构中, 输入的所有比特在一轮中都会被加密 。和每一轮都只加密一半输入的比特的Feistel网络相比,这种方式的优势在于 加密所需要的轮数更少 。此外,这种方式还有一个优势,即 SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行并行计算 。

在Rijndael的 加密 过程中,每一轮所进行的处理为:

SubBytes→ShiftRows→MixColumns→AddRoundKey

而在 解密 时,则是按照相反的顺序来进行的,即:

AddRoundKey→InvMixColumns→InvShiftRows→InvSubBytes

解密过程 :

Rijndael算法背后有着 严谨的数学结构 ,即从明文到密文的计算过程可以全部用公式来表达,这是以前任何密码算法都不具备的性质。如果Rijndael的公式能够通过数学运算来求解,那也就意味着Rijndael能够通过数学方法进行破译,这也为新的攻击方式的产生提供了可能。

(1) 因为现在用暴力破解法已经能够在现实的时间内完成对DES的破译, DES不应再用于任何新的用途 。但是也需要保持与旧版本软件的兼容性。

(2) 尽管在一些重视兼容性的环境中会使用三重DES,但 我们也没有理由将三重DES用于新的用途 ,它会逐渐被AES所取代。

(3) 现在应该使用的算法是AES(Rijndael) ,因为它安全、快速,而且能够在各种平台上工作。

(4) AES最终候选算法应该可以作为AES的备份 ,因为这些密码算法也都经过了严格的测试,且没有发现任何弱点。

(5) 一般来说, 我们不应该使用任何自制的密码算法 ,而是应该使用AES。

优点 :

使用一种密钥空间巨大,且在算法上没有弱点的对称密码,就可以通过密文来确保明文的机密性。 巨大的密钥空间能够抵御暴力破解,算法上没有弱点可以抵御其他类型的攻击。

不足 :

a. 用对称密码进行通信时,还会出现 密钥的配送问题 ,即如何将密钥安全地发送给接受者。为了解决密钥配送问题,需要 公钥密码技术 。

b. 尽管使用对称密码可以确保机密性,但仅凭这一点还并不能完全放心。 例如发送者可能发送伪造的密文,并利用解密时返回的错误来盗取信息。

衷心感谢您的阅读。

查看下一篇请点击以下链接: 【密码学笔记】第4部分 分组密码的模式

7. (密码学)(信息安全)AES算法中的倍乘函数为什么能实现循环左移

AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了AES的概貌并解析了它使用的算法。包括一个完整的C#实现和加密.NET数据的举例。在读完本文后你将能用AES加密、测试 基于AES的软件并能在你的系统中使用AES加密。

美国国家标准与技术研究所(NIST)在2002年5月26日建立了新的高级数据加密标准(AES)规范。本文中我将提供一个用C#编写的的能运行的 AES 实现,并详细解释到底什么是 AES 以及编码是如何工作的。我将向您展示如何用 AES 加密数据并扩展本文给出的代码来开发一个商业级质量的 AES 类。我 还将解释怎样把 AES 结合到你的软件系统中去和为什么要这么做,以及如何测试基于 AES 的软件。
注意本文提供的代码和基于本文的任何其它的实现都在联邦加密模块出口控制的适用范围之内(详情请参看 Commercial Encryption Export Controls )。
AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。


Figure 1 部分数据

AES算法概述

AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换。为了阐明这些技术,让我们用 Figure 1 所示的数据讨论一个具体的 AES 加密例子。下面是你要加密的128位值以及它们对应的索引数组:

00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

192位密钥的值是:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23


Figure 2 S-盒( Sbox )

当 AES 的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的密钥调度表,Figure 3 所示。

网页链接你也可以去这里看看

8. 密码学笔记

别人用A的公钥加密传输的信息,只有A的私钥可以解密。保证了传输的信息的安全性。

A用A的私钥加密的信息,别人用A的公钥才可以解密。可以证明这个信息一定是A传输而来的。

共享秘钥(对称加密):速度快,但无法保证客户端与服务器之间传输时秘钥的安全性。

和公开密钥(非对称加密):安全,速度慢。

一、客户端请求SSL(安全套接层)通信,报文中包含自己支持的SSL版本、加密算法等。

二、服务器应答,附带自己的公钥证书,协商定好的SSL版本、加密组件。

三、客户端根据自己本地的收信任的CA公钥,解封服务器公钥证书,得到服务器公钥。客户端生成一个随机码序列,用服务器公钥加密后,发回服务器。

四、服务器用私钥解密后,再加密将字符串传回客户端。

五、客户端确认服务器身份后,生成对称加密算法和共享秘钥,使用服务器公钥加密后,传给服务器。

六、此后,双方使用对称加密算法加密数据,进行传输。

上面过程中,一二用于获得合法的服务器公钥,三四用于确认服务器是否为真正私钥持有者(因为,服务器公钥谁都可以得到)。

使用与明文比特序列一样长的,真正的随机数序列,进行加密,绝对安全,因为穷举破译后能得到整个秘钥空间,毫无意义。

以分组为单位进行处理的密码算法称为 分组密码。

采用 Feistel网络。

以 64 bit 为一个加密单位,首先分成两部分,各32 bit 。

加密过程持续数轮,每轮中,使用子秘钥与右侧数据经过轮函数生成一个序列,然后与左侧做 XOR 。

每轮结束后,左右两侧交换。

加解密结构相同,轮数任意,函数任意。

使用秘钥1、2、3对明文进行加密、解密、加密三个过程,称为三重DES。

解密过程是为了兼容老版DES,如果1、2、3秘钥相同,则成为了普通DES。

1、3秘钥相同,2不同时,称为DES-EDE2 。

1、2、3秘钥不同,称为DES-EDE3 。

采用的是 Rijndael 算法,SPN结构。

输入分组为 128bit(16字节),秘钥长度可以以 32bit 为单位,在128~256bit之间选择。

该算法由多轮构成,10~14轮。

一轮中:

SubBytes,按字节,将输入分开,以每个字节为索引,查表找值,替换。

ShiftRows(平移行),按字节,打乱上面的输出。

MixColumns (混合列),按4个字节,比特运算。

与轮秘钥进行 XOR 。

分组密码:每次处理,特定长度的一块数据。

流密码:对数据流,连续处理,需要保持内部状态,记录进度。

明文分组加密后,直接成为,密文分组。

特点:攻击者无需破译,即可操纵明文。

明文分组,与前一个密文分组XOR,加密得到自己的密文分组。

第一个分组的前一个密文分组,由 初始化向量(随机比特序列) 代替。

加密时,需要从头开始。因为需要与密文分组做 XOR 。

解密时,对密文分组解密,直接与密文分组 XOR 即可。

同样的明文分组,密文值可以不相等。

密文分组可以损坏,影响部分。

密文分组比特缺失,影响全部。

前一个密文分组,通过加密算法得到一个比特序列,称为 密钥流 。

明文分组,与密钥流 XOR,得到自己的密文分组。

解密时,加密算法对密文分组进行加密,得到密钥流,与密文 XOR 可得到明文。

重复攻击:假设秘钥相同。发送 4 个分组,攻击者保存了后面3个。转天,你又发送了 4 个分组,攻击者将你后面三个替换,接收方解密后,只有 2 号分组有错。

对于每个分组,初始化向量加密后,得到密钥流。明文与密钥流 XOR 后,得到密文。

速度快,密钥流可以提前生成,或者,生成秘钥过程可以和 XOR 运算并行。

对每个计数器加密得到密钥流。密钥流与明文分组 XOR ,得到密文分组。

计数器生成的数,由 一个随机序列 nonce + 从1开始的递增数字 组成。

对每个分组,计数器递增后,加密,得到密钥流。

能够以任意顺序处理分组,因为加密时需要的初始数字序列能够计算出来。

为了确保安全,有地理局限,与不同的人通信需要不同密钥,共享繁琐。

每个员工有自己的密钥,密钥分配中心使用个人密钥,包裹临时会话密钥,分配给各个员工使用。

密文=明文的E次方 MOD N

E 和 N 是RSA加密用的密钥,也就是说,E 和 N 的组合就是公钥。

明文=密文的D次方 MOD N

D 和 N 的组合就是私钥。

寻两个很大的质数 p 和 q,相乘得到 N

L为 p-1 和 q-1 的最小公倍数

随机数生成器,不停地生成数字,直到满足如下条件:

1 < E < L

E 和 L 的最大公约数为 1

根据 E ,计算 D

1 < E < L

E × D MOD L = 1

保证 E 与 L 互质,则 D 一定存在。

求对数很容易,求 离散对数 很困难

对一个大数字进行质因数分解,人类未找到高效算法

利用了 MOD N下,求离散对数的困难度

加密后,密文长度翻倍

利用了 MOD N下,求平方根的困难度

密码实现通过 对椭圆曲线上的特定点进行特殊乘法。

利用了该种乘法的逆运算非常困难这一特性

单向散列函数 又称为,消息摘要函数、哈希函数、杂凑函数

输入的消息 又称为,原像

散列值 又称为,消息摘要、指纹

完整性 又称为,一致性

根据任意消息,计算出的散列值长度,固定

用时短

消息不同,散列值不同

具备单向性

MD是消息摘要的意思

可以产生 128bit 的散列值,但它们的抗碰撞性已被攻破

SHA-1散列值长度为 160bit,强碰撞性已被攻破

其余的统称为 SHA-2,散列值长度为各自后面的数字

欧盟版本

第三代 SHA

消息上限 2^64 bit。

消息长度需要是 512bit 的整数倍。这样的 512比特 称为一个输入分组。

过程:

消息末尾添加 1

然后添加 0,直到最后一个分组的 448比特 的位置

最后 64比特 需要保存原是消息的长度

对每个分组计算 80 个 32bit 的值。

过程:

将 512bit 分成 32bit × 16组,称为 W0~W15

从15组中按规律取4组,进行 XOR 运算,结果循环左移 1 位,得到另外一组。如此反复,得到总共 80 组。

ABCDE 五个 32bit 的缓冲区,保存了 160bit 的消息内部状态。

内部状态与每个 512bit 的输入分组混合,一共 80 个步骤。

最终得到 160bit 的最终内部状态。

暴力破解:暴力寻找与 1亿元合同 散列值相同的文件

生日攻击:准备两份 散列值相同的 1亿元合同

可以辨别 篡改,无法辨别 伪装,因此还需要 认证技术

认证技术包括 消息验证码 和 数字签名

消息验证码:可以向通信对象保证消息不被篡改

数字签名:可以向任何人保证通信对象不被篡改

message authentication code,简称 MAC。

相当于 使用共享密钥的单向散列函数

SWIFT:负责银行间的交易,公钥密码使用前,都是人工配送密钥的。

IPsec:对IP协议增加安全性,采用的是消息认证码

SSL/TLS:网上购物等场景中所用协议。

过程:

密钥填充 至单向散列函数要求的输入分组大小

填充后的密钥 与 ipad(16进制的36不断循环)XOR,得到ipadkey

与 消息 组合,计算散列值

填充后的密钥 与 opad(16进制的5C不断循环)XOR,得到opadkey

与 上面得到的散列值 组合,计算新的散列值,为最终的MAC值

对第三方证明

防止否认

因为知晓密钥的只有两个当事人,第三者无法确定能拿到合法的密钥,无法自己计算合法MAC值

RSA:利用质因数分解难度的那个

ElGamal:利用求离散对数的困难度的那个,数字签名有漏洞,现仅用于公钥密码

DSA:Schnorr算法与ElGamal方式的变体,只能用于数字签名

Rabin:利用了求MOD N中平方根的困难度,可用于数字签名和公钥密码

例如,verisign公司的认证业务分为三个等级,等级越高,越严格

ITU 国际电信联盟和 ISO 国际标准化组织制定的 X.509 规范如下

大体包含以下内容:

签名前的证书——签名对象的各种消息

数字签名算法——签名时所用的算法

数字签名——得到的数字签名

PKI :为了能有效使用公钥而制定的一系列规范和规格

PKI 的组成要素如下

两种方法:一种是由认证机构生成,一种是由 PKI 用户自行生成

认证机构有一个 CRL(认证作废清单),具有数字签名,记载了已经作废的证书的编号。

认证时,从上(根证书)往下

对于密钥,关键的是 密钥空间的大小

DES 的密钥 实质长度(即,除去校验错误的比特后的长度)7字节

DES-EDE2 的实质长度 14字节,DES-EDE3 的实质长度 21字节

AES 的密钥长度可以从 128、192 和 256bit 当中选

会话密钥:每次通信中,仅使用一次的密钥

主密钥:一直被重复使用的密钥

CEK:Contents Encrypting Key

KEK: Key Encrypting Key

各个步骤中的密钥管理方法

两种方法:

用随机数生成密钥:使用具备不可预测性的伪随机数生成器生成随机数

用口令生成密钥:一般使用,口令 + 一串称为 salt 的随机数,得到他们的散列值作为密钥(这种方法称为:基于口令的密码)

事先共享

秘钥分配中心

使用公钥密钥

Diffie-Hellman 密钥交换

密钥更新:一种提高通信机密性的技术

原理:

使用 共享密钥 进行通信时,定期改变密钥。

双方使用同样的方法,对当前密钥求 散列值,并作为下一个密钥

优点:

后向安全:防止破译过去的内容

对密钥进行加密,然后保存

意义:

同时对多个密钥进行加密,可以减少保存密钥的数量

步骤:

P 为非常大的质数,G 为 P 的 生成元

目的为,将 随机数 A 的信息 含蓄地发给了 B

目的为,将 随机数 B 的信息 含蓄地发给了 A

计算方法:密钥 = (G ^ B MOD P) ^ A MOD P = G^(A × B) MOD P

计算方法:密钥 = (G ^ A MOD P) ^ B MOD P = G^(A × B) MOD P

对于一个质数 P ,只有它的生成元在进行 G ^ x MOD P 时,结果能够覆盖 0 ~ P-1 的所有数字

用途:用于安全的保存密钥

由来:

一 生成会话密钥 CEK ,加密消息

二 需要保密 会话密钥CEK,使用 密钥加密密钥KEK 对会话密钥进行保密

三 现在需要保密 KEK 这个密钥,选择使用口令生成这个 KEK

保密的问题最终都归结为了 安全保存密钥,然而我们记不住密钥。

于是,选择单向散列函数对口令生成散列值,作为密钥。

这个密钥无需保存,我们可以通过口令随时求得,口令也无法被反向推出,且口令方便记忆。

顺带,为了防止字典攻击,生成口令散列值时,需要使用 口令 + salt(随机数序列)

事先 已准备好 候选列表 的攻击方法

随机性

不可预测性

不可重见性

这三个性质,越往下越严格。分别称为:

弱伪随机数(不可用于密码学)

强伪随机数

真随机数

伪随机数生成器是公开的,种子是保密的。

确保种子的不可预测性,更加容易些。

种子是用来对伪随机数生成器的 内部状态进行初始化

R1 = (A × R0 + C) MOD M

数据有限,不能用于密码学

单向散列函数的单向性是支撑伪随机数序列不可预测性的基础

利用 AES 等对称密钥对内部状态进行加密

从当前时间开始,利用加密算法 求得加密后的时间的掩码 (因为密钥未知,别人无法推测出掩码信息)

与内部状态 XOR,加密后输出, 得到伪随机数序列

对伪随机数序列加密后,作为 下一个内部状态

针对极端情况的密码软件,具有全部功能。

TLS 由 TLS 记录协议 和 TLS 握手协议 叠加而成。

负责消息的 加密、压缩 和 认证

商定 客户端和服务器 所用的加密算法和密钥

负责 传递 变更密码的信号

发生错误时 通知对方

传输数据