1. 非对称密码学
非对称密码学(Asymmetric Cryptography) 中的 “非对称” 指的是用于加密数据的密钥和用于解密数据的密钥是不一样的(如果一样,那就是对称密码学)。对称密码学也称为共享密钥密码学。类似地,非对称密码学也有一个别称,即公钥密码学(Public Key Cryptography)。这是因为它使用一对公钥和私钥分别加密和解密数据。目前使用的非对称密码方案包括 RSA、DSA 和 EIGammal。
下图显示公钥密码学加密/解密的大致过程
上图显示的公钥密码学加密/解密过程大致如下:发送者使用接收者的公钥对明文数据 P 进行加密(E),生成密文数据 C,然后通过网络将发送给接收者。密文数据 C 到达接收方之后,接收者使用私钥将已加密的密文数据 C 馈送到解密函数 D 中进行解密,解密函数 D 将输出明文数据 P 。
这样,私钥保留在接收方,无须像对称密码学那样共享密钥即可执行加密和解密。
下图显示了接收者使用公钥加密来验证接收到的消息的完整性。在此模型中,发送方使用私钥对数据进行签名,然后将消息发送给接收者。接收者收到消息后,将通过发送者的公钥验证其完整性。
值得注意的是,此模型中没有执行加密和解密的过程。
在上图中可以看到,发送者使用私钥对明文数据 P 进行数字签名(签名函数 S),生成密文数据 C,该数据被发送到接收者,接收者使用发送者公钥和验证函数 V 验证密文数据 C ,以确保消息确实来自发送者。
公钥密码系统提供的安全机制包括密钥建立、数字签名、标识、加密和解密。
密钥建立机制(Key Establishment Mechanism) 与协议的设计有关,协议将允许在不安全的信道上建立密钥。
可以使用数字签名(Digital Signatures) 来提供不可否认服务,这在许多情况下都是非常理想的方式。
有时我们不仅要对用户进行身份验证,还要识别交易中涉及的实体,这可以通过数字签名和挑战应答协议( Challenge-Response Protocol) 的组合来实现。
最后,也可以使用公共密钥密码系统(如 RSA、ECC 和 EIGammal) 来获得提供机密性的加密机制。
公钥算法在计算方面比对称密钥算法慢,因此,它们不适用于大型文件的加密或实际数据的加密。它们通常用于交换对称算法的密钥。一旦安全地建立了密钥,就可以使用对称密钥算法对数据进行加密。
公钥加密算法基于各种基础数学函数。
1.1 整数分解
公钥密码学的安全源于基本的数学原理。公钥和私钥是有数学联系的,不然解密和签名操作就不可能实现,但是也不是由公钥算出私钥,如果可以算出来,那么加密的安全性就无从谈起。因此,公钥加密算法都是基于一些目前仍然无解的数学问题,也称为单向陷门函数(One-way Trapdoor Function),如整数分解或离散对数。
整数分解方案(Integer Factorization Scheme)就是基于大整数很难分解的事实,RSA 是此类算法的典型示例。
大整数分解究竟有多难呢?我们可以使用两个质数的乘积来创建所谓的半质数。半质数是最难分解的,在使用传统计算机的情况下,要将它分解为两个质数的乘积可能要花费超过四千万亿年的时间,这甚至比宇宙的寿命还要长很多。所以,基于整数分解的加密算法目前还是比较安全的。
1.2 离散对数
离散对数方案(Discrete Logarithm Scheme) 基于模运算中的问题。计算模函数的结果很容易,但是找到生成器(Generator) 的指数在计算上是不切实际的。换句话说,很难从结果中找到输入。离散对数正是目前仍然无解的数学问题之一,它也是一个单向陷门函数。
例如,考虑以下等式:
现在,在给定数字 9 的情况下,很难确定前面的方程中发现的结果为 2 (2 正是生成器 3 的指数)。在 Diffie-Hellman 密钥交换和数字签名算法中通常使用此难题。
Diffie-Hellman 密钥交换过程是非对称密钥交换的典型形式,以 Whitfield Diffie 和 Martin Hellman 的名字命名。
1.3 椭圆曲线
椭圆曲线算法(Elliptic Curve ALgorithm) 基于离散对数问题,但是,它是有限域上的椭圆曲线的代数。椭圆曲线是域上的代数三次曲线,可以通过以下公式定义。该曲线是非奇异的,这意味着它没有尖点或自相交。它具有两个变量 a 和 b,以及一个无穷大点。
在这里,a 和 b 是整数,其值是定义椭圆曲线的域的元素。可以在实数、有理数、复数或有限域上定义椭圆曲线。出于加密目的,可使用质数有限域上的椭圆曲线代替实数。此外,质数应大于3 。
通过改变 a 或 b 的值可以生成不同的曲线。
基于椭圆曲线最常用的密码系统是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm ECDSA) 和椭圆曲线密钥交换算法(Elliptic Curve Diffie-Hellman,ECDH)。
2. 公钥和私钥
私钥(Private Key), 顾名思义,是随机生成的数字,该数字是保密的,并由用户私下保存。私钥需要受到保护,不得对该私钥进行未经授权的访问;否则,整个公钥加密方案都会受到威胁,因为私钥是用于解密消息的密钥。私钥的长度可以不同,具体取决于所使用算法的类型和类别。例如,在RSA中,通常使用 1024 位或 2048 位的密钥。1024 位的密钥大小不再被认为是安全的,因此建议至少使用 2048 位的密钥。
公钥(Public Key) 可免费获得,并由私钥所有者发布。任何想要向公钥发布者发送加密消息的人都可以使用已发布的公钥对消息进行加密,然后将其发送给私钥的持有者。例如,A 有一对公钥和私钥,他可以将公钥发布出去,把私钥自己保存好。B 想要将消息发送给 A,他就可以使用 A 发布的公钥加密消息,然后将加密后的消息发送给 A,其他任何人都无法解密该消息,因为相应的私钥已由预期的接收者(A)安全地持有。接收到公钥加密的消息后,A 就可以使用私钥对消息进行解密。