密码安全之公钥密码、散列算法、数字签名

密码安全之公钥密码、散列算法、数字签名

上期文章密码安全之古典密码、对称密码链接:
https://blog.csdn.net/qq_26139045/article/details/103153172
密码开篇文章古典密码与现代密码的算法分类结构逻辑图:
https://blog.csdn.net/qq_26139045/article/details/103113818

公钥密码

对称密码常用于通信会话中的加密,但随着对称加密应用越来越广,会话密钥的管理问题也随之面临挑战。在由n个实体的网络里,需要的会话密钥数量为n(n-1),即达到O(n^2)。而且分组加密主要依赖于多轮复合的扩散和混淆运算,安全强度有待提升。

公钥密码也就是非对称密码,即加密密钥和解密密钥是不同的。一个可以被公开的密钥被称为公钥,一个私人专用保管的密钥叫私钥。公钥加密的信息只能用对应私钥来解密。公钥相比对称密码里的相同密钥就突出优点了,它可以使用一个公钥而不需要联机密钥服务器,密钥分配变得简单,不需要为了每一个设不同密钥。一个公钥就可以完成加密,只要私钥是保密,就都可以使用对应私钥解密。这样就降低了密钥的管理复杂度,提高了密码学的可用性。

Diffie-Hellman密钥交换算法

此密钥是以Diffie和Hellman命名,下面Alice和ben的DH密钥交换原理。

(1)选定一个可公开的大质数p和底数g。

(2)Alice和ben分别选定一个私有素数a和b。

DH密钥协商的目的是让Alice和Ben安全的获得共享密钥,任何第三方实体即使截获双方通讯数据,也无法计算得到相同的密钥。Alice和Ben的协商会话密钥K的过程为:

1、Alice和Bob协定使用p=23,g=5

2、Alice选择一个秘密整数a=6,计算A=g^a mod p并且发送给Bob:A=5^6 mod 23 = 8

3、Bob选择一个 秘密整数b=15,计算B=g^b mod p并发送给Alice:B = 5^15 mod 23 = 19

4、Alice计算K = B^a mod p,即19^6 mod 23 = 2

5、Bob计算K = A^b mod p ,即8^15 mod 23 =2

DH是一个公钥算法,应用的数论难题是大数的离散对数求解难题,已知g、a,计算A=g^a是容易的,但反之,已知A和g,求解a是困难的。所以攻击者就算截获了A和B,也无法计算得到a和b,更不可能算出K。

RSA公钥算法

RSA大家可能都经常听说,在很多CTF题目里Crypto里基本都会出现RSA。公开密钥算法是1976年由当时在美国斯坦福大学的Diffie和Hellman两人首先发明,但是目前流行的RSA算法则是MIT教授Ronald L.Rivest、Adi Shamir和Leonard M.Adleman共同发明的。RSA也是来自于这3位数学家的名字首字母。RSA算法就是依赖于大数因子分解难题,即给定两个大素数p、q,计算它们的乘积n=pq是容易的,但反之,给定n,求解p和q是一个经典的数论难题。

(1)密钥生成

1、选择两个大素数:p和q。

2、计算欧拉函数:ф(n) = (p-1)(q-1)

3、选择一个正整数e,是gcd(e,modф(n)),即e和ф(n)互为素数。

4、根据de=1(modф(n)),利用Euclid算法计算出d。

5、公钥即为K=<e,n>。

6、私钥即为S=<d,p,q>

注: Euclid算法即欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

(2)公钥加密

1、记明文信息为m(二进制),将m分成等长数据块m1、m2…,m3,块长s,其中2^s<=n

2、加密:Ci=mi^e(mod n)

3、解密:mi=ci^d(mod n)

一开始RSA选用的n长度达到512位,但是随着算力的提升,如今的RSA公钥长度已经达到了4096bit

公钥密码相比对称密码,有实现难度大,安全强度大、计算耗费大的特点,所以一般日常使用都是RSA和AES算法混合使用,通常称为数字信封技术。就是因为安全强度大,计算耗费大,所以加密所有明文信息显然是不太现实和划算。因此使用AES分组加密密文信息,使用RSA加密AES密钥,这样既可以保证AES密钥安全,之前有说到对称加密的密钥保护是很重要的,又可以提高加密效率,比较符合使用需求。接收方可以收到RSA加密的AES密钥和AES密文,只有持有RSA私钥的合法接收方才可以解开加密的AES密钥,从而使用AES密钥解密密文,得到明文。

散列算法

密码学上的散列算法是一种测试和保障信息完整性的有效方法,散列函数可以接受任意长度的明文信息输入,输出的是一个固定长度的字符串,这个字符串就叫作散列值或信息摘要。

散列算法是独立于对称密码和公钥密码体制的,因为它不需要解密,只是一种保障信息完整性的鉴别算法。A给B发送信息,为了保障B收到的是完整的信息,所以A会把信息的摘要也随信息一起发给B,B受到后就可以使用相同的方法再次计算出这段信息的摘要,然后将新的摘要和A发来的摘要进行比对,如果相同说明消息完整,如果不同,那么B就知道这些数据可能在传输过程中被黑客篡改,但是黑客可能也会一起修改散列值,所以依旧有可能欺骗用户,所以还有其他的技术结合使用,后面会说到。

故而散列算法就需要在密码学满足一些特性:

1、输入长度不受限制,可以是任何长度,可以对任意明文计算散列值。

2、输入时固定 长度,如MD5是128bit长度,SHA则是256bit

3、给出任意的报文可以很轻松地计算出散列函数H(x)

4、散列函数是个不可逆的函数,即给定一个Y,其中,Y=H(x),无法推算出x

5、散列函数不存在碰撞,即不存在一个不同于x的x‘使得H(h)=H(x’)

6、散列函数存在雪崩效应,即明文即使只有细微的区别,其散列值结果也会明显不同。

例如使用MD5来对两个明文进行处理:

MD5(“Fujian Agriculture And Forestry University”)=ad568059a39a19391f0b4ec188d54f97

MD5(“Fujian Agriculture Ans Forestry University”)=9c016f80fe5fb45cada72b7746534609

MD5的全称是Message-Digest Algorithm 5,即信息-摘要算法。经由MD2、MD3、MD4发展而来。但是我国国内的学者王小云教授在2005年首次找到了MD5散列的碰撞,因此最新的业界标准算法转到了安全散列算法SHA-1和SHA256。

注:王小云女士,是密码学家,中国科学院院士,清华大学高等研究院杨振宁讲座教授,清华大学密码理论与技术研究中心主任 ,山东大学密码技术与信息安全教育部重点实验室主任。

散列算法的典型应用是对一段信息产生信息摘要,以防止被篡改。例如Unix系统下有很多的软件在下载时都会有一个与文件名相同,文件拓展名位.md5的文件,这个文件里通常只有一行文本,大概结构如下。

MD5(zjut.tar.gz)=0ca175b9c0f726a831d895e269332461

这个就是zjut.tar.gz文件的数字指纹。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。我们平时在下载东西时也可以在某些下载站点看到软件的MD5值,它的作用在于可以在下载该软件后,对下载回来的文件用专门的软件(Windows MD5 Check等)进行一次MD5校验,确保文件和网站提供的一致。利用MD5算法来进行文件校验的方案被大量的应用到软件下载站、论坛数据库、系统文件安全等方面。

MD5还广泛的应用与操作系统登录认证,如Unix、各类BSD系统的登录密码、数字签名等。Unix系统的用户密码就是MD5散列运算储存于文件系统,当用户登录时,系统就要把用户输入的密码进行MD5散列运算,在和储存在文件系统里MD5值进行比较,进而确定密码是否正确。这样的好处时文件系统没有直接明文存储密码,而是密码的MD5,而我们说过了,散列算法时不可逆的,所以基本时不可逆推算出原来的明文,即使可能存在极小可能的碰撞,但是几率太低了,基本可以忽略,这样就避免了密码的泄露,提高了安全性。

所以现在黑客使用最多的密码破译方式就是跑字典,也即使暴力破解了。关于字典的话,一是日常收集的用做密码的字符串表,可以去网上找一些字典,另一种是用排列组合方式生成的,有一些专门的字典生成软件。先用MD5程序计算出这些字典的MD5值,然后再用目标的MD5值在这个字典里检索,但是前提是你可以搞得到目标账户的密码的MD5值。就算有了MD5值也是很低效的。所以散列密码依旧是最被广泛使用的密码技术。

数字签名

上面说了黑客有可能会修改信息和MD5散列值,已到达攻击目的。所以需要一种签名机制,它要保证所有人对文件完整性进行认证,同时又可以验证这份文件确实是发送者发的,攻击者无法伪造这个签名。数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通物理签名,但是用来公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,一个用于验证。

数字签名是公算法和散列算法的结合应用。数字签名常常和散列函数在一起使用,给定一段明文M,可以计算出明文的散列值h(M),然后将散列值进行某种加密S后,附在明文上,结构如M|S(h(M))。代表性的又RSA签名和DSA签名。

RSA数字签名

(1)密钥生成

密钥生成方式即RSA密钥生成方式,可以查阅RSA公钥算法的密钥生成过程

(2)签名过程

假设需要加密和签名的信息位M,其中M在1,2,……,n-1这个范围内,H为散列函数,签名过程如下

S=H(M)^d mod n

(3)验证过程

计算明文的散列值H(M),同时用公钥e解密S,再比较H(M)是否和S^e mod n相同,如果相同则验证成功。

DSA签名

使用SHA散列加密函数,它的安全性也取决于散列对数的难题。选择一个1024bit的素数p,此时又一个群组Zp。选择另一个160bit的素数q,q除以p-1和q都在群组Gq中,并且群组Gq属于Zp。其中用到的散列算法是SHA-1

(1)密钥生成

1、选择p和q,条件就是上面所表达的,换成数学的表达方式就是p=zq+1,并且z属于群组Zp

2、选择一个g,使得jz=g(mod p)成立,并且1<j<p

3、在范围1,……,q-1内选择一个随机数x

4、计算出来y=gx mod p

5、其中的公钥就是K1=(p,q,g,y),私钥就是K2=(p,q,g,x)

(2)签名过程

1、在范围1,……,q-1内选择一个随机数r

2、计算出来的s=(gr mod dp)mod q

3、计算出t=((SHA-1(M)+xs)r-1) mod q

4、将签名结果(s,t)附属在消息上

(3)验签过程

1、计算出u1=(SHA-1(M)t-1) mod q

2、计算出u2=(st-1) mod q

3、计算签名s1=((guqyu1)mod p)mod q

4、比较s1于s是否相同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值