在現代密碼學中,加密方法大緻可分為對稱密鑰加密(對稱加密)和公開密鑰加密(非對稱加密)。
一. 對稱加密(Symmetric-key algorithm,或對等加密: Reciprocal cipher )
對稱加密,即加密和解密使用同一個密鑰,或者知道一方密鑰能夠輕易計算出另一方密鑰。其解密(decryption)算法等同于加密算法,也就是說,要還原對等加密的密文,套用加密同樣的算法即可得到明文。
對稱加密的速度比非對稱加密快很多,在很多場合都需要對稱加密。
對稱加密又可分為分組密碼(分組加密)和流密碼(流加密)。
1. 分組密碼
分組密碼(Block cipher,又稱分塊密碼),是一種對稱密鑰密碼。它的特點是将明文分成多個等長的組,并用相同的密碼算法和密鑰對每組分别進行加密和解密。其中典型的如DES和AES作為美國政府核定的标準加密算法,應用領域從電子郵件加密到銀行交易轉帳,非常廣泛。
常見加密算法 AES · Blowfish · DES · 3DES · Serpent · Twofish
次常見加密算法 Camellia · CAST-128 · IDEA · RC2 · RC5 · SEED · Skipjack · TEA · XTEA
密碼設計 Feistel network · Key schedule · Product cipher · S-box · P-box · SPN
密碼分析 窮舉法 · Linear · Differential (Impossible · Truncated) · Integral · Boomerang · Mod n · Related-key · Slide · Rotational · Timing · XSL
密碼标準 AES process · CRYPTREC · NESSIE
1) DES:
資料加密标準(Data Encryption Standard)。DES是一種典型的塊密碼—一種将固定長度的明文通過一系列複雜的操作變成同樣長度的密文的算法。對DES而言,塊長度為64位。1976年被美國聯邦政府的國家标準局确定為聯邦資料處理标準(FIPS),随後在國際上廣泛流傳開來。在某些文獻中,作為算法的DES被稱為DEA(Data Encryption Algorithm,資料加密算法),以與作為标準的DES區分開來。
DES使用的密鑰表面上是64位的,然而隻有其中的56位被實際用于算法,其餘8位可以被用于奇偶校驗,并在算法中被丢棄。是以,DES的有效密鑰長度為56位,通常稱DES的密鑰長度為56位。
DES現在已經不是一種安全的加密方法,主要因為它使用的56位密鑰過短。在2001年,DES作為一個标準已經被進階加密标準(AES)所取代。另外,DES已經不再作為國家标準科技協會(前國家标準局)的一個标準。
2) 3DES(或稱為Triple DES):
是三重資料加密算法(TDEA,Triple Data Encryption Algorithm)的通稱。它相當于是對每個資料塊應用三次DES加密算法。由于計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。
3DES使用“密鑰包”,其包含3個DES密鑰,K1,K2和K3,均為56位(除去奇偶校驗位)。加密算法為:使用K1為密鑰進行DES加密,再用K2為密鑰進行DES“解密”,最後以K3進行DES加密。解密則為其反過程。
3) AES:
進階加密标準(Advanced Encryption Standard,AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密标準。這個标準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,進階加密标準由美國國家标準與技術研究院(NIST)于2001年11月26日釋出于FIPS PUB 197,并在2002年5月26日成為有效的标準。2006年,進階加密标準已然成為對稱密鑰加密中最流行的算法之一。
該算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijndael為名投稿進階加密标準的甄選流程。
AES的區塊長度固定為128 比特,密鑰長度則可以是128,192或256比特;加密過程中使用的密鑰是由Rijndael密鑰生成方案産生。
AES在軟體及硬體上都能快速地加解密,相對來說較易于實作,且隻需要很少的存儲器。作為一個新的加密标準,目前正被部署應用到更廣大的範圍。
4) Blowfish:
Blowfish是1993年布魯斯·施奈爾開發的對稱密鑰區塊加密算法,區塊長為64位,密鑰為1至448位的可變長度。與DES等算法相比,其處理速度較快。因為其無須授權即可使用,作為一種自由授權的加密方式在SSH、檔案加密軟體等被廣泛地使用。
5) Serpent:
Serpent 是 Ross Anderson, Eli Biham 和 Lars Knudsen 開發的塊加密算法. Serpent 可以使用不同的密鑰長度. Serpent 也是進階加密标準 (AES)的5個候選之一.
BestCrypt 以LRW模式使用 Serpent 算法, 256位密鑰, 128位塊大小和 32 次循環.
6) Twofish:
Twofish 加密算法由布魯斯·施奈爾(Bruce Schneier)帶領的項目組(John Kelsey, Chris Hall, Niels Ferguson, David Wagner 和 Doug Whiting)于1998年開發,可以看作是布魯斯·施奈爾1993年開發的Blowfish算法的延伸版本。技術上使用與Blowfish類似的計算方法,但是考慮到主要面向于網絡應用,提高了更大密鑰算法的速度。雖然敗給了 Rijndael 算法,但是在加密、解密速度方面具有一定的優勢。與Blowfish算法一樣,Twofish算法無須授權即可使用。
Twofish 的區塊長度為 128 位, 可以使用任意長度密鑰(一般為128、192、256位三種密鑰長度)。
BestCrypt 是使用完整的 16 次循環和最大可能的 256 位密鑰, 以 LRW 模式.
http://zh.wikipedia.org/wiki/Twofish_(%E5%AF%86%E7%A0%81%E5%AD%A6)
2. 流密碼
流密碼(stream cipher),又稱序列密碼,相對于區塊加密,流密碼是先制造一段任意長的鑰匙原料,與明文依位元或字元結合,有點類似一次一密密碼本(one-time pad)。輸出的串流根據加密時的内部狀态而定。在一些流密碼上由鑰匙控制狀态的變化。RC4是相當有名的流密碼。
在流密碼中,一般是将明文m寫成連續的符号,利用密鑰流中的第i個元素ki對應明文中的第i個元素mi進行加密,若加密變換為E,則加密後的密文為: c=Ek(m)=Ek1(m1)Ek2(m2)...Eki(mki)。設與加密變換E對應的解密變換為D,其中D滿足: Dki(Eki(mi))=mi,i=1,2,... 則通過解密運算可譯得明文為: m=Dk(c)=Dk1(Ek1(m1))Dk2(Ek2(m2))^=m1m2^,進而完成一次密碼通信.
1) RC4
RC4 是由RSA Security的Ron Rivest 在1987年開發出來的,雖然它的官方名是“Rivest Cipher 4”,但是首字母縮寫RC也可以了解為Ron's Code。RC4開始時是商業密碼,沒有公開發表出來,但是在94年9月份的時候,它被人匿名公開在了Cypherpunks 郵件清單上,很快它就被發到了sci.crypt 新聞討論區上,随後從這兒傳播到了網際網路的許多站點。随之貼出的代碼後來被證明是很有水準的,因為它的輸出跟取得了RC4版權的私有軟體的輸出是完全的。由于算法已經公開,rc4也就不再是商業秘密了,隻是它的名字“RC4”仍然是一個注冊商标。RC4經常被稱作是“ARCFOUR”或者"ARC4"(A lleged RC4,所謂的RC4,因為RSA從來沒有官方公布這個算法),這樣來避免商标使用的問題。它已經成為一些廣泛使用的協定和标準的一部分,比如,包括WEP和WPA的無線網卡和TLS。讓它如此廣泛分布和使用的主要因素是它不可思議的簡單和速度,不管是軟體還是硬體,實作起來都十分容易。
http://luck-donkey.iteye.com/blog/513069
http://baike.baidu.com.cn/view/904005.htm
http://wzgyantai.blogbus.com/logs/31867065.html
二. 非對稱加密
公開密鑰加密(public-key cryptography,也稱為非對稱(密鑰)加密),該思想最早由雷夫·莫寇(Ralph C. Merkle)在1974年提出],之後在1976年,狄菲(Whitfield Diffie)與赫爾曼(Martin Hellman)兩位學者以單向函數與單向暗門函數為基礎,為發訊與收訊的兩方建立金鑰。
非對稱密鑰,是指一對加密密鑰與解密密鑰,這兩個密鑰是數學相關,用某使用者密鑰加密後所得的資訊,隻能用該使用者的解密密鑰才能解密。如果知道了其中一個,并不能計算出另外一個。是以如果公開了一對密鑰中的一個,并不會危害到另外一個的秘密性質。稱公開的密鑰為公鑰;不公開的密鑰為私鑰。
如果加密密鑰是公開的,這用于客戶給私鑰所有者上傳加密的資料,這被稱作為公開密鑰加密(狹義)。例如,網絡銀行的客戶發給銀行網站的賬戶操作的加密資料。
如果解密密鑰是公開的,用私鑰加密的資訊,可以用公鑰對其解密,用于客戶驗證持有私鑰一方釋出的資料或檔案是完整準确的,接收者由此可知這條資訊确實來自于擁有私鑰的某人,這被稱作數字簽名,公鑰的形式就是數字證書。例如,從網上下載下傳的安裝程式,一般都帶有程式制作者的數字簽名,可以證明該程式的确是該作者(公司)釋出的而不是第三方僞造的且未被篡改過(身份認證/驗證)。
常見的公鑰加密算法有: RSA、ElGamal、背包算法、Rabin(Rabin的加密法可以說是RSA方法的特例)、Diffie-Hellman (D-H) 密鑰交換協定中的公鑰加密算法、Elliptic Curve Cryptography(ECC, 橢圓曲線加密算法)。使用最廣泛的是RSA算法,是著名的公開金鑰加密算法,ElGamal是另一種常用的非對稱加密算法。
1) RSA:
RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。
至今為止還沒有人找到一個多項式時間的算法來分解一個大的整數的因子,同時也還沒有人能夠證明這種算法不存在。
對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。
到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。隻要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被解破的。但在分布式計算和量子計算機理論日趨成熟的今天,RSA加密安全性受到了挑戰。
比起DES和其它對稱算法來說,RSA要慢得多。實際上人們一般使用一種對稱算法來加密資訊,然後用RSA來加密比較短的對稱密碼,然後将用RSA加密的對稱密碼和用對稱算法加密的消息傳送給接收方。這樣一來對随機數的要求就更高了,尤其對産生對稱密碼的要求非常高,因為否則的話可以越過RSA來直接攻擊對稱密碼。SSL 協定目前就是這麼做的。
2) ElGamal:
ELGamal 是T.ElGamal在1985年提出的公鑰加密方法。它的安全性是基于求解離散對數問題的困難性,是RSA以後比較有希望的一個公鑰密碼算法。美國的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法就是經ElGamal算法演變而來。目前DSA算法應用也非常廣泛。
ElGamal 的加密和解密是一個單向的過程,雖然密鑰對構造簡單,但是隻是一方向另外一方單向傳送資料進行加解密,不能反向操作,這一點不同于RSA。
另外,ElGamal不足之處就是密文會成倍增長。
一、資料加密的三種方式;
1、對稱加密;加密與解密方使用同一個算法, 将資料切割成資料塊逐漸加密,并且前後塊之間有關聯關系,被稱為塊量,解密就是拿到塊量做運算,進行解密。
常用的對稱加密算法有:
DES(56bits), 3DES, AES(128bits), Blowfish
Twofish, IDEA, RC6, CAST5, Serpent
特點;加密與解密使用同一個密碼
将原文分割成固定大小資料塊,對這些資料塊進行加密
加密數度快
缺點;密碼傳輸,安全性不高
密碼太多,不易于記憶
2、公鑰加密(也稱非對稱加密);與對稱加密算法的主要差别在于,加密和解密的密鑰不相同,一個公開(公鑰),一個保密(私鑰)。解決了對稱加密算法密鑰配置設定管理的問題,提高了算法安全性。
非對稱算法有;RSA、EIGamal、DSA
特性;發送方資料傳輸時是用接收方的公鑰加密,接收方用自己的私鑰解密。
身份認證是發送方用自己的私鑰加密,接收方用對方的公鑰解密以此來保證資料安全性。
缺點;非對稱加密算法的加密、解密的效率比較低。
3、單向加密,對資料按照一定和算法生成特征碼,具有不可逆性。
抽取資料特征碼的算法有;MD5, SHA1, SHA512, CRC-32
消息認證算法;CBC-MAC、HMAC
特性;
消息認證;隻用于驗證消息本身,需要加密特征碼。
雪崩效應;輸入資料的微小改變,會導緻結果大的變化。
定長輸出;無任輸入資料多長,隻要使用同一種單向加密算法,輸出結果的長度都相同。
結合以上三種加密方法:如下圖所示;

上圖所示,把三種加密算法結合起來使用,對稱加密實作了資料的機密性,公鑰加密實作身份認證,而單向加密則實作了資料的完整性。
資料的加密和解密
同一主機内的程序間的通信
signal發送信号
共享記憶體
semaphore
message queue MQ RAbbitMQ
不同主機之間的程序間通信
套接字對 socket-pair
三種類型的socket
流套接字(socket_stream),基于TCP協定通信的套接字
資料報套接字(socket_dgram),基于UDP協定通信的套接字
裸套接字,原始套接字(socket_raw),基于底層協定通信的套接字
套接字socket:IP:PORT
程序的位址辨別
一個套接字就是指某個特定主機上的特定應用程式;
大多數情況下,網絡通信都是從用戶端到伺服器的通信;對于伺服器來說,必須要有套接字的監聽模式,即程序的監聽模式,而通常來講,把具有這種監聽模式的程序,稱為守護程序,或者服務程序
服務程序所監聽的套接字資源,是在其啟動之前核心申請注冊得到的;而且,饒潔子資源是所有服務進成都站、套接字資源是所有的服務程序獨占的資源,具有排他性
端口号:
0:預設沒有被使用
1~1023:well-known衆所周知的端口 固定的端口
1024~49151:注冊端口
Mysql:3306
mymcached:11211
tomcat:8091
49152~65535:動态端口 為用戶端提供的随機選擇端口
安全實作的目标
機密性:confidentiality,保證資訊不洩露
完整性:integrity,保證資訊不被篡改
可用性:availability,保證資訊内在價值
威脅安全的行為
威脅機密性的攻擊行為
竊聽
嗅探
掃描
通信量分析
威脅完整性的攻擊行為
更改
僞裝
重放
否認
威脅可用性的攻擊行為
拒絕服務(DoS)
安全解決方案
技術:加密解密:
傳統的加密方法:置換、替代加密算法
現代的加密方法:塊加密算法
服務:安全服務
身份認證:
通路控制機制:
加密方案
加密算法和密鑰
加密算法
對稱加密算法
公鑰加密算法
單項加密算法
密鑰交換算法
對稱加密算法:
加密和解密使用同一種密鑰
特性:
1.每對通信主機都需要有一個相同密鑰,用于加密和解密
2.将原始資料分隔成固定大的塊,逐個加密
3.加密解密的速度比較快
缺陷
1.加密解密所需要保有的密鑰數量過多
2.密鑰分發過于困難
主流加密算法
DES:DAta Encryption Standard 資料加密标準
56bit密鑰 64bit塊
3DES:triple DES
AES:Advanced Encryption Standard 進階加密标準
AES128bit AES192bit AES256bit
Twofish
Blowfish
IDEA
RC4 RC6
公鑰加密算法
密鑰分為私鑰和由私鑰抽取生成的公鑰組成
私鑰:512bit 1024bit 2048bit 4096bit 8192bit 16384bit
特點
1.使用密鑰對來進行加密和解密;使用私鑰加密的資料必須用與之相對的公鑰解密;使用公鑰解密,必須使用與之相對的私鑰才能解密
私鑰是通過特定的工具建立生成,由使用者自己留存,務必儲存其私密性secret key 或 private key
公鑰:從私鑰中提取生成,公鑰可以公開給所有人使用,public key
2.密鑰長度都比較長,加密之後的資料安全等級較高
缺陷:
1.加密資料的時候,消耗的系統資源和時間較多,很少用來加密大批量資料;
用途
數字簽名:主要用于讓接收方确認發送方的身份;使用發送方的私鑰加密資料到了接收方之後使用發送方的公鑰解密資料;
密鑰交換:發送資料方使用接收方的公鑰加密,對稱密鑰,把加密以後的對稱密鑰發送給對方;
資料加密:通常用于加密小資料
常用的公鑰加密算法
RSA:加密,數字簽名
DSA:Digital Signature Algorithm數字簽名算法,隻能實作數字簽名的功能,有時候該算法也被稱為DSS,Digital Signature Standard
ELgamal:收費
單項加密算法
隻能進行加密,不能解密,從已知的資料中提取密碼指紋
特性
1.定長輸出
2.雪崩效應
功能:保證資料的完整性;
常用算法:
md5:Message Digest Version 5 資訊摘要算法第5版
128bit定長輸出
sha系列:
sha-1 160bit 安全的雜湊演算法 secure hash algorithm
sha224
sha256
sha384
sha512
密鑰交換算法 IKE (Internet key exchange)
公鑰算法
DH算法Deffie-Hellman
加密算法的聯合應用
1.通信雙方互相交換證書,并到信任的CA進行證書認證
2.發送方使用某種對稱加密算法對資料進行加密;對加密後的資料使用單項加密計算其特征值;發送方再用自己的私鑰加密此特征值,以證明資料來源的可靠,發送方使用接受方的證書加密對稱密鑰;
3.接收方在收到資料之後,先使用自己的私鑰解密對稱密鑰,使用發送方的公鑰解密特征值,在利用相同的單項加密算法重新計算加密資料的特征值,比較兩個特征值;如果特征值一緻表明資料完整;再用解密出來的密鑰解密出原始資料;
國際标準化組織(ISO)定義勒令證書的結構和認證标準 X.509協定标準
證書裡面主要包括
擁有者的名稱
擁有者所送出的密鑰
有效期;
證書的版本号
證書的序列号
簽發算法的ID
簽發CA的名稱
主題名稱
發證者的唯一辨別符
發證者的數字簽名
擴充資訊
PKI:Public Key Infrastructure,公鑰基礎設施;
證書的簽證機構:CA
注冊機構:RA
證書吊銷清單:CRL,Certification Revoke List;
證書存取庫:CAB,Certification Access Base;
CA如何發揮其作用的:
1.通信雙方交換證書;
2.雙方協商加密算法;
3.雙方驗證證書的真僞;
4.用CA的公鑰解密證書中CA的簽名,能解密說明證書來源可靠;
5.用通用的加密算法加密證書,取得特征值;與解密出來的特征值比較,如果相同,說明證書完整性可靠;
6.檢查證書的有效期是否在合法時間範圍,如果過期則證書不被認可;
7.檢查證書的主體名稱和此次通信的目标是否能夠對應;
SSL:Secure Socket Layer,安全的套接字層;
1994年,Netscape(網景)公司最先聲明并實施;
SSL V1.0
SSL V2.0
SSL V3.0
TLS:Transport Layer Security,傳輸層安全;
IETF:Internet Engineering Task Force,網際網路工程項目小組;
1999年提出;
TLS V1.0
2006年,TLS V1.1
2008年,TLS V1.2草案,将橢圓曲線加密算法引入TLS;
分層設計:
1.最底層:基礎算法的原語的實作;AES,md5,sha……
2.向上一層:各種算法的基本實作;
3.再向上一層:各種算法組合實作的半成品;
4.最高層,用各種元件拼裝而成的各種成品密碼學協定軟體;
SSL/TLS的handshake(握手)的四個階段:
1.用戶端向伺服器索要證書并驗證證書;
Client Hello發送的資訊内容:
支援的協定的版本,如:TLS V1.2;
用戶端生成一個随機數,稍後用于生成會話密鑰;
支援的加密算法,如:AES,DES,RSA等;
支援的壓縮算法;
2.雙方協商生成會話密鑰;
Server Hello發送的資訊内容:
确認使用的加密協定的版本号,如:TLS V1.2;
伺服器生成一個随機數,稍後用于生成會話密鑰;
确認加密算法及壓縮算法;
3.雙方采用已經生成的會話密鑰進行安全加密的通信;
用戶端驗證伺服器證書,在确認無誤後,取出其公鑰;
驗證伺服器證書需要驗證下述内容:
驗證發證機構(CA);
驗證證書的完整性;
驗證證書的持有者資訊;
驗證證書的有效期;
驗證證書的吊銷清單;
用戶端發送資訊給伺服器端:
一個随機數,用于伺服器上的公鑰加密;
編碼格式變更通知,表示随後的資訊都将用雙方已經協商好的加密算法和密鑰進行加密發送;
用戶端握手結束;
4.雙方互相通告握手結束的資訊;
伺服器收到用戶端發送來的此次握手階段的第三個随機數Pre-Master_key;計算生成本次會話所用到的會話密鑰,向用戶端發送相關資訊:
編碼變更通知,表示随後的資訊都将用雙方已經協商好的加密算法和密鑰進行加密發送;
伺服器端握手結束;