A. 椭圆加密算法公钥密码系统的加密算法ECC与RSA的对比
在第六届国际密码学会议上,针对公钥密码系统的加密算法,推荐了两种主要方法:RSA和ECC。RSA算法基于大整数因子分解问题(IFP),其数学原理相对直观,易于工程实践。然而,它的安全性稍逊一筹,特别是面对国际上广泛应用的NFS攻击法,破译复杂度为亚指数级,这意味着需要较长的密钥才能保证同等安全强度。
相比之下,ECC算法依赖于椭圆曲线上离散对数计算问题(ECDLP),其理论基础深奥,实施起来较为复杂。尽管如此,ECC的单位安全强度相对较高。针对ECC的最有效攻击手段Pollard rho方法,其破解难度达到指数级,这使得ECC在保证安全性的前提下,所需的密钥长度远小于RSA(参见表1和图1)。
正是这种不同,使得ECC在提升安全强度时,无需过多增加密钥长度,从而有效解决了增加密钥长度可能带来的工程实现挑战。因此,ECC在保持安全性和实际应用性之间找到了一个理想的平衡点。
(1)公钥加密体制中的算法扩展阅读
椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。
B. 公开密钥密码体制的典型算法是什么
公开密钥密码体制是现代密码学中最受欢迎的密码机制之一。其核心思想是在公开和私人密钥的帮助下保护数据的机密性和完整性。 公开密钥密码体制的典型算法就是RSA算法。
RSA算法是一种最常见的非对称密码算法,其基于非常复杂的数学问题,因此被认为是一种安全可靠的加密机制。该算法需要两个密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。其加密过程如下:
1. 选择两个足够大的质数p和q,并将它们相乘产生一个大的正整数n。n即为密钥长度。
2. 根据p和q计算出n的欧拉函数总值,即φ(n) = (p-1) * (q-1)。
3. 在φ(n)内随机选择一个较小的整数e,使得e和φ(n)互质。
4. 计算e的模反元素d,使得(e * d) mod φ(n) =1。d即为私钥。
5. 公钥为(n,e),私钥为(d)。
6. 对于任何消息M,计算它的整数表示m。
7. 将m加密为一个整数c,公式为c = m^e mod n。
8. 对于解密过程,使用私钥d,将加密得到的c对应到明文m。
目前,RSA算法已被广泛应用于金融、电子商务、数学学科和科学研究等领域。 另外,随着计算机性能的提高、量子计算机的发展,RSA算法在未来的密码学应用中仍然有很大的潜力和发展前景。
C. RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密
我们来回顾一下RSA的加密算法。我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法。
RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。
(PK, SK)\leftarrow KeyGen(\lambda)。密钥生成算法以安全常数\lambda作为输入,输出一个公钥PK,和一个私钥SK。安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关。\lambda越大,质数p一般越大,保证体制有更高的安全性。在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质数p和q,计算N=pq。随后,算法计算欧拉函数\varphi(N)=(p-1)(q-1)。接下来,算法随机选择一个小于\varphi(N)的整数e,并计算e关于\varphi(N)的模反元素d。最后,公钥为PK=(N, e),私钥为SK=(N, d)。
CT \leftarrow Encrypt(PK,M)。加密算法以公钥PK和待加密的消息M作为输入,输出密文CT。在RSA中,加密算法如下:算法直接输出密文为CT=M^e \mod \varphi(N)
M \leftarrow Decrypt(SK,CT)。解密算法以私钥SK和密文CT作为输入,输出消息M。在RSA中,解密算法如下:算法直接输出明文为M=CT^d \mod \varphi(N)。由于e和d在\varphi(N)下互逆,因此我们有:CT^d=M^{ed}=M\mod \varphi(N)
所以,从算法描述中我们也可以看出:公钥用于对数据进行加密,私钥用于对数据进行解密。当然了,这个也可以很直观的理解:公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。否则大家都能看到私钥,就都能解密,那不就乱套了。
=================分割线=================
我们再来回顾一下RSA签名体制。签名体制同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。
(PK,SK) \leftarrow KeyGen(\lambda)。密钥生成算法同样以安全常数\lambda作为输入,输出一个公钥PK和一个私钥SK。在RSA签名中,密钥生成算法与加密算法完全相同。
\sigma \leftarrow Sign(SK,M)。签名算法以私钥SK和待签名的消息M作为输入,输出签名\sigma。在RSA签名中,签名算法直接输出签名为\sigma = M^d \mod \varphi(N)。注意,签名算法和RSA加密体制中的解密算法非常像。
b \leftarrow Verify(PK,\sigma,M)。验证算法以公钥PK,签名\sigma以及消息M作为输入,输出一个比特值b。b=1意味着验证通过。b=0意味着验证不通过。在RSA签名中,验证算法首先计算M'=\sigma^e \mod \varphi(N),随后对比M'与M,如果相等,则输出b=1,否则输出b=0。注意:验证算法和RSA加密体制中的加密算法非常像。
所以,在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。
=================分割线=================
那么,为什么题主问这么一个问题呢?我们可以看到,RSA的加密/验证,解密/签字过程太像了。同时,RSA体制本身就是对称的:如果我们反过来把e看成私钥,d看成公钥,这个体制也能很好的执行。我想正是由于这个原因,题主在学习RSA体制的时候才会出现这种混乱。那么解决方法是什么呢?建议题主可以学习一下其他的公钥加密体制以及签名体制。其他的体制是没有这种对称性质的。举例来说,公钥加密体制的话可以看一看ElGamal加密,以及更安全的Cramer-Shoup加密。签名体制的话可以进一步看看ElGamal签名,甚至是BLS签名,这些体制可能能够帮助题主更好的弄清加密和签名之间的区别和潜在的联系。
至于题主问的加密和签名是怎么结合的。这种体制叫做签密方案(SignCrypt),RSA中,这种签密方案看起来特别特别像,很容易引起混乱。在此我不太想详细介绍RSA中的加密与签字结合的方案。我想提醒题主的是,加密与签字结合时,两套公私钥是不同的。