非对称加密算法的描述
计算机网络安全——非对称加密算法RSA和数字签名(二)

计算机⽹络安全——⾮对称加密算法RSA和数字签名(⼆)⼀、⾮对称加密算法基本概念在对称密钥系统中,两个参与者要共享同⼀个秘密密钥。
但怎样才能做到这⼀点呢?⼀种是事先约定,另⼀种是⽤信使来传送。
在⾼度⾃动化的⼤型计算机⽹络中,⽤信使来传送密钥显然是不合适的。
如果事先约定密钥,就会给密钥的管理和更换都带来了极⼤的不便。
当然我们可以使⽤复杂的密钥分发中⼼(KeyDistributionCenter,KDC)来解决该问题,但采⽤公钥密码体制可以⽐较容易地解决这个问题。
公钥密码体制的概念是由Stanford⼤学的研究⼈员Diffie与Hellman于1976年提出的。
公钥密码体制使⽤不同的加密密钥与解密密钥。
由于加密密钥不能⽤来解密,并且从加密密钥不能推导出解密密钥,因此加密密钥可以公开。
例如,参与者A可以在报纸上公布⾃⼰的加密密钥(即公钥),⽽解密密钥(即私钥)⾃⼰秘密保存。
任何参与都可以获得该公钥,并⽤来加密发送给参与者A的信息,⽽该信息只能由A解密。
可见采⽤公钥密码体制更易解决密钥分发的问题。
公钥密码体制有许多很好的特性,使得它不仅可以⽤于加密,还可以很⽅便地⽤于鉴别和数字签名。
但不幸的是,⽬前的公钥密码算法⽐对称密码算法要慢好⼏个数量级。
因此,对称密码被⽤于绝⼤部分加密,⽽公钥密码则通常⽤于会话密钥的建⽴。
例如,参与者A要发送⼤量秘密信息给B。
A⾸先选择⼀个⽤于加密数据本⾝(如采⽤DES算法)的密钥,由于该密钥仅⽤于该次会话,被称为会话密钥。
因为对称密钥由双⽅共享,A必须将该会话密钥通过秘密渠道告知B。
为此,A⽤B的RSA公钥加密该会话密钥后发送给B。
B收到加密的会话密钥后⽤⾃⼰的私钥解密后得到会话密钥。
此后,A和B之间就可以⽤该会话密钥加密通信的数据。
具体流程如下图:⼆、数字签名的基本概念在⽇常⽣活中,可以根据亲笔签名或印章来证明书信或⽂件的真实来源。
但在计算机⽹络中传送的⽂电⼜如何盖章呢?这就是数字签名(digitalsignature)所要解决的问题。
非对称密码算法

非对称密码算法实验1-3 非对称密码算法 RSA一.实验目的通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。
二.实验原理前面讲的对称密码算法要求通信双方通过交换密钥实现使用同一个密钥,这在密钥管理、发布和安全性方面存在很多问题,而非对称密码算法解决了这个问题。
非对称密码算法是指一个加密系统的加密密钥和解密密钥是不相同,或者说不能从其中一个推导出另一个。
在非对称密码算法的两个密钥中,一个是用于加密的密钥,它是可以公开的称为公钥;另一个是用于解密的密钥,是保密的,称为私钥。
非对称密码算法解决了对称密码体制中密钥管理的难题,并提供了对信息发送人的身份进行验证的手段,是现代密码学的最重要的发明和进展。
RSA密码体制是目前为止最为成功的非对称密码算法,是在1977年由Rivest、Shamir 和Adleman提出的第一个比较完善的非对称密码算法。
它的安全性是建立在“大数分解和素性检测”这个数论难题的基础上,即将两个大素数相乘在计算上容易实现,而将该乘积分解为两个大素数因子的计算量相当大。
虽然的安全性还未能得到理论证明,但经过20多年的密码分析和攻击,迄今仍然被实践证明是安全的。
RSA算法描述如下:1. 公钥选择两个互异的大素数p和q,n是二者的乘积,即n = pq,使Φ(n)=(p-1)(q-1),Φ(n)为欧拉函数。
随机选取正整数e,使其满足gcd(e, Φ(n))=1,即e和Φ(n)互质,则将(n,e)作为公钥。
2. 私钥求出正数d,使其满足e×d=1 modΦ(n),则将(n,d)作为私钥。
3. 加密算法对于明文M,由C=M e mod n ,得到密文C。
4.解密算法对于密文C,由M=C d mod n,得到明文M。
如果窃密者获得了n,e和密文C,为了破解密文他必须计算出私钥d,为此需要先分解n为p和q。
为了提高破解难度,达到更高的安全性,一般商业应用要求n的长度不小于1024bit,更重要的场合不小于2048bit。
说明对称密码算法和非对称密码算法的原理和优缺点

说明对称密码算法和非对称密码算法的原理和优缺点
对称密码算法:
原理:对称密码算法是一种加密算法,发送方和接收方使用相同的密钥进行加密和解密。
加密过程中,将明文按照一定的规则和算法进行混淆和置换,以产生密文。
解密过程中,使用相同的密钥和算法对密文进行逆向操作,还原出明文。
优点:
1. 加密和解密速度快,适用于大量数据的加密和解密操作。
2. 密钥长度相对较短,不占用过多的存储空间。
3. 实现简单,操作容易。
缺点:
1. 密钥的分发和管理较为困难,存在安全性问题。
2. 无法有效解决密钥传递问题,即如何确保密钥在发送和接收之间的安全传递。
非对称密码算法:
原理:非对称密码算法是一种加密算法,发送方和接收方使用不同的密钥进行加密和解密。
加密过程中,发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。
优点:
1. 安全性高,公钥可以随意公开,只有私钥持有者才能解密密文。
2. 解决了对称密码的密钥分发和管理问题。
缺点:
1. 加密和解密速度较慢,适用于少量数据的加密和解密操作。
2. 密钥长度相对较长,占用较多的存储空间。
3. 实现较为复杂,操作稍微复杂。
总结:
对称密码算法的优点在于速度快、实现简单,但安全性相对较低;非对称密码算法的优点在于安全性高,但加密和解密速度较慢、实现较为复杂。
因此,实际应用中常常采用对称密码算法和非对称密码算法的结合,即非对称密码算法用于密钥分发和管理,对称密码算法用于实际的数据加密和解密。
非对称加密算法

不对称加密算法不对称加密算法使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。
在使用不对称加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。
加密明文时采用公钥加密,解密密文时使用私钥才能完成,而且发信方(加密者)知道收信方的公钥,只有收信方(解密者)才是唯一知道自己私钥的人。
不对称加密算法的基本原理是,如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。
显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。
由于不对称算法拥有两个密钥,因而特别适用于分布式系统中的数据加密。
广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。
以不对称加密算法为基础的加密技术应用非常广泛。
RSA算法简介这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也很流行。
算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。
但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数分解。
公钥和私钥都是两个大素数(大于 100个十进制位)的函数。
据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
密钥对的产生。
选择两个大素数,p 和q 。
计算:n = p * q然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。
最后,利用Euclid欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等算法计算解密密钥d, 满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。
非对称密钥算法

非对称密钥算法非对称密钥算法是一种特殊的密钥加密算法,也被称为公开密钥加密和单向加密。
它利用一对秘密密钥(公钥和私钥)来实现加密和解密。
一般来说,公钥由发送方事先发布给接收方,而私钥由发送方保留,不会被发布给任何人,包括接收方。
这样,发送方可以使用自己的私钥加密消息,并使用接收方公钥将其解密,而接收方却无法使用自己的私钥加密任何消息,因为它本身就不拥有任何私钥。
公钥加密算法是目前被广泛应用的一种安全通信技术,它包括RSA,ElGamal,D-H密钥交换,Elliptic Curve Cryptography(ECC)等算法,这些算法的重点是实现高级的隐私保护和数据安全。
RSA算法是目前在网络安全方面被广泛应用的公钥加密算法,它是由美国科学家Ron Rivest,Adi Shamir和Len Adleman发明的。
RSA的主要思想是用一对公开的密钥来完成加密和解密,这对密钥分别是一个公钥和一个私钥,这两个密钥是互不相通的,不能够从另一个密钥计算出来,也不能够从明文计算出来。
只有拥有私钥的收件人能够解密加密的消息,而拥有公钥的任何人都可以把消息加密给收件人。
ElGamal算法是由Taher Elgamal发明的公开密钥系统,它是一种椭圆曲线密码(ECC)。
与RSA不同,ElGamal可以同时用来加密和签名。
此外,ElGamal的安全性更高,因为它的密码长度可以更小,在相同的安全级别下比RSA更加有效。
DH密钥交换是一种没有中心机构的方式,可以在双方之间进行安全的通信,也被称为Diffie-Hellman密钥交换算法。
它利用两个实体之间的共同协商,可以产生一组密钥,用来加密和解密数据,并在双方之间交换信息。
它和RSA有许多相似之处,但又有所不同,它不需要生成共享私钥,而是向另一方发送其共享公钥,然后根据该公钥生成一组密钥,其中包含一个共享的私钥,这样,双方就各自拥有一份共享的私钥,而无需中央机关担任中介者。
非对称加密(2)非对称加密算法

⾮对称加密(2)⾮对称加密算法2基本流程很简单,那么公钥加密,私钥解密的算法原理到底是什么呢?本节简要阐述RSA算法、DSA算法、ECC算法、Diffie-Hellman算法的基本原理,其中涉及很多数论、离散数学以及解析⼏何⽅⾯的数学知识,感兴趣的读者可以借此加强相关理论基础。
RSA算法RSA算法是当前最著名、应⽤最⼴泛的公钥系统,1978年由美国⿇省理⼯学院的Ron Rivest、 Adi Shamir 和LeonardAdleman在论⽂《获得数字签名和公开钥密码系统的⽅法》中提出的。
这是⼀个基于数论的⾮对称(公开钥)密码体制,采⽤分组加密⽅式。
其名称来⾃于三个发明者的姓名⾸字母。
它的安全性是基于⼤整数素因⼦分解的困难性,⽽⼤整数因⼦分解问题是数学上的著名难题,⾄今没有有效的⽅法予以解决,因此可以确保RSA算法的安全性。
RSA系统是公钥系统的最具有典型意义的⽅法,⼤多数使⽤公钥密码进⾏加密和数字签名的产品和标准使⽤的都是RSA算法。
RSA算法是第⼀个既能⽤于数据加密也能⽤于数字签名的算法,因此它为公⽤⽹络上信息的加密和鉴别提供了⼀种基本的⽅法。
它通常是先⽣成⼀对RSA 密钥,⼀个是保密密钥,由⽤户保存;另⼀个为公开密钥,可对外公开,甚⾄可在⽹络服务器中注册,⼈们⽤公钥加密⽂件发送给个⼈,个⼈就可以⽤私钥解密接收。
为提⾼保密强度,RSA密钥⼀般为1024或者2048位。
RSA算法的⼯作原理如下:步骤 1任意选取两个不同的⼤质数p和q,计算乘积r=p*q。
步骤 2任意选取⼀个⼤整数e,e与(p-1)*(q-1)互质,整数e⽤做加密密钥。
注意:e的选取是很容易的,所有⼤于p和q的质数都可⽤。
步骤 3确定解密密钥d: d * e = 1 mod(p - 1)*(q - 1)根据e、p和q可以容易地计算出d。
步骤 4公开整数r和e,但是不公开d。
步骤 5将明⽂P(P是⼀个⼩于r的整数)加密为密⽂C,计算⽅法为C = P^e mod r 。
非对称加密工作原理
非对称加密工作原理非对称加密是一种常用的加密算法,其工作原理是基于数学上的难解问题。
与对称加密算法不同,非对称加密算法使用一对密钥,分别是公钥和私钥。
公钥可以自由传播,而私钥只有密钥的持有者才能知道。
通过使用这对密钥,可以实现加密、解密和数字签名等功能。
非对称加密的工作原理可以简单地描述为以下几个步骤:1. 密钥生成:首先,密钥的持有者需要生成一对密钥,即公钥和私钥。
生成密钥的过程是基于复杂的数学运算,保证了密钥的安全性和唯一性。
2. 加密过程:发送方使用接收方的公钥对消息进行加密。
这个过程是不可逆的,即使用公钥加密后的消息只能使用对应的私钥进行解密。
因此,即使在传输过程中被窃听,攻击者也无法获取消息的明文。
3. 解密过程:接收方使用自己的私钥对加密后的消息进行解密,恢复成原始的明文消息。
由于私钥只有接收方知道,因此只有接收方能够解密消息。
4. 数字签名:非对称加密还可以用于数字签名,用于验证消息的完整性和身份的真实性。
发送方使用自己的私钥对消息进行签名,接收方使用发送方的公钥对签名进行验证。
如果验证成功,可以确认消息的来源和完整性。
非对称加密算法的工作原理基于数学上的难解问题,如大素数分解、离散对数等。
这些问题在计算上是非常复杂和耗时的,因此攻击者很难通过穷举法或其他方法破解密钥。
这就保证了非对称加密算法的安全性。
与非对称加密相对应的是对称加密算法,对称加密算法使用同一个密钥进行加密和解密。
由于密钥的传输和管理是一个重要的问题,非对称加密算法可以解决这个问题。
在实际应用中,常常使用非对称加密算法来传输对称加密算法的密钥,以保证密钥的安全性。
总结起来,非对称加密是一种基于数学难解问题的加密算法,使用一对密钥进行加密、解密和数字签名等操作。
其工作原理保证了密钥的安全性和唯一性,使得非对称加密算法在信息安全领域得到了广泛应用。
通过使用非对称加密算法,可以保护用户的隐私和数据的安全,防止敏感信息被窃听、篡改或伪造。
非对称密码算法RSA原理
非对称密钥加密算法-RSA一.非对称密钥加密概述前面讲述了对称密钥加密体制。
使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥。
这样,如果一个网络中有n个用户,他们之间彼此可能需要进行秘密通信,这时网络中将共需要n(n-1)/2个密钥(其中,每个用户都需要保存n-1个密钥),这样巨大的密钥量给密钥分配和管理带来了极大的困难。
另外,随着计算机网络,特别是因特网的发展,网络上互不相识的用户可能需要进行保密的会话(例如,如果用户在进行电子商务活动时,需要保密的连接,这时的客户对象可能根本不是固定的对象)。
最后,对称密钥加密机制难以解决签名验证问题。
非对称密钥加密也称为公开密钥加密,或者叫做公钥加密算法。
使用公开密钥密码的每一个用户都分别拥有两个密钥:加密密钥和解密密钥,它们两者并不相同,并且由加密密钥得到解密密钥在计算机上是不可行的。
每一个用户的加密密钥都是公开的(因此,加密密钥也称为公开密钥)。
所有用户的公开密钥都将记录在作用类似于电话号码薄的密钥本上,而它可以被所有用户访问,这样每一个用户都可以得到其他所有用户的公开密钥。
同时,每一个用户的解密密钥将由用户保存并严格保密(因此,解密密钥也称为私有密钥)。
非对称密码算法解决了对称密码体制中密钥管理的难题,并提供了对信息发送人的身份进行验证的手段,是现代密码学最重要的发明。
公钥加密算法一般是将对密钥的求解转化为对数学上的困难问题的求解,例如RSA算法的安全性是建立在“大数分解和素性检测”这个数论难题的基础上,已知两个大素数a、b,求出a*b是容易计算的,而已知a*b,想知道其是哪两个大素数的乘积目前还没有好的计算方法,另外也有一些非对称加密算法(如ELGamal算法)的安全性是基于求“离散对数”这个数学难题上的。
在公钥密码系统中每个实体都有自己的公钥和相应的私钥。
公钥密码系统的加密变换和解密变换分别用E和D表示。
任何实体B要向实体A发送信息m的步骤如下:实体B首先获得实体A的真实公钥的拷贝(eA),实体B使用eA计算密文 c=E(m)并发送给实体A ,实体A使用自己的私钥dA,计算m=D(c)解密密文,恢复出明文m。
非对称加密算法--DH
⾮对称加密算法--DH注意:本节内容主要参考⾃《Java加密与解密的艺术(第2版)》第8章“⾼等加密算法--⾮对称加密算法”11.1、⾮对称加密算法特点:发送⽅和接收⽅均有⼀个密钥对(公钥+私钥),其中公钥传播,私钥⾃⼰保存,不需要传播私钥不需要传播的特性解决了对称加密算法中密钥传播的困难(这个困难⼀般通过线下传递可以解决)加密安全性极⾼,只⽤于⼀些电⼦商务⽹站,加解密速度远低于对称加密⼀般情况下,为了解决⾮对称加密算法加解密速度低的问题,采⽤⾮对称加密(使⽤公钥+私钥对对称加密的密钥进⾏加解密)+对称加密(加解密数据)相结合的⽅式。
常见算法:DH(⾮对称加密的基⽯)RSA(⾮对称加密的经典,除了可⽤于⾮对称加密,也可⽤于数字签名,RSA--155(512位密钥)已被破解)ElGamal11.2、DH(仅能⽤于密钥分配,不能加解密数据)实现⽅式:JDK(密钥长度:512~1024中的64的整数倍)⼏个概念:密钥对:公钥+私钥本地密钥:对称加密的密钥整个流程:1)甲⼄双⽅初始化各⾃的密钥对甲⽅构建出密钥对keyPair1-->⼄⽅使⽤甲⽅的密钥对中的公钥publicKey1构建出⾃⼰的密钥对keyPair22)甲⼄双⽅构建各⾃的本地密钥甲⽅使⽤⾃⼰的私钥privateKey1+⼄⽅的公钥publicKey2构建出⾃⼰的本地密钥key1⼄⽅使⽤⾃⼰的私钥privateKey2+甲⽅的公钥publicKey1构建出⾃⼰的本地密钥key2最后会发现key1==key2,这两个本地密钥将会是接下来对对称加密所使⽤的密钥3)发送⽅(甲⽅或⼄⽅均可)使⽤本地密钥+对称加密算法对待加密数据进⾏加密,传递给接收⽅4)接收⽅使⽤本地密钥+对称加密算法对待解密数据进⾏解密1 package com.util.dh;23 import java.io.UnsupportedEncodingException;4 import java.security.InvalidAlgorithmParameterException;5 import java.security.InvalidKeyException;6 import java.security.Key;7 import java.security.KeyFactory;8 import java.security.KeyPair;9 import java.security.KeyPairGenerator;10 import java.security.NoSuchAlgorithmException;11 import java.security.PrivateKey;12 import java.security.PublicKey;13 import java.security.spec.InvalidKeySpecException;14 import java.security.spec.PKCS8EncodedKeySpec;15 import java.security.spec.X509EncodedKeySpec;1617 import javax.crypto.BadPaddingException;18 import javax.crypto.Cipher;19 import javax.crypto.IllegalBlockSizeException;20 import javax.crypto.KeyAgreement;21 import javax.crypto.NoSuchPaddingException;22 import javax.crypto.interfaces.DHPublicKey;23 import javax.crypto.spec.DHParameterSpec;24 import javax.crypto.spec.SecretKeySpec;2526 import mons.codec.binary.Base64;2728 /**29 * 基于JDK的DH算法,⼯作模式采⽤ECB30 */31 public class DHJDK {32 private static final String ENCODING = "UTF-8";33 private static final String FDC_KEY_ALGORITHM = "DH";//⾮对称加密密钥算法34 private static final String DC_KEY_ALGORITHM = "AES";//产⽣本地密钥的算法(对称加密密钥算法)35 private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//加解密算法格式:算法/⼯作模式/填充模式注意:ECB不使⽤IV参数36 private static final int FDC_KEY_SIZE = 512;//⾮对称密钥长度(512~1024之间的64的整数倍)3738 /**39 * ⽣成甲⽅密钥对40 */41 public static KeyPair initKey() throws NoSuchAlgorithmException{42 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(FDC_KEY_ALGORITHM);//密钥对⽣成器43 keyPairGenerator.initialize(FDC_KEY_SIZE);//指定密钥长度44 KeyPair keyPair = keyPairGenerator.generateKeyPair();//⽣成密钥对45 return keyPair;46 }4748 /**49 * ⽣成⼄⽅密钥对50 * @param key 甲⽅公钥51 */52 public static KeyPair initKey(byte[] key) throws NoSuchAlgorithmException,53 InvalidKeySpecException,54 InvalidAlgorithmParameterException{55 KeyFactory keyFactory = KeyFactory.getInstance(FDC_KEY_ALGORITHM);//密钥⼯⼚56 PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(key));//还原甲⽅公钥57 DHParameterSpec dHParameterSpec = ((DHPublicKey)publicKey).getParams();5859 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(keyFactory.getAlgorithm());//⼄⽅密钥对⽣成器60 keyPairGenerator.initialize(dHParameterSpec);//使⽤甲⽅公钥参数初始化⼄⽅密钥对⽣成器61 KeyPair keyPair = keyPairGenerator.generateKeyPair();//⽣成密钥对62 return keyPair;63 }6465 /**66 * DH加密67 * @param data 带加密数据68 * @param keyByte 本地密钥,由getSecretKey(byte[] publicKey, byte[] privateKey)产⽣69 */70 public static byte[] encrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,71 NoSuchPaddingException,72 InvalidKeyException,73 IllegalBlockSizeException,74 BadPaddingException,75 UnsupportedEncodingException {76 Key key = new SecretKeySpec(keyByte, DC_KEY_ALGORITHM);//⽣成本地密钥7778 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);79 cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key80 return cipher.doFinal(data.getBytes(ENCODING));81 }8283 /**84 * DH解密85 * @param data 待解密数据为字节数组86 * @param keyByte 本地密钥,由getSecretKey(byte[] publicKey, byte[] privateKey)产⽣87 */88 public static byte[] decrypt(byte[] data, byte[] keyByte) throws NoSuchAlgorithmException,89 NoSuchPaddingException,90 InvalidKeyException,91 IllegalBlockSizeException,92 BadPaddingException {93 Key key = new SecretKeySpec(keyByte, DC_KEY_ALGORITHM);//⽣成本地密钥94 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);95 cipher.init(Cipher.DECRYPT_MODE, key);96 return cipher.doFinal(data);97 }9899 /**100 * 根据本⽅私钥与对⽅公钥构建本地密钥(即对称加密的密钥)101 * @param publicKey 对⽅公钥102 * @param privateKey 本⽅私钥103 */104 public static byte[] getSecretKey(byte[] publicKey, byte[] privateKey) throws NoSuchAlgorithmException,105 InvalidKeySpecException,106 InvalidKeyException{107 KeyFactory keyFactory = KeyFactory.getInstance(FDC_KEY_ALGORITHM);//密钥⼯⼚108 PublicKey pubkey = keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));//还原公钥109 PrivateKey prikey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKey));//还原私钥110111 KeyAgreement keyAgreement = KeyAgreement.getInstance(keyFactory.getAlgorithm());112 keyAgreement.init(prikey);113 keyAgreement.doPhase(pubkey, true);114 return keyAgreement.generateSecret(DC_KEY_ALGORITHM).getEncoded();//⽣成本地密钥(对称加密的密钥)115 }116117 /**118 * 获取公钥119 */120 public static byte[] getPublicKey(KeyPair keyPair){121 return keyPair.getPublic().getEncoded();122 }123124 /**125 * 获取私钥126 */127 public static byte[] getPrivateKey(KeyPair keyPair){128 return keyPair.getPrivate().getEncoded();129 }130131 /**132 * 测试133 */134 public static void main(String[] args) throws NoSuchAlgorithmException,135 InvalidKeySpecException,136 InvalidAlgorithmParameterException,137 InvalidKeyException,138 NoSuchPaddingException,139 IllegalBlockSizeException,140 BadPaddingException,141 UnsupportedEncodingException {142 byte[] pubKey1;//甲⽅公钥143 byte[] priKey1;//甲⽅私钥144 byte[] key1;//甲⽅本地密钥145 byte[] pubKey2;//⼄⽅公钥146 byte[] priKey2;//⼄⽅私钥147 byte[] key2;//⼄⽅本地密钥148149 /*********************测试是否可以正确⽣成以上6个key,以及key1与key2是否相等*********************/150 KeyPair keyPair1 = DHJDK.initKey();//⽣成甲⽅密钥对151 pubKey1 = DHJDK.getPublicKey(keyPair1);152 priKey1 = DHJDK.getPrivateKey(keyPair1);153154 KeyPair keyPair2 = DHJDK.initKey(pubKey1);//根据甲⽅公钥⽣成⼄⽅密钥对155 pubKey2 = DHJDK.getPublicKey(keyPair2);156 priKey2 = DHJDK.getPrivateKey(keyPair2);157158 key1 = DHJDK.getSecretKey(pubKey2, priKey1);//使⽤对⽅公钥和⾃⼰私钥构建本地密钥159 key2 = DHJDK.getSecretKey(pubKey1, priKey2);//使⽤对⽅公钥和⾃⼰私钥构建本地密钥160161 System.out.println("甲⽅公钥pubKey1-->"+Base64.encodeBase64String(pubKey1)+"@@pubKey1.length-->"+pubKey1.length); 162 System.out.println("甲⽅私钥priKey1-->"+Base64.encodeBase64String(priKey1)+"@@priKey1.length-->"+priKey1.length); 163 System.out.println("⼄⽅公钥pubKey2-->"+Base64.encodeBase64String(pubKey2)+"@@pubKey2.length-->"+pubKey2.length); 164 System.out.println("⼄⽅私钥priKey2-->"+Base64.encodeBase64String(priKey2)+"@@priKey2.length-->"+priKey2.length); 165 System.out.println("甲⽅密钥key1-->"+Base64.encodeBase64String(key1));166 System.out.println("⼄⽅密钥key2-->"+Base64.encodeBase64String(key2));167168 /*********************测试甲⽅使⽤本地密钥加密数据向⼄⽅发送,⼄⽅使⽤本地密钥解密数据*********************/169 System.out.println("甲⽅-->⼄⽅");170 String data = "找⼀个好姑娘啊!";171 byte[] encodeStr = DHJDK.encrypt(data, key1);172 System.out.println("甲⽅加密后的数据-->"+Base64.encodeBase64String(encodeStr));173 byte[] decodeStr = DHJDK.decrypt(encodeStr, key2);174 System.out.println("⼄⽅解密后的数据-->"+new String(decodeStr,"UTF-8"));175176 /*********************测试⼄⽅使⽤本地密钥加密数据向甲⽅发送,甲⽅使⽤本地密钥解密数据*********************/177 System.out.println("⼄⽅-->甲⽅");178 String data2 = "找⼀个好姑娘啊!";179 byte[] encodeStr2 = DHJDK.encrypt(data2, key2);180 System.out.println("⼄⽅加密后的数据-->"+Base64.encodeBase64String(encodeStr2));181 byte[] decodeStr2 = DHJDK.decrypt(encodeStr, key1);182 System.out.println("甲⽅解密后的数据-->"+new String(decodeStr2,"UTF-8"));183 }184 }。
非对称密码算法概述
18
基于公钥密码的加密过程
Alice
Bob
19
基于公钥密码的鉴别过程
Alice
Bob
20
公钥密码体制的优缺点
❖ 优点:
▪ 解决密钥传递的问题 ▪ 大大减少密钥持有量 ▪ 提供了对称密码技术无法或很难提供的服务(数字
签名)
❖ 缺点:
▪ 计算复杂、耗用资源大 ▪ 非对称会导致得到的密文变长
21
取 k=4,则d= 77 公开(e,n)=(5,119),将d 保密,丢弃p, q。明文:
m=19
加密:
19 5≡ 66 mod 119 , c= 66
解密:
6677 mod 119 =?
11
RSA 算法的安全性和性能
攻击方法 ▪ 蛮力攻击:对所有密钥都进行尝试。 ▪ 数学攻击:等效于对两个素数乘积(n)的因子分解。
大数的因子分解是数论中的一个难题。
运算速度 ❖ 软件实现比DES 慢100倍 ❖ 硬件实现比DES慢1000倍
12
椭圆曲线密码体制
❖ 椭圆曲线上的离散对数问题
▪ 点Q和点P是有限域上的椭圆曲线的两个点,在等 式mP=P+P+…+P=Q中,已知m和点P求点Q比 较容易,反之已知点Q和点P求m却是相当困难的, 这个问题称为椭圆曲线上点群的离散对数问题。
ECC(Elliptic Cure Crytosystem),1985
▪ 基于有限域上椭圆曲线有理点群的密码系统 ▪ 更快的具有更小密钥长度的公开密码系统 ▪ 功能同RSA:数字签名,密钥管理,加密
6
RSA公钥密码体制
❖1977年由Ron Rivest、Adi Shamir和Len Adleman发明,1978年正式公布。 ❖RSA是一种分组加密算法。明文和密文在0~n-1 之间,n是一个正整数。 ❖该算法的数学基础是初等数论中的Euler(欧拉) 定理,并建立在大整数因子分解的困难性之上。 ❖目前应用最广泛的公钥密码算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.非对称加密算法的描述
非对称加密算法:
非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
算法介绍:
asymmetric encoding algorithm
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
[非对称加密算法]
非对称加密算法:
另一方面,甲方可以使用自己的私密钥对机密信息进行加密后再发送给乙方;乙方再用甲方的公钥对加密后的信息进行解密。
[1]
甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。
非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。
所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。
这样安全性就大了很多。
算法起源:
W.Diffie和M.Hellman 1976年在IEEE Trans.on Information刊物上发表了“ New Direction in Cryptography”文章,提出了“非对称密码体制即公开密钥密码体制”的概念,开创了密码学研究的新方向。
工作原理:
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。
其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
非对称加密算法与对称加密算法的区别:
首先,用于消息解密的密钥值与用于消息加密的密钥值不同;
其次,非对称加密算法比对称加密算法慢数千倍,但在保护通信安全方面,非对称加密算法却具有对称密码难以企及的优势。
为说明这种优势,使用对称加密算法的例子来强调:
Alice使用密钥K加密消息并将其发送给Bob,Bob收到加密的消息后,使用密钥K对其解密以恢复原始消息。
这里存在一个问题,即Alice如何将用于加密消息的密钥值发送给Bob?答案是,Alice发送密钥值给Bob时必须通过独立的安全通信信道(即没人能监听到该信道中的通信)。
这种使用独立安全信道来交换对称加密算法密钥的需求会带来更多问题:
首先,有独立的安全信道,但是安全信道的带宽有限,不能直接用它发送原始消息。
其次,Alice和Bob不能确定他们的密钥值可以保持多久而不泄露(即不被其他人知道)以及何时交换新的密钥值
当然,这些问题不只Alice会遇到,Bob和其他每个人都会遇到,他们都需要交换密钥并处理这些密钥管理问题(事实上,X9.17是一项DES密钥管理ANSI标准[ANSIX9.17])。
如果Alice要给数百人发送消息,那么事情将更麻烦,她必须使用不同的密钥值来加密每条消息。
例如,要给200个人发送通知,Alice需要加密消息200次,对每个接收方加密一次消息。
显然,在这种情况下,使用对称加密算法来进行安全通信的开销相当大。
非对称加密算法的主要优势就是使用两个而不是一个密钥值:一个密钥值用来加密消息,另一个密钥值用来解密消息。
这两个密钥值在同一个过程中生成,称为密钥对。
用来加密消息的密钥称为公钥,用来解密消息的密钥称为私钥。
用公钥加密的消息只能用与之对应的私钥来解密,私钥除了持有者外无人知道,而公钥却可通过非安全管道来发送或在目录中发布。
Alice需要通过电子邮件给Bob发送一个机密文档。
首先,Bob使用电子邮件将自己的公钥发送给Alice。
然后Alice用Bob的公钥对文档加密并通过电子邮件将加密消息发送给Bob。
由于任何用Bob 的公钥加密的消息只能用Bob的私钥解密,因此即使窥探者知道Bob的公钥,消息也仍是安全的。
Bob在收到加密消息后,用自己的私钥进行解密从而恢复原始文档。
二.如何在PKI认证中心申请数字签名
RKI:(Public Key Infrastructure)是一个提供安全服务的公钥基础设施。
PKI技术采用证书管理公钥,通过第三方的可信任机构即认证中心CA,把用户的公钥和用户的其他标识信息(如名称、e-mail、身份证号等)捆绑在一起,在Internet网上验证用户的身份。
数字证书是公开密钥体系(PKI)的一种密钥管理媒介,是一种权威的电子文档,形同网络环境中的一种身份证,用于证明某一主体(如组织机构、人、服务器等)的身份及其公开密钥的合法性,又称为数字ID。
数字证书是由权威公正的第三方机构即CA中心签发的,以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验
证,确保网上传递信息的机密性、完整性,以及交易实体身份的真实性。
流程:
4、如何申请证书?
从首页选择“用表格申请证书”。
如果证书“证书用途”选择“电子邮件保护证书”,“Email”必须填写实际使用的电子邮件地址,不能随便写,点击“保存”。