## 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