导航:首页 > 文档加密 > 密码学和信息加密的复习资料

密码学和信息加密的复习资料

发布时间:2023-03-02 01:32:04

Ⅰ 密码学笔记

别人用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 握手协议 叠加而成。

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

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

负责 传递 变更密码的信号

发生错误时 通知对方

传输数据

Ⅱ 密码学部分 数据加密标准(DES)相关知识来回答,越详细约好

额……我该说啥呢……
首先给你一个网址看看:http://kweenzy.blog.51cto.com/1093584/1008506
嘛……这个就是我本人的博客,所以不算抄袭哈……

1、见链接中【轮结构】下面的图,每一个方框的右下角都写了诸如“56bit”的字样(1bit就是1位)……
2、见整个文章的中部位置红色字体“密钥的处理流程……”下面所述……
3、和4、……请参见原文然后想一下该怎么回答……不过S盒的工作原理是啥我还真不知道……
5、DES的安全弱点啊……最显而易见的是有弱密钥,但是数量很少,在每次产生子密钥的时候稍微做一下检查就可以解决这个问题,貌似也说不上什么弱点?以及,S盒是整个运算里唯一的一个非线性运算,其他的都是线性运算,线性运算就表示可以进行反推,所以S盒的安全性非常重要!但是S盒是完全公开的啊……更神奇的是研究了半天发现了一些S盒的规律但是根据发现出来的规律编程重新生成S盒的话,安全性没有这个S盒高!另外,其实整个DES的加密过程经过了NSA(美国国家安全局)的修改,他们还拒绝提供为什么修改的信息,所以很多人担心其实NSA可以分分钟破解DES……其他的安全弱点……记不清了……回头找资料来补充回答哈……
6、我靠不会描述!……骚年你自己加油看完资料再思考怎么进行数学描述……
7、密钥的使用顺序是相反的……【其实好像密钥进行左循环移位时,加密密钥第一轮移位是1位,解密密钥第一轮是0位……
8、骚年你自己加油画出示意图……【EDE就是先加密再解密再加密,3就是使用三个不同的密钥K1K2K3……

Ⅲ 密码学基础

​ 密码学是研究如何保护信息安全性的一门科学,涉及数学、物理、计算机、信息论、编码学、通讯技术等学科,已经在生活中得到广泛应用。

​ 密码学组成分支分为编码学和密码分析学。密码编码学主要研究对信息进行编码,实现信息的隐蔽。密码分析学主要研究加密消息的破译或消息的伪造。二者相互独立,又相互依存,在矛盾与斗争中发展,对立统一。

​ 密码学的发展历史大致可划分为三个阶段:

机密性

仅有发送方和指定的接收方能够理解传输的报文内容。窃听者可以截取到加密了的报文,但不能还原出原来的信息,即不能得到报文内容。

鉴别

发送方和接收方都应该能证实通信过程所涉及的另一方, 通信的另一方确实具有他们所声称的身份。即第三者不能冒充跟你通信的对方,能对对方的身份进行鉴别。

报文完整性

即使发送方和接收方可以互相鉴别对方,但他们还需要确保其通信的内容在传输过程中未被改变。

不可否认性

如果人们收到通信对方的报文后,还要证实报文确实来自所宣称的发送方,发送方也不能在发送报文以后否认自己发送过报文。

​ 密码体制是一个使通信双方能进行秘密通信的协议。密码体制由五要素组成,P(Plaintext明文集合),C(Ciphertext密文集合),K(Key密钥集合),E(Encryption加密算法),D(Decryption解密算法),且满足如下特性: 

<script type="math/tex; mode=display" id="MathJax-Element-1"> p ∈ P </script>

<script type="math/tex; mode=display" id="MathJax-Element-2"> c ∈ C </script>

<script type="math/tex; mode=display" id="MathJax-Element-3"> k1 ∈ K, k2 ∈ K </script>

<script type="math/tex; mode=display" id="MathJax-Element-6"> E_{k1}(p) = c,D_{k2}(c) = p </script>

​ 无论是用手工或机械完成的古典密码体制,还是采用计算机软件方式或电子电路的硬件方式完成的现代密码体制,其加解密基本原理都是一致的。都是基于对明文信息的替代或置换,或者是通过两者的结合运用完成的。

​ 替代(substitution cipher):有系统地将一组字母换成其他字母或符号;

​ 例如‘help me’变成‘ifmq nf’(每个字母用下一个字母取代)。

​ 置换(Transposition cipher):不改变字母,将字母顺序重新排列;

​ 例如‘help me’变成‘ehpl em’(两两调换位置)。

​ 密码分析者通常利用以下几种方法对密码体制进行攻击:

​ 已知明文分析法: 

知道一部分明文和其对应的密文,分析发现秘钥。

​ 选定明文分析法: 

设法让对手加密自己选定的一段明文,并获得对应的密文,在此基础上分析发现密钥。

​ 差别比较分析法: 

设法让对方加密一组差别细微的明文,通过比较他们加密后的结果来分析秘钥。

​ 无条件安全: 

无论破译者的计算能力有多强,无论截获多少密文,都无法破译明文。

​ 计算上安全:

​ 破译的代价超出信息本身的价值,破译所需的时间超出信息的有效期。

​ 任何密码系统的应用都需要在安全性和运行效率之间做出平衡,密码算法只要达到计算安全要求就具备了实用条件,并不需要实现理论上的绝对安全。1945年美国数学家克劳德·E·香农在其发布的《密码学的数学原理》中,严谨地证明了一次性密码本或者称为“弗纳姆密码”(Vernam)具有无条件安全性。但这种绝对安全的加密方式在实际操作中需要消耗大量资源,不具备大规模使用的可行性。事实上,当前得到广泛应用的密码系统都只具有计算安全性。

​ 一个好的密码体制应该满足以下两个条件:

在已知明文和密钥的情况下,根据加密算法计算密文是容易的;在已知密文和解密密钥的情况下,计算明文是容易的。

在不知道解密密钥的情况下,无法从密文计算出明文,或者从密文计算出明文的代价超出了信息本身的价值。

常见的密码算法包括:

​ 对称密码体制也称单钥或私钥密码体制,其加密密钥和解密密钥相同,或实质上等同, 即从一个易于推出另一个。

​ 优点:保密性高,加密速度快,适合加密大量数据,易于通过硬件实现; 

缺点:秘钥必须通过安全可靠的途径传输,秘钥的分发是保证安全的关键因素;

​ 常见对称密码算法:DES (密钥长度=56位)、3DES( 三个不同的密钥,每个长度56位)、AES(密钥长度128/192/256可选)、IDEA(密钥长度128位)、RC5(密钥长度可变)。

​ 根据加密方式的不同,对称密码又可以分为分组密码和序列密码。

​ 将明文分为固定长度的组,用同一秘钥和算法对每一块加密,输出也是固定长度的密文,解密过程也一样。

​ 又称为流密码,每次加密一位或一字节的明文,通过伪随机数发生器产生性能优良的伪随机序列(密钥流),用该序列加密明文消息序列,得到密文序列,解密过程也一样。

​ 非对称密码体制又称双钥或公钥密码体制,其加密密钥和解密密钥不同,从一个很难推出另一个。其中的加密密钥可以公开,称为公开密钥,简称公钥;解密密钥必须保密,称为私有密钥,简称私钥。

​ 优点:密钥交换可通过公开信道进行,无需保密。既可用于加密也可用于签名。 

缺点:加密速度不如对称密码,不适合大量数据加密,加密操作难以通过硬件实现。

​ 非对称密码体制不但赋予了通信的保密性,还提供了消息的认证性,无需实现交换秘钥就可通过不安全信道安全地传递信息,简化了密钥管理的工作量,适应了通信网的需要,为保密学技术应用于商业领域开辟了广阔的前景。

​ 常见的非对称密码算法:RSA(基于大整数质因子分解难题)、ECC(基于椭圆曲线离散对数难题)。

对非对称密码的误解 

非对称密码比对称密码更安全? 

任何一种算法的安全都依赖于秘钥的长度、破译密码的工作量,从抗分析的角度看,没有哪一方更优越;

​ 非对称密码使对称密码成为过时技术? 

公钥算法很慢,一般用于密钥管理和数字签名,对称密码将长期存在,实际工程中采用对称密码与非对称密码相结合。

​ 哈希函数将任意长的消息映射为一个固定长度的散列值,也称消息摘要。消息摘要可以作为认证符,完成消息认证。 

哈希是单向函数,从消息摘要来推理原消息是极为困难的。哈希函数的安全性是由发生碰撞的概率决定的。如果攻击者能轻易构造出两个不同的消息具有相同的消息摘要,那么这样的哈希函数是不可靠的。

​ 常见的哈希函数有:MD5,SHA1,HMAC。

​ 数字签名是公钥密码的典型应用,可以提供和现实中亲笔签名相似的效果,在技术上和法律上都有保证。是网络环境中提供消息完整性,确认身份,保证消息来源(抗抵赖性)的重要技术。

​ 数字签名与验证过程:

​ 发送方用哈希函数从报文文本中生成一个128位的散列值(或报文摘要),发送方用自己的私钥对这个散列值进行加密来形成自己的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给接收方。接收方收到报文后,用同样的哈希函数从原始报文中计算出散列值(或报文摘要),接着再用发送方的公钥来对报文附加的数字签名进行解密得出另一个散列值,如果两个散列值相同,那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现消息的完整性和不可抵赖性。 

​ 在网络安全中,密钥的地位举足轻重

。如何安全可靠、迅速高效地分配密钥、管理密钥一直是密码学领域中的重要问题。

​ 密钥生成可以通过在线或离线的交互协商方式实现,如密码协议等 。密钥长度应该足够长。一般来说,密钥长度越大,对应的密钥空间就越大,攻击者使用穷举猜测密码的难度就越大。选择密钥时,应该避免选择弱密钥,大部分密钥生成算法采用随机过程或伪随机过程生成密钥。

​ 采用对称加密算法进行保密通信,需要共享同一密钥。通常是系统中的一个成员先选择一个秘密密钥,然后将它传送另一个成员或别的成员。X9.17标准描述了两种密钥:密钥加密密钥和数据密钥。密钥加密密钥加密其它需要分发的密钥;而数据密钥只对信息流进行加密。密钥加密密钥一般通过手工分发。为增强保密性,也可以将密钥分成许多不同的部分然后用不同的信道发送出去。

​ 密钥附着一些检错和纠错位来传输,当密钥在传输中发生错误时,能很容易地被检查出来,并且如果需要,密钥可被重传。接收端也可以验证接收的密钥是否正确。发送方用密钥加密一个常量,然后把密文的前2-4字节与密钥一起发送。在接收端,做同样的工作,如果接收端解密后的常数能与发端常数匹配,则传输无错。

​ 当密钥需要频繁的改变时,频繁进行新的密钥分发的确是困难的事,一种更容易的解决办法是从旧的密钥中产生新的密钥,有时称为密钥更新。可以使用单向函数进行更新密钥。如果双方共享同一密钥,并用同一个单向函数进行操作,就会得到相同的结果。

​ 密钥可以存储在脑子、磁条卡、智能卡中。也可以把密钥平分成两部分,一半存入终端一半存入ROM密钥。还可采用类似于密钥加密密钥的方法对难以记忆的密钥进行加密保存。

​ 密钥的备份可以采用密钥托管、秘密分割、秘密共享等方式。

​ 密钥托管:

​ 密钥托管要求所有用户将自己的密钥交给密钥托管中心,由密钥托管中心备份保管密钥(如锁在某个地方的保险柜里或用主密钥对它们进行加密保存),一旦用户的密钥丢失(如用户遗忘了密钥或用户意外死亡),按照一定的规章制度,可从密钥托管中心索取该用户的密钥。另一个备份方案是用智能卡作为临时密钥托管。如Alice把密钥存入智能卡,当Alice不在时就把它交给Bob,Bob可以利用该卡进行Alice的工作,当Alice回来后,Bob交还该卡,由于密钥存放在卡中,所以Bob不知道密钥是什么。

​ 秘密分割:

​ 秘密分割把秘密分割成许多碎片,每一片本身并不代表什么,但把这些碎片放到一块,秘密就会重现出来。

​ 秘密共享:

​ 将密钥K分成n块,每部分叫做它的“影子”,知道任意m个或更多的块就能够计算出密钥K,知道任意m-1个或更少的块都不能够计算出密钥K。秘密共享解决了两个问题:一是若密钥偶然或有意地被暴露,整个系统就易受攻击;二是若密钥丢失或损坏,系统中的所有信息就不能用了。

​ 加密密钥不能无限期使用,有以下有几个原因:密钥使用时间越长,它泄露的机会就越大;如果密钥已泄露,那么密钥使用越久,损失就越大;密钥使用越久,人们花费精力破译它的诱惑力就越大——甚至采用穷举攻击法。

​ 不同密钥应有不同有效期。数据密钥的有效期主要依赖数据的价值和给定时间里加密数据的数量。价值与数据传送率越大所用的密钥更换越频繁。如密钥加密密钥无需频繁更换,因为它们只是偶尔地用作密钥交换,密钥加密密钥要么被记忆下来,要么保存在一个安全地点,丢失该密钥意味着丢失所有的文件加密密钥。

​ 公开密钥密码应用中的私钥的有效期是根据应用的不同而变化的。用作数字签名和身份识别的私钥必须持续数年(甚至终身),用作抛掷硬币协议的私钥在协议完成之后就应该立即销毁。即使期望密钥的安全性持续终身,两年更换一次密钥也是要考虑的。旧密钥仍需保密,以防用户需要验证从前的签名。但是新密钥将用作新文件签名,以减少密码分析者所能攻击的签名文件数目。

​ 如果密钥必须替换,旧钥就必须销毁,密钥必须物理地销毁。

​ PKI是一个利用公钥加密技术为密钥和证书的管理,所设计的组件、功能子系统、操作规程等的集合,它的主要任务是管理密钥和证书,为网络用户建立安全通信信任机制。

​ 数字证书是一个包含用户身份信息、公钥信息、证书认证中心(CA)数字签名的文件。

​ 作用:数字证书是各类终端实体和最终用户在网上进行信息交流及商业活动的身份证明,在电子交易的各个缓解,交易的各方都需要验证对方数字证书的有效性,从而解决相互间的信任问题。

​ CA全称Certificate Authentication,是具备权威性的数字证书申请及签发机构。

​ CA作为PKI的核心部分,主要由注册服务器组、证书申请受理和审核机构、认证中心服务器三者组成。

​ 注册服务器:通过 Web Server 建立的站点,可为客户提供24×7 不间断的服务。客户在网上提出证书申请和填写相应的证书申请表。

​ 证书申请受理和审核机构:负责证书的申请和审核。

认证中心服务器:是数字证书生成、发放的运行实体,同时提供发放证书的管理、证书废止列表(CRL)的生成和处理等服务。

​ 通过CA可以实现以下功能:

​ 1. 接收验证最终用户数字证书的申请; 

2. 确定是否接受最终用户数字证书的申请和审批; 

3. 向申请者颁发、拒绝颁发数字证书; 

4. 接收、处理最终用户数字证书的更新; 

5. 接受最终用户数字证书的查询、撤销; 

6. 产生和发布CRL(证书废止列表); 

7. 数字证书的归档; 

8. 密钥归档; 

9. 历史数据归档;

五、量子密码

5.1 量子计算

​ 由于量子计算技术取得了出人意料的快速发展,大量仅能抵御经典计算机暴力破解的密码算法面临被提前淘汰的困境 。

​ 非对称密码系统有效解决了对称密码面临的安全密钥交换问题,因而广泛应用于公钥基础设施、数字签名、联合授权、公共信道密钥交换、安全电子邮件、虚拟专用网以及安全套接层等大量网络通信活动之中。不幸的是,随着量子计算的发展,包括RSA密码、ECC密码以及DH密钥交换技术等非对称密码算法已经从理论上被证明彻底丧失了安全性。相对于对称密码系统还可以采取升级措施应对量子威胁,非对称密码系统必须采取全新方法进行重建 。

5.2 量子密码

​ 量子密码是以量子力学和密码学为基础,利用量子物理学中的原理实现密码体制的一种新型密码体制,与当前大多使用的经典密码体制不一样的是,量子密码利用信息载体的物理属性实现。目前量子密码用于承载信息的载体包括光子、压缩态光信号、相干态光信号等。

​ 由于量子密码体制的理论基础是量子物理定理,而物理定理是物理学家经过多年的研究与论证得出的结论,有可靠的理论依据,且不论在何时都是不会改变的,因此,理论上,依赖于这些物理定理的量子密码也是不可攻破的,量子密码体制是一种无条件安全的密码体制。

Ⅳ 【密码学笔记】第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部分 分组密码的模式

Ⅳ 密码学基础(二):对称加密

加密和解密使用相同的秘钥称为对称加密。

DES:已经淘汰
3DES:相对于DES有所加强,但是仍然存在较大风险
AES:全新的对称加密算法。

特点决定使用场景,对称加密拥有如下特点:

速度快,可用于频率很高的加密场景。

使用同一个秘钥进行加密和解密。

可选按照128、192、256位为一组的加密方式,加密后的输出值为所选分组位数的倍数。密钥的长度不同,推荐加密轮数也不同,加密强度也更强。

例如:
AES加密结果的长度由原字符串长度决定:一个字符为1byte=4bit,一个字符串为n+1byte,因为最后一位为'',所以当字符串长度小于等于15时,AES128得到的16进制结果为32位,也就是32 4=128byte,当长度超过15时,就是64位为128 2byte。

因为对称加密速度快的特点,对称加密被广泛运用在各种加密场所中。但是因为其需要传递秘钥,一旦秘钥被截获或者泄露,其加密就会玩完全破解,所以AES一般和RSA一起使用。

因为RSA不用传递秘钥,加密速度慢,所以一般使用RSA加密AES中锁使用的秘钥后,再传递秘钥,保证秘钥的安全。秘钥安全传递成功后,一直使用AES对会话中的信息进行加密,以此来解决AES和RSA的缺点并完美发挥两者的优点,其中相对经典的例子就是HTTPS加密,后文会专门研究。

本文针对ECB模式下的AES算法进行大概讲解,针对每一步的详细算法不再该文讨论范围内。

128位的明文被分成16个字节的明文矩阵,然后将明文矩阵转化成状态矩阵,以“abcdefghijklmnop”的明文为例:

同样的,128位密钥被分成16组的状态矩阵。与明文不同的是,密文会以列为单位,生成最初的4x8x4=128的秘钥,也就是一个组中有4个元素,每个元素由每列中的4个秘钥叠加而成,其中矩阵中的每个秘钥为1个字节也就是8位。

生成初始的w[0]、w[1]、w[2]、w[3]原始密钥之后,通过密钥编排函数,该密钥矩阵被扩展成一个44个组成的序列W[0],W[1], … ,W[43]。该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加,后面40个字分为10组,每组4个32位的字段组成,总共为128位,分别用于10轮加密运算中的轮密钥加密,如下图所示:

之所以把这一步单独提出来,是因为ECB和CBC模式中主要的区别就在这一步。

ECB模式中,初始秘钥扩展后生成秘钥组后(w0-w43),明文根据当前轮数取出w[i,i+3]进行加密操作。

CBC模式中,则使用前一轮的密文(明文加密之后的值)和当前的明文进行异或操作之后再进行加密操作。如图所示:

根据不同位数分组,官方推荐的加密轮数:

轮操作加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。

当第一组加密完成时,后面的组循环进行加密操作知道所有的组都完成加密操作。

一般会将结果转化成base64位,此时在iOS中应该使用base64编码的方式进行解码操作,而不是UTF-8。

base64是一种编码方式,常用语传输8bit字节码。其编码原理如下所示:

将原数据按照3个字节取为一组,即为3x8=24位

将3x8=24的数据分为4x6=24的数据,也就是分为了4组

将4个组中的数据分别在高位补上2个0,也就成了8x4=32,所以原数据增大了三分之一。

根据base64编码表对数据进行转换,如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办,Base64用x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

举个栗子:Man最后的结果就是TWFu。

计算机中所有的数据都是以0和1的二进制来存储,而所有的文字都是通过ascii表转化而来进而显示成对应的语言。但是ascii表中存在许多不可见字符,这些不可见字符在数据传输时,有可能经过不同硬件上各种类型的路由,在转义时容易发生错误,所以规定了64个可见字符(a-z、A-Z、0-9、+、/),通过base64转码之后,所有的二进制数据都是可见的。

ECB和CBC是两种加密工作模式。其相同点都是在开始轮加密之前,将明文和密文按照128/192/256进行分组。以128位为例,明文和密文都分为16组,每组1个字节为8位。

ECB工作模式中,每一组的明文和密文相互独立,每一组的明文通过对应该组的密文加密后生成密文,不影响其他组。

CBC工作模式中,后一组的明文在加密之前先使用前一组的密文进行异或运算后再和对应该组的密文进行加密操作生成密文。

为简单的分组加密。将明文和密文分成若干组后,使用密文对明文进行加密生成密文
CBC

加密:

解密:

Ⅵ 加密基础知识二 非对称加密RSA算法和对称加密

上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考 RSA算法原理(二)
首字母缩写说明:E是加密(Encryption)D是解密(Decryption)N是数字(Number)。

1.随机选择两个不相等的质数p和q。
alice选择了61和53。(实际应用中,这两个质数越大,就越难破解。)

2.计算p和q的乘积n。
n = 61×53 = 3233
n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

3.计算n的欧拉函数φ(n)。称作L
根据公式φ(n) = (p-1)(q-1)
alice算出φ(3233)等于60×52,即3120。

4.随机选择一个整数e,也就是公钥当中用来加密的那个数字
条件是1< e < φ(n),且e与φ(n) 互质。
alice就在1到3120之间,随机选择了17。(实际应用中,常常选择65537。)

5.计算e对于φ(n)的模反元素d。也就是密钥当中用来解密的那个数字
所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。ed ≡ 1 (mod φ(n))
alice找到了2753,即17*2753 mode 3120 = 1

6.将n和e封装成公钥,n和d封装成私钥。
在alice的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。

上述故事中,blob为了偷偷地传输移动位数6,使用了公钥做加密,即6^17 mode 3233 = 824。alice收到824之后,进行解密,即824^2753 mod 3233 = 6。也就是说,alice成功收到了blob使用的移动位数。

再来复习一下整个流程:
p=17,q=19
n = 17 19 = 323
L = 16 18 = 144
E = 5(E需要满足以下两个条件:1<E<144,E和144互质)
D = 29(D要满足两个条件,1<D<144,D mode 144 = 1)
假设某个需要传递123,则加密后:123^5 mode 323 = 225
接收者收到225后,进行解密,225^ 29 mode 323 = 123

回顾上面的密钥生成步骤,一共出现六个数字:
p
q
n
L即φ(n)
e
d
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。那么,有无可能在已知n和e的情况下,推导出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基网络这样写道:"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"

然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。此外,RSA的缺点还有:
A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此, 使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法

加密和解密是自古就有技术了。经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫无意义的数字苦恼,忽然灵光一闪,翻出一本厚书,将第一个数字对应页码数,第二个数字对应行数,第三个数字对应那一行的某个词。数字变成了一串非常有意义的话:
Eat the beancurd with the peanut. Taste like the ham.

这种加密方法是将原来的某种信息按照某个规律打乱。某种打乱的方式就叫做密钥(cipher code)。发出信息的人根据密钥来给信息加密,而接收信息的人利用相同的密钥,来给信息解密。 就好像一个带锁的盒子。发送信息的人将信息放到盒子里,用钥匙锁上。而接受信息的人则用相同的钥匙打开。加密和解密用的是同一个密钥,这种加密称为对称加密(symmetric encryption)。

如果一对一的话,那么两人需要交换一个密钥。一对多的话,比如总部和多个特工的通信,依然可以使用同一套密钥。 但这种情况下,对手偷到一个密钥的话,就知道所有交流的信息了。 二战中盟军的情报战成果,很多都来自于破获这种对称加密的密钥。

为了更安全,总部需要给每个特工都设计一个不同的密钥。如果是FBI这样庞大的机构,恐怕很难维护这么多的密钥。在现代社会,每个人的信用卡信息都需要加密。一一设计密钥的话,银行怕是要跪了。

对称加密的薄弱之处在于给了太多人的钥匙。如果只给特工锁,而总部保有钥匙,那就容易了。特工将信息用锁锁到盒子里,谁也打不开,除非到总部用唯一的一把钥匙打开。只是这样的话,特工每次出门都要带上许多锁,太容易被识破身份了。总部老大想了想,干脆就把造锁的技术公开了。特工,或者任何其它人,可以就地取材,按照图纸造锁,但无法根据图纸造出钥匙。钥匙只有总部的那一把。

上面的关键是锁和钥匙工艺不同。知道了锁,并不能知道钥匙。这样,银行可以将“造锁”的方法公布给所有用户。 每个用户可以用锁来加密自己的信用卡信息。即使被别人窃听到,也不用担心:只有银行才有钥匙呢!这样一种加密算法叫做非对称加密(asymmetric encryption)。非对称加密的经典算法是RSA算法。它来自于数论与计算机计数的奇妙结合。

1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种新的加密模式被称为"非对称加密算法"。

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

1.能“撞”上的保险箱(非对称/公钥加密体制,Asymmetric / Public Key Encryption)

数据加密解密和门锁很像。最开始的时候,人们只想到了那种只能用钥匙“锁”数据的锁。如果在自己的电脑上自己加密数据,当然可以用最开始这种门锁的形式啦,方便快捷,简单易用有木有。

但是我们现在是通信时代啊,双方都想做安全的通信怎么办呢?如果也用这种方法,通信就好像互相发送密码保险箱一样…而且双方必须都有钥匙才能进行加密和解密。也就是说,两个人都拿着保险箱的钥匙,你把数据放进去,用钥匙锁上发给我。我用同样的钥匙把保险箱打开,再把我的数据锁进保险箱,发送给你。

这样看起来好像没什么问题。但是,这里面 最大的问题是:我们两个怎么弄到同一个保险箱的同一个钥匙呢? 好像仅有的办法就是我们两个一起去买个保险箱,然后一人拿一把钥匙,以后就用这个保险箱了。可是,现代通信社会,绝大多数情况下别说一起去买保险箱了,连见个面都难,这怎么办啊?

于是,人们想到了“撞门”的方法。我这有个可以“撞上”的保险箱,你那里自己也买一个这样的保险箱。通信最开始,我把保险箱打开,就这么开着把保险箱发给你。你把数据放进去以后,把保险箱“撞”上发给我。撞上以后,除了我以外,谁都打不开保险箱了。这就是RSA了,公开的保险箱就是公钥,但是我有私钥,我才能打开。

2.数字签名
这种锁看起来好像很不错,但是锁在运输的过程中有这么一个严重的问题:你怎么确定你收到的开着的保险箱就是我发来的呢?对于一个聪明人,他完全可以这么干:
(a)装作运输工人。我现在把我开着的保险箱运给对方。运输工人自己也弄这么一个保险箱,运输的时候把保险箱换成他做的。
(b)对方收到保险箱后,没法知道这个保险箱是我最初发过去的,还是运输工人替换的。对方把数据放进去,把保险箱撞上。
(c)运输工人往回运的时候,用自己的钥匙打开自己的保险箱,把数据拿走。然后复印也好,伪造也好,弄出一份数据,把这份数据放进我的保险箱,撞上,然后发给我。
从我的角度,从对方的角度,都会觉得这数据传输过程没问题。但是,运输工人成功拿到了数据,整个过程还是不安全的,大概的过程是这样:

这怎么办啊?这个问题的本质原因是,人们没办法获知,保险箱到底是“我”做的,还是运输工人做的。那干脆,我们都别做保险箱了,让权威机构做保险箱,然后在每个保险箱上用特殊的工具刻上一个编号。对方收到保险箱的时候,在权威机构的“公告栏”上查一下编号,要是和保险箱上的编号一样,我就知道这个保险箱是“我”的,就安心把数据放进去。大概过程是这样的:

如何做出刻上编号,而且编号没法修改的保险箱呢?这涉及到了公钥体制中的另一个问题:数字签名。
要知道,刻字这种事情吧,谁都能干,所以想做出只能自己刻字,还没法让别人修改的保险箱确实有点难度。那么怎么办呢?这其实困扰了人们很长的时间。直到有一天,人们发现:我们不一定非要在保险箱上刻规规矩矩的字,我们干脆在保险箱上刻手写名字好了。而且,刻字有点麻烦,干脆我们在上面弄张纸,让人直接在上面写,简单不费事。具体做法是,我们在保险箱上嵌进去一张纸,然后每个出产的保险箱都让权威机构的CEO签上自己的名字。然后,CEO把自己的签名公开在权威机构的“公告栏”上面。比如这个CEO就叫“学酥”,那么整个流程差不多是这个样子:

这个方法的本质原理是,每个人都能够通过笔迹看出保险箱上的字是不是学酥CEO签的。但是呢,这个字体是学酥CEO唯一的字体。别人很难模仿。如果模仿我们就能自己分辨出来了。要是实在分辨不出来呢,我们就请一个笔迹专家来分辨。这不是很好嘛。这个在密码学上就是数字签名。

上面这个签字的方法虽然好,但是还有一个比较蛋疼的问题。因为签字的样子是公开的,一个聪明人可以把公开的签字影印一份,自己造个保险箱,然后把这个影印的字也嵌进去。这样一来,这个聪明人也可以造一个相同签字的保险箱了。解决这个问题一个非常简单的方法就是在看保险箱上的签名时,不光看字体本身,还要看字体是不是和公开的字体完全一样。要是完全一样,就可以考虑这个签名可能是影印出来的。甚至,还要考察字体是不是和其他保险柜上的字体一模一样。因为聪明人为了欺骗大家,可能不影印公开的签名,而影印其他保险箱上的签名。这种解决方法虽然简单,但是验证签名的时候麻烦了一些。麻烦的地方在于我不仅需要对比保险箱上的签名是否与公开的笔迹一样,还需要对比得到的签名是否与公开的笔迹完全一样,乃至是否和所有发布的保险箱上的签名完全一样。有没有什么更好的方法呢?

当然有,人们想到了一个比较好的方法。那就是,学酥CEO签字的时候吧,不光把名字签上,还得带上签字得日期,或者带上这个保险箱的编号。这样一来,每一个保险箱上的签字就唯一了,这个签字是学酥CEO的签名+学酥CEO写上的时间或者编号。这样一来,就算有人伪造,也只能伪造用过的保险箱。这个问题就彻底解决了。这个过程大概是这么个样子:

3 造价问题(密钥封装机制,Key Encapsulation Mechanism)
解决了上面的各种问题,我们要考虑考虑成本了… 这种能“撞”门的保险箱虽然好,但是这种锁造价一般来说要比普通的锁要高,而且锁生产时间也会变长。在密码学中,对于同样“结实”的锁,能“撞”门的锁的造价一般来说是普通锁的上千倍。同时,能“撞”门的锁一般来说只能安装在小的保险柜里面。毕竟,这么复杂的锁,装起来很费事啊!而普通锁安装在多大的保险柜上面都可以呢。如果两个人想传输大量数据的话,用一个大的保险柜比用一堆小的保险柜慢慢传要好的多呀。怎么解决这个问题呢?人们又想出了一个非常棒的方法:我们把两种锁结合起来。能“撞”上的保险柜里面放一个普通锁的钥匙。然后造一个用普通的保险柜来锁大量的数据。这样一来,我们相当于用能“撞”上的保险柜发一个钥匙过去。对方收到两个保险柜后,先用自己的钥匙把小保险柜打开,取出钥匙。然后在用这个钥匙开大的保险柜。这样做更棒的一个地方在于,既然对方得到了一个钥匙,后续再通信的时候,我们就不再需要能“撞”上的保险柜了啊,在以后一定时间内就用普通保险柜就好了,方便快捷嘛。

以下参考 数字签名、数字证书、SSL、https是什么关系?
4.数字签名(Digital Signature)
数据在浏览器和服务器之间传输时,有可能在传输过程中被冒充的盗贼把内容替换了,那么如何保证数据是真实服务器发送的而不被调包呢,同时如何保证传输的数据没有被人篡改呢,要解决这两个问题就必须用到数字签名,数字签名就如同日常生活的中的签名一样,一旦在合同书上落下了你的大名,从法律意义上就确定是你本人签的字儿,这是任何人都没法仿造的,因为这是你专有的手迹,任何人是造不出来的。那么在计算机中的数字签名怎么回事呢?数字签名就是用于验证传输的内容是不是真实服务器发送的数据,发送的数据有没有被篡改过,它就干这两件事,是非对称加密的一种应用场景。不过他是反过来用私钥来加密,通过与之配对的公钥来解密。
第一步:服务端把报文经过Hash处理后生成摘要信息Digest,摘要信息使用私钥private-key加密之后就生成签名,服务器把签名连同报文一起发送给客户端。
第二步:客户端接收到数据后,把签名提取出来用public-key解密,如果能正常的解密出来Digest2,那么就能确认是对方发的。
第三步:客户端把报文Text提取出来做同样的Hash处理,得到的摘要信息Digest1,再与之前解密出来的Digist2对比,如果两者相等,就表示内容没有被篡改,否则内容就是被人改过了。因为只要文本内容哪怕有任何一点点改动都会Hash出一个完全不一样的摘要信息出来。

5.数字证书(Certificate Authority)
数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的,为什么需要用数字证书呢,难道有了数字签名还不够安全吗?有这样一种情况,就是浏览器无法确定所有的真实服务器是不是真的是真实的,举一个简单的例子:A厂家给你们家安装锁,同时把钥匙也交给你,只要钥匙能打开锁,你就可以确定钥匙和锁是配对的,如果有人把钥匙换了或者把锁换了,你是打不开门的,你就知道肯定被窃取了,但是如果有人把锁和钥匙替换成另一套表面看起来差不多的,但质量差很多的,虽然钥匙和锁配套,但是你却不能确定这是否真的是A厂家给你的,那么这时候,你可以找质检部门来检验一下,这套锁是不是真的来自于A厂家,质检部门是权威机构,他说的话是可以被公众认可的(呵呵)。
同样的, 因为如果有人(张三)用自己的公钥把真实服务器发送给浏览器的公钥替换了,于是张三用自己的私钥执行相同的步骤对文本Hash、数字签名,最后得到的结果都没什么问题,但事实上浏览器看到的东西却不是真实服务器给的,而是被张三从里到外(公钥到私钥)换了一通。那么如何保证你现在使用的公钥就是真实服务器发给你的呢?我们就用数字证书来解决这个问题。数字证书一般由数字证书认证机构(Certificate Authority)颁发,证书里面包含了真实服务器的公钥和网站的一些其他信息,数字证书机构用自己的私钥加密后发给浏览器,浏览器使用数字证书机构的公钥解密后得到真实服务器的公钥。这个过程是建立在被大家所认可的证书机构之上得到的公钥,所以这是一种安全的方式。

常见的对称加密算法有DES、3DES、AES、RC5、RC6。非对称加密算法应用非常广泛,如SSH,
HTTPS, TLS,电子证书,电子签名,电子身份证等等。
参考 DES/3DES/AES区别

Ⅶ 密码学相关知识梳理

密码学是研究编制密码和破译密码的技术科学。

密码学的历史最早可以追溯到几千年以前,古今中外都有密码学运用的记载,从历史看,战争很大程度给密码学提供了应用环境,推动了密码学的发展,密码学按照发展历程,大体可以分为三个阶段,手工加密、机械加密和计算机加密阶段,下面是近代密码学的一些重要进展。
1949年,信息论始祖克劳德·艾尔伍德·香农(Claude Elwood Shannon)发表了《保密系统的通信理论》一文,把密码学建立在严格的数学基础之上,奠定理论基础,从此成为真正的科学。
1976年,密码学专家惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)两人发表了《密码学的新方向》一文,解决了密钥管理的难题,把密钥分为加密的公钥和解密的私钥,提出了密钥交换算法Diffie-Hellman。
1977年,美国国家标准技术研究所制定数据加密标准(Data Encryption Standard ),将其颁布为国家标准。
1977年,麻省理工学院的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出RSA加密算法,RSA就是他们三人姓氏开头字母拼在一起组成的。
1997年4月,美国ANSI发起征集AES(advanced encryption standard)的活动,并为此成立了AES工作小组,经过几年的时间筛选,最终采用了由比利时的Joan Daemen和Vincent Rijmen设计的Rijndael算法,并在2002年5月26日成为有效的加密标准。

按密码体制划分:对称密码体制密码学和非对称密码体制密码学对应的有对称密码算法和非对称密码算法。

消息摘要算法又称散列算法,其核心在于散列函数的单向性,即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始信息,这是消息摘要算法的安全性的根本所在,我们通常使用该算法判断数据的完整性。

消息摘要算法我们常见比如MD(Message Digest)、SHA(Secure Hash Algorithm)、HMAC(Hash Message Authentication Code)等,常用于验证数据的完整性,是数字签名算法的核心算法。

我们以微信支付的接口调用分析一下摘要算法怎么应用的,首先可以打开微信支付如下相关文档:
微信支付统一下单接口文档
微信支付签名过程

对称加密简单的说就是加密和解密使用同一个密钥,解密算法是加密算法的逆运算。

对称加密算法主要有DES、DES算法的变种DESede、DES替代者AES算法、IDEA、PBE等

非对称加密算法称为双钥或公钥加密算法,跟对称加密算法不同的是,对称加密算法只一个密钥,非对称加密算法 一个公钥和一个私钥,一个用于加密,另外一个用于解密。
简单的说:一对密钥公钥A和私钥B,A加密只能B解密,B加密只能A解密。

非对称加密算法源于DH算法(Diffie-Hellman,密钥交换算法)由W.Diffie和 M.Hellman共同提出,该算法为非对称加密算法奠定了基础,下面我们先来了解下密钥交换算法DH和ECDH算法。
为什么需要密钥交换算法?前面我们提到对称加密算法加解密都是用同一个密钥,我们可以想一下,我们怎样能安全的把一个密钥给到对方呢?比如我们经常用到HTTPS,大家都说HTTPS加密了是安全的,那它加密的密钥怎么来的呢?很显然我们在访问一个https地址的时候,事先并没有密钥,访问过程中客户端跟服务端通过握手协议协商出来的密钥,如果服务端直接把密钥在网络上传输那肯定不安全的,所以这过程到底发生了什么?后面专门分析https的时候会详细写,这里先了解下该算法。
DH密钥交换算法的安全性基于有限域上的离散对数难题
ECDH密钥交换算法是基于椭圆曲线加密

从上面图中可以看出,DH&ECDH密钥交换算法交互双方都会向对方公开一部分信息,即所谓的公钥,这部分即使被别人拿到了也不会威胁到最终的密钥,这里很关键的一点是甲乙两方公布的公钥是不相同的,但是最终生成的密钥两边是一致的,这里是利用的算法原理,有兴趣的可以去查阅详细的算法公式,因为最终的密钥不需要传输给对方,所以很大程度保证安全性。
非对称加密算法:
比较典型的非对称加密算法有RSA、ECC、ElGamal,RSA算法基于大数因子分解难题,而ElGamal和ECC算法则是基于离散对数难题。

从上面消息传递模型我们可以看出,非对称加密算法遵循“私钥加密,公钥解密”和“公钥加密,私钥解密”的原则,但是有一点需要注意,公钥是公开的,所以用在什么场景是需要根据该算法的特征来考虑的,比如既然公钥是公开的,你用私钥加密敏感数据传递给第三方合适么?显然不合适,因为公钥公开的,别人都可以拿到公钥,也就意味着你加密的数据都可以解密,所以适合的场景比如私钥加密,公钥只是用来验证加密的内容,每个人都可以来验证,该场景是不在乎加密内容被其它攻击者看到的,甚至说内容本来就是公开的,对于接收者用公钥确保内容没有被篡改即可,所以我们通常说非对称算法“私钥签名,公钥验证签名”,另外一点,“公钥加密,私钥解密”,因为私钥只有我们自己手上有,所以理论上也只有我们自己可以解密,这样是安全的,https证书验证以及握手协议过程中会体现这一点。

数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说数字签名算法是非对称加密算法和消息摘要算法的结合体,遵循“私钥签名,公钥验证”的签名认证方式。
数字签名算法是公钥基础设施(Public Key Infrastructure,PKI)以及许多网络安全机制(SSL/TLS,VPN等)的基础。
数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。

数字签名算法主要包括RSA、DSA、ECDSA共3种算法,其中RSA算法源于整数因子分解问题,DSA和ECDSA算法源于离散对数问题。

我们以蚂蚁金服开放平台上接口签名方案为例,详细说明可以打开如下文档:
蚂蚁开放平台签名专区

Ⅷ 密码学知识精粹

① 替换法
替换法很好理解,就是用固定的信息将原文替换成无法直接阅读的密文信息。例如将 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

阅读全文

与密码学和信息加密的复习资料相关的资料

热点内容
excel表格单列数据加密 浏览:646
给同事的解压话语 浏览:990
linux关闭网卡命令行 浏览:452
史上最漂亮程序员 浏览:768
java实现excel的导入 浏览:758
光遇账号如何转移安卓 浏览:266
5分之13除以26的算法 浏览:342
兰州安宁区买解压包子 浏览:641
php接收图片代码 浏览:668
hci命令 浏览:662
福建服务器大区云空间 浏览:840
笔杆子程序员 浏览:745
手机软件易验证加密 浏览:589
文档加密只读模式也不能看到 浏览:431
把jpg转换成pdf的软件 浏览:874
linuxeth0mac 浏览:192
windows编程知乎 浏览:442
压缩工期超过40 浏览:249
Android怎么优化内存 浏览:106
linuxetcsysconfig 浏览:396