原鏈接:http://www.cnblogs.com/yangywyangyw/archive/2012/07/31/2620861.html
加 密算法通常分為對稱性加密算法和非對稱性加密算法,對於對稱性加密算法,信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是對數據進行 加解密了。非對稱算法與之不同,發送雙方A,B事先均生成一堆密匙,然后A將自己的公有密匙發送給B,B將自己的公有密匙發送給A,如果A要給B發送消 息,則先需要用B的公有密匙進行消息加密,然后發送給B端,此時B端再用自己的私有密匙進行消息解密,B向A發送消息時為同樣的道理。
幾種對稱性加密算法:AES,DES,3DES
DES是一種分組數據加密技術(先將數據分成固定長度的小數據塊,之后進行加密),速度較快,適用於大量數據加密,而3DES是一種基於DES的加密算法,使用3個不同密匙對同一個分組數據塊進行3次加密,如此以使得密文強度更高。
相較於DES和3DES算法而言,AES算法有着更高的速度和資源使用效率,安全級別也較之更高了,被稱為下一代加密標准。
幾種非對稱性加密算法:RSA,DSA,ECC
RSA和DSA的安全性及其它各方面性能都差不多,而ECC較之則有着很多的性能優越,包括處理速度,帶寬要求,存儲空間等等。
幾種線性散列算法(簽名算法):MD5,SHA1,HMAC
這幾種算法只生成一串不可逆的密文,經常用其效驗數據傳輸過程中是否經過修改,因為相同的生成算法對於同一明文只會生成唯一的密文,若相同算法生成的密文不同,則證明傳輸數據進行過了修改。通常在數據傳說過程前,使用MD5和SHA1算法均需要發送和接收數據雙方在數據傳送之前就知道密匙生成算法,而HMAC與之不同的是需要生成一個密匙,發送方用此密匙對數據進行摘要處理(生成密文),接收方再利用此密匙對接收到的數據進行摘要處理,再判斷生成的密文是否相同。
對於各種加密算法的選用:
由於對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定着他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。
在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。
如果在選定了加密算法后,那采用多少位的密鑰呢?一般來說,密鑰越長,運行的速度就越慢,應該根據的我們實際需要的安全級別來選擇,一般來說,RSA建議采用1024位的數字,ECC建議采用160位,AES采用128為即可。
對於幾種加密算法的內部實現原理,我不想研究的太透徹,這些問題就留給科學家們去研究吧。而對於其實現而言,網上有很多開源版本,比較經典的是PorlaSSL(官網:http://en.wikipedia.org/wiki/PolarSSL )。其它語言如JAVA,OBJC也都有相應的類庫可以使用。以下附上自己用OC封裝的通用加密類:
RSA
https://www.cnblogs.com/techliang666/p/9164855.html
1. 生成原始 RSA私鑰文件 private_key.pem
openssl genrsa -out private_key.pem 1024
2. 將原始 RSA私鑰轉換為 pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out rsa_private_key.pem
3. 生成 RSA公鑰 rsa_public_key.pem
openssl rsa -in private_key.pem -pubout -out rsa_public_key.crt
4. 從公鑰 rsa_public_key.pem 獲取十六進制的公鑰(第一段16進制字符串)
openssl asn1parse -out temp.ans -i -inform PEM<private_key.pem
最終獲取文件列表:
rsa_private_key.pem
rsa_public_key.crt
16進制公鑰字符串用於js端加密