一,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、
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等。