基础密码协议
密码学的一些概念
基本术语
明文 plaintext - original message
密文 ciphertext - coded message
密码体制,密码 cipher - algorithm for transforming plaintext to ciphertext
密钥 key - info used in cipher known only to sender/receiver 加密 encipher (encrypt) - converting plaintext to ciphertext
解密 decipher (decrypt) - recovering plaintext from ciphertext
密码学是研究信息系统安全保密的科学,也是研究设计密码和破译密码的学科,包含两个重要分支,密码编码学(Cryptography)和密码分析学(Cryptanalystics),二者不可分割。
密码编码学:研究和设计安全的密码算法。 防
密码分析学:分析和破译密码的一门学问。 攻
密码编码学Cryptography
研究内容: 研究对信息进行编码,实现对信息的隐蔽和保密
特征:
运算类型:代换与置换
所用的密钥数:单钥与双钥
处理明文的方法:分组密码与流密码
密码算法分类
按照保密内容
受限制(restricted)算法:算法的保密性基于保持算法的秘密。
基于密钥(key-based)算法:算法的保密性基于对密钥的保密。
基于密钥的算法,按照密钥特点
对称密码算法(传统密码算法或单钥密码算法)。
非对称算法(公开密钥密码算法或双钥密码算法。
按照明文处理方式
分组密码
流密码
Kerckhoff原则——系统的保密性不依赖于加密体制或算法的保密,依赖于密钥的保密。
密码分析学 Cryptanalysis
研究密码破译,攻击的一般方法有穷举攻击法、统计分析法、数学分析法。
穷举攻击
Intel和AMD处理器都提供基于硬件的指令,以加快AES的加解密速度。2012年Intel多核机器进行的测试表明,加密速率可以达到5亿次每秒。使用超算技术,1秒钟可进行1013次加密。
四种典型攻击
三个概念
绝对安全 unconditional security
无条件的安全——Shannon指出仅当密钥至少和明文一样长时,才能达到无条件安全,除了一次一密(one time pad),无其它方案是无条件安全。

计算安全 computational security
破译该密码系统所需要的努力超过了破译者的破译能力,这种能力包括时间、空间、金钱、设备等。
加密算法需要满足两个准则——价值有效性、时间有效性。
可证明安全 provable security
通过理论证明,破译算法的计算量不低于求解该算法所基于的数学难题(密码原型)的计算量。 可证明安全本质是规约,将协议/算法的安全性规约到困难问题上。
密码学中数学困难问题
大整数因数分解问题
给定两个素数p,q,计算乘积p·q=n很容易,但是给定大整数n,求n的素因素p,q使得n=p·q非常困难。p=20000000000000002559,q=80000000000000001239是两个素数,它们的乘积 n=p·q=160000000000000229500000000000003170601. 但要分解这个n非常困难。
离散对数问题
给定整数g、a,计算元素很容易;给定元素g、h,计算整数x,使得
非常困难. 给定整数a=2030428,g=11,可以快速计算
,但要求整数x,使得
非常困难。
椭圆曲线离散对数问题
分组密码
分组密码原理

分组密码的工作模式
由于加密数据一般包含多个分组,选择合适的运行模式可避免固定格式带来的安全隐患。为了能在各种应用场合使用DES,美国在FIPS PUS 74和81中定义了DES的4种运行模式,NIST从2000年开始致力于这方面的研究,又先后推出面向AES的一些运行模式(XTS-AES),当然这些模式也可用于其他分组密码。

电子密码本模式Electronic Codebook(ECB)
明文分成64位的分组进行加密,必要时填充,每个分组用同一密钥加密,同样明文分组加密得相同密文。
ECB(electronic codebook)模式是最简单的运行模式,对明文分组后用同一密钥逐一加密,就像有一个非常大的密文电码本,往往需要填充,如果最后一个分组如果不够64比特,适合短消息,如安全地传递DES密钥。
用于长消息时不够安全:同一明文分组的密文也相同,会有信息泄露,比如图像文档头格式中的结构化明文,或者消息有重复部分。
密码分组链接模式Cipher Block Chaining (CBC)
加密输入是当前明文分组和前一密文分组的异或,形成一条链,使用相同的密钥, 这样每个明文分组的加密函数输入与明文分组之间不再有固定的关系。
加密算法的输入是当前明文分组与前一密文分组的异或,利用一个初始向量开始:
初始向量IV需要保护, 适合加密长度大于64比特的消息。
错误传播:影响当前解密分组和下一分组。
解密时,每一个密文分组被解密后,再与前一个密文分组异或。
密码反馈模式Cipher FeedBack (CFB)
是一种将DES转化成流密码的技术,不再要求报文被填充成整个分组,可以实时运行。 加密:加密函数的输入是一个64位的移位寄存器,加密函数高端j位与明文P1的第一单元异或,产生j位密文C1进入移位寄存器低端,继续加密,与P2输入异或,如此重复直到所有明文单元都完成加密。
解密:采用相同方案,但是使用加密函数而非解密函数。
分组密文的输出中选择某固定j比特与字符或比特异或生成密文,移位寄存器内容左移j位,并把密文反馈到右面的j位,将DES转化成流密码。
仅需要实现加密算法。
错误传播:1个比特密文传输错误会传播约64/j个分组。
输出反馈模式Output FeedBack (OFB)
结构上类似CFB,但是OFB中加密函数输出被反馈回移位寄存器,CFB中是密文单元被反馈回移位寄存器。优点是传输中的比特差错不会传播,缺点是比CFB更容易受报文流篡改攻击。
只需要实现加密算法。
绝不能重复使用相同的序列(key+IV)。
收发双方必须保持同步。
计数器模式Counter (CRT)
加密的是计数器的值 每一个明文分组使用一个不同的计数器值,不要重复使用。可以用于高速网络加密中,可并行加密,因为计数器模式各块儿可单独处理。可预处理,明文不参与密钥产生 只要求实现加密算法。
流密码
按位处理明文消息(as a stream) 典型做法是用一个伪随机流密钥与明文按位异或 流密钥的随机性完全摧毁了明文消息的统计特性。
不能重复使用流密钥,不然系统会被破解。
流密码的结构
流密码设计方面的一些考虑:
无重复的长周期
统计上是随机的
依赖于足够长的密钥
线性复杂性要大
对于相关性要有免疫性
扰乱
扩散
随机数
随机数random numbers的用途:
1、用于相互鉴别authentication,以防重放攻击。
2、会话密钥session keys的产生。
3、产生公开密钥,如在RSA算法中产生密钥。
4、一次一密密码中的密钥流。
5、Nonce(Number used once or Number once, 临时交互号或现时,可以是时间戳、计数器或随机数)。
Statistically random(随机程度)
uniform distribution, 均匀分布,每个数出现的频率应该近似相等
Independent,独立性,系列中的任意一个数都无法从其他数推测得到
Unpredictable (不可预测程度),基于前值不能推导出未来的随机数序列
真随机数发生器
真随机数发生器(TRNG)使用不可预测源来产生随机数,大多数通过物理噪声来实现。
Intel开发出一种发大电阻两端电压产生的热噪声的芯片。
Bell实验室利用硬盘读操作产生的辐射作为随机源。
LavaRnd使用充满光源的CCD(电荷耦合器件)作为混沌源产生种子,用软件将种子加工成各种形式的真随机数。
一个真随机数发生器的输出有时会有偏差,比如1的个数比0多,或者反之。将一个比特串减少或消除偏差的方法称为消偏算法,如通过MD5或SHA-1等散列函数进行处理。
伪随机数产生器(PRNG)
产生随机数的算法与技术 尽管不是完全随机,但是产生的伪随机数仍然可以通过某些随机性测试。
用密码学方法生成随机数
循环加密 从一个主密钥产生会话密钥
消息认证
机密性的缺陷,单纯的加解密算法无法抵抗下述攻击:
加密本身不能实现真实性认证功能,认证和加密的分离带来灵活性。例如,只要认证而不需保密 ,如公文,软件完整性鉴别(防病毒)、网络管理广播报文(如SNMP)等 ;不能加密的场合(如法规限制); 存档期间的保护(而不仅是传输期间)。
消息认证是一种允许通信者验证接收消息是否可信的措施。主要指数据完整性。
验证消息的内容有没有被篡改
验证来源是否可信
验证消息的时效性(消息有没有被人为地延迟或重放)
两实体之间消息流的相对顺序
利用常规加密的消息认证
常规加密消息认证的前提假设:发送者和接收者共享一个密钥,只有真正的发送者才能够成功地为对方加密消息。
消息里带有错误检测码和序列号,则接收者能够确认消息是否被篡改过和序列号是否正常。
消息里的时间戳,接收者能够确认消息没有超出网络传输的正常延时。
只使用加密来保护数据完整性不够,在分组加密算法的ECB工作模式下,攻击者重排密文分组次序后每一个分组仍然能被成功地解密。分组的重排是一种威胁。
非加密的消息认证
无须保密的消息认证:
广播消息:消息必须以带有相关消息认证标签的明文形式进行发送。
计算机程序的认证:程序含有消息认证标签,则当消息完整性需要确认的时候要进行认证。
消息认证码(MAC):利用私钥产生一小块数据,称之为消息认证码,将其附到消息上。

若收到的认证码与计算得到的认证码一致,则:
接收者能够确认消息没有被篡改
接收者能够确保消息来自合法的发送者
如果消息中包含序列号(如X.25、HDLC 和TCP 使用的序列号),而攻击者不能成功地修改序列号,那么接收者就可以确认消息的正确序列。
单向散列函数
MAC的计算方法:
加密算法:
NIST标准FIPS PUB 113推荐使用DES。DES可以生成加密形式的消息,密文的最后16或32个比特用作MAC。
单向散列函数
散列函数接收变长的消息M作为输入,生成定长的消息摘要H(M)作为输出。 散列函数不需要密钥输入。为了认证消息,消息摘要随消息一起以可信的形式传送,加密算法可逆,单向散列函数不可逆,与加密相比它更不容易被攻破。



安全散列函数
为文件、消息或其他数据块产生“指纹”,浓缩任意长的消息M到一个固定长度的取值h 。
通常假设hash函数是公开的且不使用密钥。

对于Hash函数h=H(x),称x是h的原像,即把数据块x作为输入,使用Hash函数H得到h。因为H是多对一映射,所以对于任意给定的Hash值h,对应有多个原像。如果满足x不等于y且H(x)=H(y),则称出现碰撞(collision)。使用Hash函数的目的是保证数据完整性,碰撞是不希望轻易能找到的。
安全散列函数的要求
单向性:对于预先给定的Hash值找不到对应的数据块。
抗碰撞性:找不到不同的数据块对应相同的Hash值。
1.输入长度可变:H可以应用于任意大小的数据块。
2.输出长度固定:H产生固定长度的输出。
3.效率高:对任意给定的明文x,计算H(x)容易,可由硬件或软件实现。
4.抗原像攻击(单向性):对任意给定的散列码h,找到满足H(x)=h的x,在计算上不可行,单向性。
5.抗第二原像攻击(抗弱碰撞攻击):对任何给定分组x,找到满足y≠x且H(x)=H(y)的y,在计算上不可行,抗弱碰撞性。
6.抗碰撞攻击(抗强碰撞攻击):找到任何满足H(x)=H(y)的偶对(x, y),在计算上不可行,抗强碰撞性。
7.伪随机性:H的输出满足伪随机性测试标准。
蛮力攻击法
完全依赖于算法生成的散列码长度。
密码分析法
寻找利用了该算法在逻辑上的缺陷。
例子:
2004年8月中国密码学家王小云公布了寻找MD5碰撞的新方法。利用该方法用普通微机数分钟内即可找到MD5的碰撞,128比特的散列长度不够。对于160比特的散列长度,同样的搜索机器要花费超过4000年的时间才能找到一个冲突。在当今的技术下,搜索时间可能会缩短许多,所以160 比特的散列长度现在看来也有些不可靠。
消息认证码
基于Hash函数的MAC:HMAC
利用密码散列函数设计MAC(密钥加到散列函数中),因为散列函数软件执行速度比对称分组密码快,可利用密码散列函数代码库。
HMAC设计目标:
不必修改而直接使用现有的散列函数
用新散列函数替代原来嵌入的散列函数很容易
能保持散列函数原有特性,不过份降低其性能
对密钥的使用和处理应较简单
如果已知嵌入的散列函数的强度,则完全可知认证机制抗密码分析的强度
HMAC算法
1.在K左边填充0,得到b位的K+
2.K+与ipad执行异或,产生b位分组Si
3.M附于Si后 将H作用于步骤3所得的结果
4.K+与opad执行异或,产生b位分组So
5.将步骤4中的散列码附于So后
6.将H作用于步骤6所得的结果并输出该函数值

HMAC算法的安全性
任何建立在嵌入散列函数基础上的MAC,其安全性某种程度上依赖于该散列函数的强度。攻击HAMC意味着对密钥的穷举攻击和生日攻击。M.Bellar等已证明,如果攻击者已知若干(时间、消息)MAC对,则成功根据HAMC的概率等价于队嵌入函数的攻击。
基于分组密码的MAC:CMAC和CCM
CMAC的含义是基于密文的消息认证码,CCM的含义是具有密码块链式信息认证的计数器。
基于密文的MAC:CMAC
即CBC-MAC(密文分组链接消息认证码)。
具有密码块信息认证码的计数器(CCM)


公钥密码
公钥密码算法依赖一个加密密钥和一个与之相关的不同的解密密钥,算法有如下特点:
仅根据密码算法和加密密钥来确定解密密钥在计算上是不可行的。
两个密钥的任何一个都可以用来加密,另一个用来解密。
公钥密码的一般流程
每个用户产生密钥,用来加密和解密消息
每个用户将其中一个密钥(公钥)存于公开的寄存器或其他可访问的文件中,另一密钥私有,每个用户可以拥有若干其他用户的公钥
若Bob要发消息给Alice,则要用Alice的公钥对消息加密
Alice收到消息后,用其私钥对消息解密,由于只有Alice知道其自身的私钥,所以其他的接收者均不能解密消息
需要认证时示证方用自己的私钥加密消息(签名) 验证方用示证方的公钥解密消息(验证),如果结果证实公钥与示证方的私钥相吻合,则可以确认示证方确为合法的用户(认证)
加密和认证可以结合起来,同时实现保密性和认证
公钥密钥体制的应用
加密/解密:发送方用接收方的公钥对消息加密
数字签名:发送方用其私钥对消息签名,可以对整体消息签名或对消息的摘要签名
密钥交换:通信双方交换会话密钥
RSA公钥密码算法
1.选择两个大素数p, q ; 计算n=pq, ø(n) = (p-1) (q-1) ;
2.公钥的产生——随机地选择e, 满足1< e < ø(n), gcd(e, ø(n)) = 1 ;
3.私钥的产生——求解同余方程: ed ≡ 1 mod ø(n), 0 ≤ d ≤ n 。
例:
1.参数设置:p=17,q=11,n=pq=17x11=187, φ(n)=(p-1)(q-1) =16x10=160。
2.选择e=7,, gcd(7,160)=1, 23x7 mod 160=1, 所以d=23。
3.公钥KU={7,187}, 私钥KR={23,187}, M=88。
4.加密计算。
4.解密计算。
Diffie-Hellman 密钥交换
1.通信双方约定一个大素数q和模q的一个本原根α;
2.各方产生公开密钥:
选择一个秘密钥(数值),如 ,
.
计算公钥, 如,
, 并相互交换;
3.双方的共享会话密钥
4.是双方用对称密码通信时共享的密钥,如果双方继续通信,可以继续使用这个密钥,除非他们要选择新的密钥,攻击者如果想要获得x, 则必须解决DLP问题。


DH交互的中间人攻击
(1)Darth生成两个随机数和
,随后计算相应的公钥
和
;
(2)Alice将YA传递给Bob;
(3)Darth截获了,将
传给Bob,同时计算
(4)Bob收到YD1,计算
(5)Bob将YB传给Alice;
(6)Darth截获了,将
传给Alice,Darth计算
(7)Alice收到YD2,计算
这时,Bob和Alice认为他们之间共享了一个密钥。但实际上Bob和Darth共享密钥K1,而Alice和Darth共享密钥K2。
