2.3 非对称密码体系
上述加密和解密是用同一个密码,称为对称密码。与之对应的是加密和解密用不同的密码,而这两个密码又是相关的,称为非对称密码。密码常被称为密钥(从形象上看有钥匙之功能)。
2.3.1 快!来不及了
加密的目的是防止敌方破解密文、获得明文。我们知道,密文是有有效期的,比如战场上的密文,有效期不会长于战争时间。基于有效期的观点,加密的目的可以修改为:在一定的时间里敌方不能破解密文。进一步地,在一定的时间或一定的范围内,敌方不能破解密文。
如果把敌方视作参加考试的学生,只要“数学难题”相当难,那么在规定的两个小时内,考生就解不出来,只有知道“提示”(密钥)的考生能解出来(解密),这就是将数学难题用于密码学的出发点。
数学家设计的用于密码学的“数学难题”必须符合“答案存在,验证容易,很难解答”,不知道答案的通常要暴力破解,但范围太大,在规定的时间内完成不了求解任务。这类“数学难题”通常被称为“单向陷门函数”,如图2.1所示,恰似交通的“单行道”(验证容易),逆行过“门”(密钥开锁),暴力开锁“来不及”(很难解答)。
图2.1 单行道
比如,整数因子分解困难问题:假设已知一个大整数的数值,且为两个大素数之积,但不知道这两个大素数的具体数值,如何将这个大整数进行因数分解。
(1)你不妨试试,求17位整数48770428433377171的一个因子,答案在本章小结处。
(2)《科学美国人》杂志,1977年悬赏征求某个129位整数的素数因子分解。直到17年后的1994年,有人在互联网上用600台计算机协同工作8个月才解出。
2.3.2 RSA三人首功
1977年,麻省理工学院的三位学者用整数因子分解困难问题发明了一种非对称密钥系统,他们以三人名字的首字母将该密码系统命名为RSA。
(1)随机选取两个大素数p和q;
(2)计算乘积n=p×q和欧拉函数φ(n)=(p-1)×(q-1);
(3)随机选取一整数e,使其小于φ(n)且与φ(n)互素;
(4)求解d满足d×e=1 modφ(n);
(5)销毁p和q,保密e,公开d和n;
则该算法以参数n生成了私钥d和公钥e。
设消息为M(依某种方式转换成了整数)需要生成密文C,则有加密与解密公式如下:
加密公式:
C=Memodn
解密公式:
M=Cdmodn
在非对称密钥体系中,有两个密钥<公钥,私钥>,其中,私钥是秘密的,而公钥是公开的,从私钥可以算出公钥,但反之不行。非对称密钥体系有三个算法:公钥生成算法(私钥可视为随机数)、加密算法和解密算法。
2.3.3 椭圆曲线密码体系
上述非对称密钥属于公钥密码学,公钥密码算法总是基于一个数学难题而设计的,目前,广泛使用的ECC(Elliptic Curve Cryptography,椭圆曲线密码)基于的是椭圆曲线离散对数问题:若已知椭圆曲线上的两个点P和Q满足关系Q=KP,要求出整数K。
椭圆曲线公钥体系的最大好处是密钥短,在同等安全强度下,RSA与ECC的密钥长度的比值,随着长度的增加而增加,1024bit的RSA对应106bit的ECC,长度比值为7∶1;2048bit的RSA对应210bit的ECC,长度的比值为10∶1;21000bit的RSA对应600bit的ECC,长度的比值为35∶1。
ECC将逐步取代RSA,成为非对称密钥领域的主力军,我国在2010年颁布了我们自己的ECC算法标准《SM2椭圆曲线公钥密码算法》。
2.3.4 加密与解密
在非对称密钥体系中,每个人都有自己的一对密钥,即<公钥,私钥>,保管好私钥,公开公钥。
如图2.2所示,A向B发信息M时,A用B的公钥加密,B用自己的私钥解密,只要B保管好自己的私钥,那么别人就解不了密。
图2.2 加密和解密
注意:A是用B的公钥加密原文的,A持有B的公钥以及自己的公钥与私钥。我们看看其他情况:
A用自己的公钥加密,对方B无A的私钥,故此加密只有A能解密,因此,该方法不能用于数据传输,但可用于对数据的加密存储。
A用自己的私钥加密,对方B用A的公钥解密,但其他人C也可用A的公钥解密,因此,该方法不能用于数据传输,但可用于对数据的数字签名。
2.3.5 数字签名
在A与B的关系中,A拥有三把密钥:B的公钥和自己的公钥、私钥。A将它们作用于数据M上,分别用于数据传输、数据存储和数字签名。下面讨论数字签名。
A将自己的私钥作用于M上,生成的密文可由A的公钥解密,而A的公钥是周知的,各方“能且只能”用A的公钥来解密,这一点可以确认该密文是A生成的,起了身份确认的作用,这就像我们日常生活中的手书签名的作用,因此,我们将A用自己的私钥作用于信息M,称为A对M进行数字签名。
在商务活动中,需要当事人签名,现在法律层面也认可了数字签名,数字签名又叫电子签名。
比较一下,非对称加密和签名,详见表2.2。
表2.2 加密与签名
(1)解密与签名对应,都是用自己的私钥,反过来说,使用自己的私钥,要么是解密,要么是签名;
(2)加密与验证对应,都是用别人的公钥,反过来说,使用别人的公钥,要么是加密,要么是验证。