密码学及相关理论

《密码学实践》《现代密码学理论与实践》《刘氏高强度公开加密算法设计原理与装置》《应用密码学:协议算法与c源程序》《密码编码学与网络安全:原理与实践(第二版)》《BigNum Math:加密多精度算法的理论与实现》之学习笔记。

1、任意大于1而又不是素数的整数称为合数,每个合数都可唯一分解出素数因子,素数也称为质数。

2、如果生成所有小于100万的素数,也要使用2000年前的一个算法,有阿基米德的朋友Eratosthenes提出的Eratosthenes筛选法。

3、欧几里得:存在无穷多个素数,并给出完美证明。

4、素数在密码学中之所以如此有用,主要原因是可以进行素数摸运算,即对于素数p,只需使用0,1,....,p-1这些数。

5、任何整数取模p运算之后总在0,1,...,p-1之内,即使原来的质数是负的,对于-1,结果为p-1。

6、集合G和运算*称为群(G,*):封闭率,结合律,单位元律,可逆律。如果G中元素个数是有限的,称为有限群。如果a*b=b*a,称G为阿贝尔群,或交换群。如果存在一个元素a属于G,对于任一整数i,使得a^i=b,则G为循环群,a为生成元或群的单位元和本原根。

7、整数集Z在加法+下构成群。对于任意n>=1,整数模n的集合构成一个包含n个元素的有限加法群,称为Zn(Zn,+(mod n)),Zn是正式和标准的写法Z/nZ的简化表示。Zn中包含所有与n互素的元素的子集构成的一个有限乘法群,乘法指模n乘法,e=1,对群中任一元素a,逆元可用扩展的欧几里得算法求得,用Zn*表示这个群。

8、环:一个同时满足两种运算:加法+和乘法*的集合,满足以下性质,即为环R:

  • R在加法+下是交换群,单位元为0(零元);
  • R在乘法*下满足封闭律、结合律、单位元律,乘法单位元为1(单位元),1不等于0;
  • 对于任一a,b属于R,a*b=b*a;
  • 对于任一a,b,c属于R,a*(b+c)=a*b+a*c;
9、域:如果一个环中的非零元在乘法运算下构成群,该环即为域。若p为素数,在模p加法和模p乘法运算下,Zp是一个域,Zp的非零元(Zp*)构成一个乘法群。若p为素数,有限域Zp记为Fp
10、数学家称模素数p的数的集合为有限域,称之为mod p域,对于mod p的计算有如下提示:所以结果总在0,1,...,p-1内,有限域包括两个部分:加法群和乘法群Zp*


11、计算a/b(mod p)或者c*b=a(mod p)中的c,需用2000多年前的欧几里得计算GCD的算法和扩展的欧几里得算法
12、对于公钥密码学来说,我们需要产生的素数有2000~4000比特长
13、快速确定一个整数是否为素数一直是一个值得讨论的问题,三种方法:试除法,Fermat测试,Miller-Rabin测试为可能性的素数测试方法,这些算法如果说某个整数是可分解的,则一定是可分解的,如果称某个整数是素数,基于的概率判定,不一定正确。虽然缺乏完全的确定性,但是这些方法检验在运行时可以按照需要做到使得概率尽可能地接近1,流行和高效的算法如Miller-Rabin算法。
14、DH协议使用模p的乘法群Zp*,即为从1,...,p-1构成的集合。如果对于群中任一g,Zp*为有限群,即1,g,g^2,g^3,...,g^q-1之后,g^q=1序列开始循环,称g为生成元,q为g的阶。模p乘法的一个性质是,至少有一个g生成整个群,其阶为p-1,可以把Zp*看做数列1,g,g^2,...,g^p-2,而不是数1,...,p-1。对任意的元素g,其阶为p-1的因子
15、密钥协商协议的缺陷:
  • 对于发送的g^x,g^y,要防止被替换成1
  • 如果g不是Zp*的生成元,或g的阶较小,防止小子群攻击,确保p是素数,g是模p的本原元
  • 如果g^x被替换成h(对于g^y一样),Bob 得到的密钥来自h生成的小集合,Eve可能会猜出密钥。Alice和Bob都必须做的是验证该数不会生成小的子群
  • 任何子群的大小都是p-1的因子,任何p-1的因子d,都存在一个大小为d的子群。如果不想要小的子群,必须避免p-1有小的因子。对于大素数p,p-1是偶数,所以存在包含两个元素的子群,由1和p-1构成。除了这个总是存在的子群外,我们能避免其他的小子群,只要p-1没有其他的小因子即可



16、安全素数:是一个(足够大的)形如2q+1的素数p,其中q也是素数,现在乘法群Zp*有下面的子群:
  • 只有数1组成的平凡子群
  • 大小为2的子群,由1和p-1构成
  • 大小为q的子群
  • 大小为2q的整个群
前两个容易避免,第三个即为我们想要的子群,对于1,...,p-1中恰好有一半的数是平方数,一半是非平方数,但生成元是非平方数(如果是平方数,任何次幂都不能产生非平方数,不能生产整个群)。如果g^x是非平方数,Legendre符号可以有效判定是否为非平方数,如果x为偶数,g^x为平方数,如果x为奇数,g^x为非平方数,Eve就会知道x为奇数,这事一个异常行为,避免的方法只使用模p的平方数,这些数正好是阶为q的子群,q是素数,不用担心有更深一层的子群。
如何使用安全素数:选择(p,q)使得p=2q+1,并且p和q都是素数,在2,...,p-2中随机选择一个a,令g=a^2(mod p),检验g不等于1,g不等于p-1(否则重选a),这样产生的参数(p,q,g)适合DH协议。收到g的方幂r时,必须检查这个值位于g生成的子群中,完整的检验为r不等于1且r^q(mod p)=1,1<r<p。
17、使用较小的子群:安全素数的效率不高,若有n比特长,q就是n-1比特长,所有的指数都是n-1比特长,标准的解决办法是使用小一点的子群,选择一个256比特的素数q,然后找更大的素数p以满足p=Nq+1,N是某个任意的值,其中p是奇数,N必须是偶数,素数p可以有几千比特长,在Zp*中选择一个随机数a,g=a^N,检查g不等于1,g^q=1(q是奇数,第二个条件涵盖了g=p-1),(p,q,g)即为所选参数。收到g的方幂r时,必须检查这个值位于g生成的子群中,完整的检验为r不等于1且r^q(mod p)=1,1<r<p
检查集合(p,q,g)要花一点时间,但在大多数系统中,同一个子群要用很长时间,所以这些检查只要执行一次
18、大素数p至少2000比特长,在安全素数中,计算一般的g^x需要大约3000次乘法,在子群情形中,计算g^x大约384次乘法,因为x可以模q约化从而只有256比特,节省7/8的工作量,当p更大时,节省更多,这是子群被广泛应用的原因
19、对称模块的密钥长度和DH之类的公钥模块的密钥长度之间有很大的差异,从没有人把对称密钥长度(比如128或256比特)与公钥长度(可能几天比特)进行过比较。公钥长度总是比对称密钥长度大的多
20、(01年的文章)在一个系统中,对称密钥的长度总是固定的,一旦设计的系统使用了特定的分组密钥和hash函数,也就固定了密钥的长度,这意味着在系统的生存期中对称密钥的长度都是固定的,另一方面,公钥长度总是变化的,这使得变换密钥的长度相当容易,一个2048比特的素数应该保护数据到2022年前后,3072比特的素数到2038年前后,4096比特的素数到2050年,预计十年的密钥长度可能是明智的,预言未来50年有点无聊,作为密钥设计者,选择至少未来20年时安全的密钥长度,2048比特是一个下界,如果完全从性能来看,可以使用4096比特或接近于4096比特,绝对要保证你的系统可以处理长达8192比特的密钥长度,如果对公钥系统的攻击出现意外的突破,可以转变成使用更大的密钥长度,虽会消耗一些性能,但系统的基本操作得以保留。有些系统要求数据的保密时间不止20年,这时,需要更大的密钥


21、对于RSA,如果要保护的数据达20年之久,n的绝对最小长度应为2048比特,可能的话在应用中就取为4096比特,此外,要确信你的软件支持8192比特长度的n值,两个素数p,q应该具有相同的长度,要得到一个k比特的n,可以生成两个随机的k/2比特的素数并把它们相乘,但可能得到一个k-1比特的模n,但这没关系。[目前1024仍然是安全的,但新的应用程序应该使用至少1536或者更高的,尤其是一个将要使用几年的密钥。业界许多人设置最小为2048比特的密钥,摘自程序员密码学]
22、模型中通常说的安全参数可能就是p-1的素因子q,见应用密码学4.6.1
23、一个密钥通常仅用于一件事情,尽量不要为协议指定固定DH参数,Hash函数运算速度非常快,以至可以忽略额外的代价,可以通过发送随机数验证对方是否在线或重放。会话密钥是通过代数关系计算来的,攻击者可能会发现某种方法来求解它,最明显的解决办法是对最终的密钥进行Hash运算,使得它缩减到固定的长度,而且也破坏了其中存在的代数结构。如果A发送的需要B选择的素数最小比特数Sa被攻击者增大,因为它使得素数变得更大,改变Sa并不会导致攻击,但攻击者进行尝试总不是一个好主意
24、当模比较大时,计算RSA签名与DH计算相比要相对慢一些,当模较小时会相对快一些,而这的平衡点大约是3000比特,因为DH总是使用256比特的指数,而RSA的指数则随着模的增大而增大。对于我们使用的公钥长度,DH的计算代价和RSA得签名代价基本一样
25、实现密码协议最好保持一个确切的状态,每当消息到达的时候就升级协议状态,这个基于消息驱动的方法在实现时需要稍微多做些工作,但它提供了更高的灵活性


26、根据经验,因特网上的一个包要么在几秒钟左右到达,要么就永远消失了,如果5秒钟内没有收到答复,重新发送一个消息是合理的,三次重试应该就足够了
27、Hash函数可用于加密、认证、构造简单的数字签名方案等,输入是任意长度的比特或字节串,输出是固定长度的对应串,一般是128到512比特之间,与通常的Hash表的映射函数不同,有一些特有的性质,单向性,抗碰撞性,随机性
28、MD5:基于MD4,将输入分为512比特组,迭代产生,最后输出128比特,但128比特长度是不够的,由生日悖论可知,对Hash函数大约进行2^64计算就可找到一个碰撞,对现代密码系统来说这是不够的,建议不要使用MD5
29、SHA-1:已被NIST标准化,也是基于MD4,输出为160比特,需用2^80步就可找到碰撞
SHA-256
SHA-384:没有什么用处,算法与SHA-512相同,只是舍弃了一些比特,建议采用SHA-256或SHA-512
SHA-512
Hash函数碰撞问题和长度扩充问题(A发送h(X||m)给B,其中X是A和B共享的一个秘密信息,如果Eve在消息后面附加消息m,计算出于新消息相匹配的认证信息,在这个认证系统里Eve就可以修改消息,这样的系统对我们来说是没有用的)等,有人提出使用两次的Hash函数方法来避免,但设计Hash函数是很棘手的问题,这个结论还没有得到证明,用h(h(m)||m)将h(m)放在m的前面,可以保证Hash函数迭代运算与消息的每一比特都有关,从而避免长度扩充和部分碰撞的攻击,但缺点是比较慢,但安全性比速度更重要,另外一个缺点是需要存储整个信息,而不能在数据流的传输过程中计算其Hash值。可以定义Hash函数为h(h(m))



30、微软的CryptoAPI是PKI推荐使用的加密 API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和 CSP(cryptographic service provider)之间。
CryptoAPI的编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。
CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信息的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
31、DH协议基于单项函数的,假定p,g是公开的,由x计算g^x mod p容易,但反过来求x是困难的,RSA基于限门单项函数的,给定n,e容易求m^e mod n,但相反方向不行,如果知道n的分解,反向计算变得容易 ,n的分解就是限门信息。
32、对于RSA,n,e,C,d,为了提高破解难度,一般商业有用要求n长度不小于1024bit,更重要场合不小于2048bit.实际中应用的素数为512bit,n为1024bit,用户的巨大计算机开销是RSA公钥密码体制的致命弱点,即使采用超大规模集成电路来实现RSA体制,其应用范围也是受到局限和制约的。
33、对大数进行因式分解是困难的。不幸的是,对算法设计者来说它正变得越来越容易。更加糟糕的是,它比数学家们所希望的还要快。1977年,Ron Rivest说过分解一个125位(十进制)的数据需要40 * 1015年。 可是,一个129位的数已经在1994年被成功分解。大数因式分解最近的记录是RSA200,一个200位的非特殊数字,在2005年计算机花了18个月 时间才把它分解成两个素数。而目前一个国际组织则打破了这个保持了2年之久的记录,3月6日来自3个机构的计算机集群(EPFL,波恩大学,日本电话电报 公司)在经过11个月的计算后终于成功的把一个有名的很难分解的大数—2^1039 - 1 —一个307位的数字—分解出两个素数因子。
34、自1977年公钥密码体制RSA算法建立以来,目前美国绝大多数加密体制使用150位长的大数来编制密码(可能是十进制数),但一个150位左右的合数,因子分解已经可以被攻破,但采用现在的巨型电子计算机进行因子分解,运算量是相当巨大的(当初RSA设计者估计本世纪不可能被攻破,但现在已被攻破,只是运算量相当巨大而已),160位的合数是当今RSA公钥密码体制实际应用的合数表示范围
35、CPA:攻击者选择明文消息并得到加密服务,产生相应的密文,攻击者的任务是用更多得到的明密文对来降低目标密码体制的安全性。
CCA:攻击者选择密文消息并得到解密服务,产生相应的明文。攻击者的任务是用更多得到的明密文对来降低目标密码体制的安全性。在解密服务停止后,记载得到目标密文之后,解密服务立即停止,如果攻击者能够从“目标密文”中得到保密明文的信息,则说攻击是成功的
CCA2:是一个CCA,而且除了对“目标密文”解密外,永远能够得到解密服务。
36、穷举攻击是一种典型的已知明文攻击,它需要少量的密文及相应的明文。1992年,40-位密钥的RC2和RC4算法已经被成功破译,而对于128位密钥来说,进行穷举攻击是十分荒唐的
37、多精度表示法相对于单精度或固定精度表示法的优势:当运算所需精度超出范围时,其结果的表示精度不受损失,多精度算法会增加中间变量的精度,以满足结果所需的精度,而单精度喜糖会截断多余的位数,以保持固定的精度。多精度算法比其他任何算法的开销都要大,虽然大部分开销都可以保持在最小水平,但总的来说,不适合消耗内存的平台。但就输入值的范围来说,其灵活性最高,不需要设计者预先考虑即可适应任何大小的输入。





注:对于类似安全的密钥长度这些内容,有些书不完全一致,且随技术发展,以前安全的长度,在未来很有可能是不安全的,文中内容仅供参考


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值