## 7. **非对称加密**
应该使用NaCl库
适用场景:当你需要加密消息,发给陌生人,并且对方异步接收消息,做离线解密时。这是一个很窄的应用案例,这种用法有个名字叫*电子信封(digital envelope)*,典型比如gpg加密文件后发送。
这条是几条之中最难做正确的,不要使用底层的密码学库,比如OpenSSL或者BouncyCastle。
你应该停止使用RSA,并且切换到椭圆曲线类体制,原因是:
* 对RSA的攻击能力的进步 —– 定义在传统质数域上的乘法运算(应用包括DH,DSA,ElGamal等),要比椭圆曲线域上的乘法运算快得多。这是由于质数域上数域筛法(number field sieve,NFS)的进展,而在椭圆曲线域上,没有NFS这类算法。
* RSA (和DH) 或迫使你考虑“向后兼容性”,而椭圆曲线体制没有这种兼容性包袱。TLS最近的几个安全漏洞,部分愿意也是由于这种向后兼容性,导致已经被破解的陈旧算法存在
* RSA在一般场景中,都是直接用公钥做非对称加密,这种用法丧失了**前向安全性(Perfect Forward Secrecy)**。而椭圆曲线就不提倡,也很难这样使用,这样你就不会害死自己了。
* 在椭圆曲线体制下,保证正确性和安全性的重任,主要由密码学家承担,密码学家会提供一组曲线参数,在某一性能水平下,针对安全性和性能做优化。这样程序员不容易误用而害死自己。在RSA体制下,正好相反,程序员必须提供参数来保证正确性和安全性,就算是RSA-OAEP这种很好的设计,程序员也必须知道怎么提供参数,这样程序员很容易搞错。
如果你必须使用RSA,一定要使用RSA-OAEP with SHA256,指数使用 65537
* 避免 RSA-PKCS1v15
* 避免 ElGamal
* 避免 RSA