2. 对称加密
2.1. 函数声明:
byte [] symEncrypt(byte[] plainData,byte[] password);
byte [] symDecrypt(byte[] cipherData,byte[] password);
2.2. 函数特性:
2.2.1. 加密和解密必须使用同样的密匙。
2.2.2. 相对于非对称加密速度快。
2.3. 应用举例:
2.3.1. 文件加密解密
不再赘述。
3.非对称加密
3.1函数声明:
class KeyPair //密钥对
{
byte [] privateKey //私钥
byte [] publicKey; //公钥
};
KeyPair generateKeyPair();//用于产生一个密钥对
byte[] asyEncrypt(byte[] plainData,byte[] publicKey); //用公钥对数据加密
byte[] asyDecrypt(byte[] cipherData,byte[] privateKey); //用私钥对公钥加密的数据解密
3.2. 函数特性:
3.2.1. 用公钥加密的数据,只能由对应的私钥解密。即他们都在由generateKeyPair产生的一个密钥对(KeyPair)里面。有时也用私钥加密,公钥解密。
3.2.2. 知道一个KeyPair的publicKey,以现在计算机的算力在短期内无法计算出它对应的privateKey。这个短期指的是至少几十年。
3.2.3. 非对称加密通常比对称加密慢很多。所以它通常只用来对密钥或摘要加解密,而不会用在长数据上。
3.3. 应用举例:
设计一个文件上传系统,要求所有终端上传的数据都经过加密,即使数据经过被窃听的网络,窃听者也无法获知数据内容。如果使用对称加密会发生什么:
1. 所有终端和服务器共享一个秘钥,任何一个终端泄露了秘钥,数据传输将不再安全。
2. 为每个终端分配一个秘钥,服务器保存每个终端的秘钥,从不同终端来的数据使用对应终端的秘钥来解密。这可以解决一个终端泄密,导致整个系统泄密的问题。但同样存在秘钥泄露的风险。
这时候使用非对称加密就解决了上面的所有问题。首先用generateKeyPair生成一个密钥对(KeyPair),将KeyPair的publicKey分配给所有终端,将KeyPair的privateKey安全保存在服务器。终端上传数据时使用asyEncrypt(byte[] plainData,byte[] publicKey)加密数据,服务器端用asyDecrypt(byte[] cipherData,byte[] privateKey)解密数据。因为公钥加密的数据只能通过对应的私钥来解密(特性3.2.1),所以数据即使在传播途中被窃听也是安全的,又因为特性3.2.2,即使所有人知道公钥,私钥也是安全的。
上述设计方案只是为了演示非对称加密方案的使用,在现实中一般不会这么做,因为特性3.2.3,这样会存在性能问题。所以一般会与对称加密组合使用,我们接着就要介绍这种用法。 |