數據加密又稱password學,它是一門歷史悠久的技術。指經過加密算法和加密密鑰將明文轉變爲密文,而解密則是經過解密算法和解密密鑰將密文恢復爲明文。數據加密眼下還是計算機系統對信息進行保護的一種最可靠的辦法。算法
它利用password技術對信息進行加密,實現信息隱蔽,從而起到保護信息的安全的做用。數組
數據加密是指經過加密算法和加密密鑰將明文轉變爲密文。而解密則是經過解密算法和解密密鑰將密文恢復爲明文。它產生的歷史至關久遠。它是起源於要追溯於公元前2000年(幾個世紀了),儘管它不是現在咱們所講的加密技術(甚至不叫加密),但做爲一種加密的概念,確實早在幾個世紀前就誕生了。安全
當時埃及人是最早使用特別的象形文字做爲信息編碼的,隨着時間推移,巴比倫、美索不達米亞和希臘文明都開始使用一些方法來保護他們的書面信息。其最基本方法是易位法和置換法。其模型如右圖。 網絡
加密技術包含兩個元素:算法和密鑰。算法是將普通的文本(或者可以理解的信息)與一串數字(密鑰)的結合。產生不可理解的密文的步驟,密鑰是用來對數據進行編碼和解碼的參數。函數
不知不覺中,現實生活中。咱們也在使用加密的技術。好比:藏頭詩:優化
新雁才聞一兩聲編碼
年年長是惹東風加密
快箭拂下西飛鵬spa
樂不專注須鏘鏗操作系統
電報:
電報收下來通常都是數碼好比一份報是1234 2234 3234…依據手裏的password本用來解密,而且這個password本是要每隔必定時間就要換一本的。這在事前收發兩方就已有約定,什麼時間換什麼本。 收下一份報,首先要依據另一份password把報轉成真碼,比方1相應2,2相應3…3相應4 原報文處理成例如如下2345,3345, 4345…固然這僅僅是打比方。而後再利用password本,依據password本上的解密方法。比方2345相應「我想」,3345相應「要吃」。4345相應「雞腿」…合起來就是我想要吃雞腿,你看這過程當中沒了password本。特務即便拿下原報文1234也沒辦法。
這些,都是現實中加密樣例。
1. 數據保密性
保密性:指防止非法受權用戶得到實用信息。
現時生活有對應的樣例,好比,你要將一個祕密事情告訴別人,故而要將這個事情悄悄的告訴別人。這樣能夠防止非法用戶獲取受權。數據加密也是基於這種特性。
2. 數據完整性
完整性:指信息沒有被非受權用戶更改和破壞,包含信息在生成、傳輸、存儲中不被刪除、篡改、僞造等。
好比,古代皇帝。下詔的時候。需要筆記和皇英,就是爲了保證數據的完整性。
3. 不可抵賴性
不可抵賴性:指實體沒法否定或抵賴之前發送、接受某信息或參與網絡信息交互活動的事實。古代的簽字畫押,也是這種原理把。
1. Hash算法
hash算法的意義在於提供了一種高速存取數據的方法,它用一種算法創建鍵值與真實值之間的相應關係,(每一個真實值僅僅能有一個鍵值,但是一個鍵值可以相應多個真實值),這樣可以高速在數組等條件中裏面存取數據.
2. MD5算法
MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法)。在90年代初由MITLaboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest開發出來。經MD2、MD3和MD4發展而來。它的做用是讓大容量信息在用數字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個隨意長度的字節串變換成必定長的大整數)。不管是MD2、MD4仍是MD5,它們都需要得到一個隨機長度的信息併產生一個128位的信息摘要。儘管這些算法的結構或多或少有些類似,但MD2的設計與MD4和MD5全然不一樣。那是因爲MD2是爲8位機器作過設計優化的,而MD4和MD5倒是面向32位的電腦。
這三個算法的描寫敘述和C語言源碼在Internet RFCs 1321中有具體的描寫敘述(http://www.ietf.org/rfc/rfc1321.txt),這是一份最權威的文檔,由Ronald L. Rivest在1992年8月向IEFT提交。
Van Oorschot和Wiener之前考慮過一個在散列中暴力搜尋衝突的函數(Brute-Force HashFunction),而且他們推測一個被設計專門用來搜索MD5衝突的機器(這臺機器在1994年的制形成本大約是一百萬美圓)可以平均每24天就找到一個衝突。但單從1991年到2001年這10年間。竟沒有出現替代MD5算法的MD6或被叫作其它什麼名字的新算法這一點。咱們就可以看出這個瑕疵並無太多的影響MD5的安全性。
上面所有這些都不足以成爲MD5的在實際應用中的問題。而且,由於MD5算法的使用不需要支付不論什麼版權費用的。因此在通常的狀況下(非絕密應用領域。
但即使是應用在絕密領域內,MD5也不失爲一種很優秀的中間技術),MD5怎麼都應該算得上是很安全的了。
算法的應用
MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。比方,在UNIX下有很是多軟件在下載的時候都有一個文件名稱一樣,文件擴展名爲.md5的文件。在這個文件裏一般僅僅有一行文本,大體結構如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
這就是tanajiya.tar.gz文件的數字簽名。
MD5將整個文件看成一個大文本信息。經過其不可逆的字符串變換算法,產生了這個惟一的MD5信息摘要。
假設在之後傳播這個文件的過程當中,無論文件的內容發生了不論什麼形式的改變(包含人爲改動或者下載過程當中線路不穩定引發的傳輸錯誤等),僅僅要你對這個文件又一次計算MD5時就會發現信息摘要不一樣樣,由此可以肯定你獲得的僅僅是一個不對的文件。假設再有一個第三方的認證機構,用MD5還可以防止文件做者的"
抵賴"。這就是所謂的數字簽名應用。
MD5還普遍用於加密和解密技術上。比方在UNIX系統中用戶的password就是以MD5(或其餘相似的算法)經加密後存儲在文件系統中。當用戶登陸的時候,系統把用戶輸入的password計算成MD5值,而後再去和保存在文件系統中的MD5值進行比較,進而肯定輸入的password是否正確。經過這種步驟,系統在並不知道用戶password的明碼的狀況下就可以肯定用戶登陸系統的合法性。這不但可以避免用戶的password被具備系統管理員權限的用戶知道。而且還在必定程度上添加了password被破解的難度。
正是因爲這個緣由,現在被黑客使用最多的一種破譯password的方法就是一種被稱爲"跑字典"的方法。
有兩種方法獲得字典。一種是平常蒐集的用作password的字符串表,另外一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,而後再用目標的MD5值在這個字典中檢索。
咱們若是password的最大長度爲8位字節(8 Bytes),同一時候password僅僅能是字母和數字,共26+26+10=62個字符。排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8)。那也已是一個很是天文的數字了,存儲這個字典就需要TB級的磁盤陣列,而且這樣的方法另外一個前提,就是能得到目標帳戶的passwordMD5值的狀況下才幹夠。
這樣的加密技術被普遍的應用於UNIX系統中。這也是爲何UNIX系統比通常操做系統更爲牢固一個重要緣由。
算法描寫敘述
對MD5算法簡要的敘述可以爲:MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後。算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在MD5算法中。首先需要對信息進行填充,使其字節長度對512求餘的結果等於448。所以,信息的字節長度(Bits Length)將被擴展至N*512+448,即N*64+56個字節(Bytes),N爲一個正整數。填充的方法例如如下,在信息的後面填充一個1和無數個0,直到知足上面的條件時才中止用0對信息的填充。而後,在在這個結果後面附加一個以64位二進制表示的填充前信息長度。通過這兩步的處理,現在的信息字節長度=N*512+448+64=(N+1)*512,即長度剛好是512的整數倍。
這樣作的緣由是爲知足後面處理中對信息長度的要求。
MD5中有四個32位被稱做連接變量(Chaining Variable)的整數參數,他們分別爲:A=0x01234567。B=0x89abcdef,C=0xfedcba98,D=0x76543210。
當設置好這四個連接變量後,就開始進入算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。
將上面四個連接變量拷貝到另外四個變量中:A到a,B到b。C到c。D到d。
主循環有四輪(MD4僅僅有三輪)。每輪循環都很是類似。第一輪進行16次操做。
每次操做對a、b、c和d中的當中三個做一次非線性函數運算,而後將所得結果加上第四個變量,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a、b、c或d中之中的一個。最後用該結果代替a、b、c或d中之中的一個。
以一下是每次操做中用到的四個非線性函數(每輪一個)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是與。|是或,~是非,^是異或)
這四個函數的說明:假設X、Y和Z的相應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。F是一個逐位運算的函數。
即,假設X。那麼Y。不然Z。函數H是逐位奇偶操做符。
若是Mj表示消息的第j個子分組(從0到15),<<FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
這四輪(64步)是:
第一輪
FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
第二輪
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
第三輪
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
第四輪
II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)
常數ti可以例如如下選擇:
在第i步中。ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。(4294967296等於2的32次方)所有這些完畢以後,將A、B、C、D分別加上a、b、c、d。而後用下一分組數據繼續執行算法。
最後的輸出是A、B、C和D的級聯。
當你依照我上面所說的方法實現MD5算法之後。你可以用下面幾個信息對你作出來的程序做一個簡單的測試,看看程序有沒有錯誤。
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456789
01234567890") = 57edf4a22be3c955ac49da2e2107b67a
MD5的安全性
MD5相對MD4所做的改進:
1. 添加了第四輪;
2. 每一步均有惟一的加法常數;
3. 爲減弱第二輪中函數G的對稱性從(X&Y)|(X&Z)|(Y&Z)變爲(X&Z)|(Y&(~Z));
4. 第一步加上了上一步的結果,這將引發更快的雪崩效應;
5. 改變了第二輪和第三輪中訪問消息子分組的次序,使其更不類似;
6. 近似優化了每一輪中的循環左移位移量以實現更快的雪崩效應。各輪的位移量互不一樣樣。
3. RSA算法
RSA算法是一種非對稱password算法,所謂非對稱,就是指該算法需要一對密鑰,使用當中一個加密,則需要用還有一個才幹解密。 RSA的算法涉及三個參數。n、e1、e2。 當中,n是兩個大質數p、q的積,n的二進制表示時所佔用的位數,就是所謂的密鑰長度。 e1和e2是一對相關的值。e1可以隨意取,但要求e1與(p-1)*(q-1)互質;再選擇e2。要求
(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密鑰對。
RSA加解密的算法全然一樣,設A爲明文,B爲密文,則:A=B^e1 mod n;B=A^e2 mod n。
e1和e2可以互換使用。即:
A=B^e2 mod n;B=A^e1 mod n。
補充:
對明文進行加密,有兩種狀況需要這樣做:
1、您向朋友傳送加密數據。您但願僅僅有您的朋友可以解密,這種話,您需要首先獲取您朋友的密鑰對中公開的那一個密鑰。e及n。而後用這個密鑰進行加密,這樣密文僅僅有您的朋友可以解密,因爲相應的私鑰僅僅有您朋友擁有。
2、您向朋友傳送一段數據附加您的數字簽名,您需要對您的數據進行MD5之類的運算以取得數據的"指紋",再對"指紋"進行加密,加密將使用您本身的密鑰對中的不公開的私鑰。您的朋友收到數據後。用相同的運算得到數據指紋,再用您的公鑰對加密指紋進行解密,比較解密結果與他本身計算出來的指紋是否一致,就能夠肯定數據是否的確是您發送的、以及在傳輸過程當中是否被篡改。
密鑰的得到。一般由某個機構頒發(如CA中心)。固然也可以由您本身建立密鑰,但這樣做,
您的密鑰並不具備權威性。
計算方面,按公式計算便可了,假設您的加密強度爲1024位,則結果會在有效數據前面補0以補齊不足的位數。補入的0並不影響解密運算。
4. DES算法
DES(Data Encryption Standard)知足了國家標準局欲達到的4個目的:提供高質量的數據保護。防止數據未經受權的泄露和未被察覺的改動;具備至關高的複雜性,使得破譯的開銷超過可能得到的利益,同一時候又要便於理解和掌握;
DES算法把64位的明文輸入塊變爲64位的密文輸出塊,它所使用的密鑰也是64位,首先,DES把輸入的64位數據塊按位又一次組合。並把輸出分爲L0、R0兩部分,每部分各長32位,並進行先後置換(輸入的第58位換到第一位,第50位換到第2位,依此類推。最後一位是原來的第7位)。終於由L0輸出左32位,R0輸出右32位,依據這個法則通過16次迭代運算後,獲得L16、R16,將此做爲輸入,進行與初始置換相反的逆置換。即獲得密文輸出。
DES算法的入口參數有三個:Key、Data、Mode。當中Key爲8個字節共64位,是DES算法的工做密鑰;Data也爲8個字節64位,是要被加密或被解密的數據;Mode爲DES的工做方式,有兩種:加密或解密,假設Mode爲加密,則用Key去把數據Data進行加密,生成Data的password形式做爲DES的輸出結果。如Mode爲解密,則用Key去把password形式的數據Data解密,還原爲Data的明碼形式做爲DES的輸出結果。在使用DES時。兩方預先約定使用的」password」即Key,而後用Key去加密數據;接收方獲得密文後使用相同的Key解密獲得原數據。這樣便實現了安全性較高的傳輸數據。