天天看點

RSA,DES,RC4,3DES ,MD5

一,RSA算法基于一個十分簡單的數論事實:将兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,是以可以将乘積公開作為加密密鑰。

RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。

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)就是密鑰對。其中(n,e1)為公鑰,(n,e2)為私鑰。[1] 

RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)

e1和e2可以互換使用,即:

A=B^e1 mod n;B=A^e2 mod n;

二,  RC4加密算法是密鑰長度可變的流加密算法簇。之是以稱其為簇,是由于其核心部分的S-box長度可為任意,但一般為256位元組。該算法的速度可以達到DES加密的10倍左右,且具有很進階别的非線性。

原    理:初始化和僞随機子密碼生成算法      

漏    洞:密鑰序列出現重複密文可能被破解(沒有任何的分析對于密鑰長度達到128位的RC4有效,是以,RC4是目前最安全的加密算法之一,大家可以放心使用!)

RC4算法的原理很簡單,包括初始化算法(KSA)和僞随機子密碼生成算法(PRGA)兩大部分。假設S-box的長度為256,密鑰長度為Len。先來看看算法的初始化部分(用C代碼表示):

其中,參數1是一個256長度的char型數組,定義為: unsigned char sBox[256];

參數2是密鑰,其内容可以随便定義:char key[256];

參數3是密鑰的長度,Len = strlen(key);

//程式開始

#include<stdio.h>

#include<string.h>

typedef

unsigned longULONG;

/*初始化函數*/

void

rc4_init(unsigned 

char

*s, unsigned 

char

*key, unsigned 

long

Len)

{

int

i = 0, j = 0;

char

k[256] = { 0 };

unsigned 

char

tmp = 0;

for

(i = 0; i<256; i++)

{

s[i] = i;

k[i] = key[i%Len];

}

for

(i = 0; i<256; i++)

{

j = (j + s[i] + k[i]) % 256;

tmp = s[i];

s[i] = s[j];

//交換s[i]和s[j]

s[j] = tmp;

}

}

在初始化的過程中,密鑰的主要功能是将S-box攪亂,i確定S-box的每個元素都得到處理,j保證S-box的攪亂是随機的。而不同的S-box在經過僞随機子密碼生成算法的處理後可以得到不同的子密鑰序列,将S-box和明文進行xor運算,得到密文,解密過程也完全相同。

再來看看算法的加密部分(用C代碼表示):

其中,參數1是上邊rc4_init函數中,被攪亂的S-box;

參數2是需要加密的資料data;

參數3是data的長度.

/*加解密*/

void

rc4_crypt(unsigned 

char

*s, unsigned 

char

*Data, unsigned 

long

Len)

{

int

i = 0, j = 0, t = 0;

unsigned 

long

k = 0;

unsigned 

char

tmp;

for

(k = 0; k<Len; k++)

{

i = (i + 1) % 256;

j = (j + s[i]) % 256;

tmp = s[i];

s[i] = s[j];

//交換s[x]和s[y]

s[j] = tmp;

t = (s[i] + s[j]) % 256;

Data[k] ^= s[t];

}

}

int

main()

{

unsigned 

char

s[256] = { 0 }, s2[256] = { 0 };

//S-box

char

key[256] = { 

"justfortest"

};

char

pData[512] = 

"這是一個用來加密的資料Data"

;

unsigned 

long

len = 

strlen

(pData);

int

i;

printf

(

"pData=%s "

, pData);

printf

(

"key=%s,length=%d "

, key, 

strlen

(key));

rc4_init(s, (unsigned 

char

*)key, 

strlen

(key));

//已經完成了初始化

printf

(

"完成對S[i]的初始化,如下: "

);

for

(i = 0; i<256; i++)

{

printf

(

"%02X"

, s[i]);

if

(i && (i + 1) % 16 == 0)

putchar

(

' '

);

}

printf

(

" "

);

for

(i = 0; i<256; i++)

//用s2[i]暫時保留經過初始化的s[i],很重要的!!!

{

s2[i] = s[i];

}

printf

(

"已經初始化,現在加密: "

);

rc4_crypt(s, (unsigned 

char

*)pData, len);

//加密

printf

(

"pData=%s "

, pData);

printf

(

"已經加密,現在解密: "

);

//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密鑰

rc4_crypt(s2, (unsigned 

char

*)pData, len);

//解密

printf

(

"pData=%s "

, pData);

return

0;

}

//程式完

三, DES全稱為Data Encryption Standard,即資料加密标準,是一種使用密鑰加密的塊算法,是對稱加密算法。

DES算法的入口參數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的資料;Mode為DES的工作方式,有兩種:加密或解密。

DES算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位(實際用到了56位,第8、

RSA,DES,RC4,3DES ,MD5

DES算法流程

16、24、32、40、48、56、64位是校驗位, 使得每個密鑰都有奇數個1),其算法主要分為兩步:

1)初始置換

其功能是把輸入的64位資料塊按位重新組合,并把輸出分為L0、R0兩部分,每部分各長32位,其置換規則為将輸入的第58位換到第一位,第50位換到第2位……依此類推,最後一位是原來的第7位。L0、R0則是換位輸出後的兩部分,L0是輸出的左32位,R0是右32位,例:設定換前的輸入值為D1D2D3……D64,則經過初始置換後的結果為:L0=D58D50……D8;R0=D57D49……D7。

其置換規則見下表:

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6,

64,56,48,40,32,24,16,8,

57,49,41,33,25,17,9,1,

59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,

63,55,47,39,31,23,15,7,

2)逆置換

經過16次疊代運算後,得到L16、R16,将此作為輸入,進行逆置換,逆置換正好是初始置換的逆運算,由此即得到密文輸出。

此算法是對稱加密算法體系中的代表,在計算機網絡系統中廣泛使用。

四,3DES(即Triple DES)是DES向AES過渡的加密算法,它使用3條56位的密鑰對資料進行三次加密。是DES的一個更安全的變形。它以DES為基本子產品,通過組合分組方法設計出分組加密算法。比起最初的DES,3DES更為安全。

該方法使用兩個密鑰,執行三次DES算法,加密的過程是加密-解密-加密,解密的過程是解密-加密-解密。

3DES加密過程為:C=Ek3(Dk2(Ek1(P)))

3DES解密過程為:P=Dk1(EK2(Dk3(C)))

采用兩個密鑰進行三重加密的好處有:

①兩個密鑰合起來有效密鑰長度有112bit,可以滿足商業應用的需要,若采用總長為168bit的三個密鑰,會産生不必要的開銷。

②加密時采用加密-解密-加密,而不是加密-加密-加密的形式,這樣有效的實作了與現有DES系統的向後相容問題。因為當K1=K2時,三重DES的效果就和原來的DES一樣,有助于逐漸推廣三重DES。

③三重DES具有足夠的安全性,目前還沒有關于攻破3DES的報道。

五,Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。

MD5即Message-Digest Algorithm 5(資訊-摘要算法5),用于確定資訊傳輸完整一緻。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、雜湊演算法),主流程式設計語言普遍已有MD5實作。将資料(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。

MD5算法具有以下特點:

1、壓縮性:任意長度的資料,算出的MD5值長度都是固定的。

2、容易計算:從原資料計算出MD5值很容易。

3、抗修改性:對原資料進行任何改動,哪怕隻修改1個位元組,所得到的MD5值都有很大差別。

4、強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即僞造資料)是非常困難的。

MD5的作用是讓大容量資訊在用數字簽名軟體簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。