1、數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的壹段代碼,通常稱為“密文”,使其只能在輸入相應的密鑰之後才能顯示出本來內容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。
2、常見加密算法
DES(Data Encryption Standard):數據加密標準,速度較快,適用於加密大量數據的場合;
3DES(Triple DES):是基於DES,對壹塊數據用三個不同的密鑰進行三次加密,強度更高;
RC2和 RC4:用變長密鑰對大量數據進行加密,比 DES 快;
IDEA(International Data Encryption Algorithm)國際數據加密算法:使用 128 位密鑰提供非常強的安全性;
RSA:由 RSA 公司發明,是壹個支持變長密鑰的公***密鑰算法,需要加密的文件塊的長度也是可變的;
DSA(Digital Signature Algorithm):數字簽名算法,是壹種標準的 DSS(數字簽名標準);
AES(Advanced Encryption Standard):高級加密標準,是下壹代的加密算法標準,速度快,安全級別高,目前 AES 標準的壹個實現是 Rijndael 算法;
BLOWFISH,它使用變長的密鑰,長度可達448位,運行速度很快;
其它算法,如ElGamal、Deffie-Hellman、新型橢圓曲線算法ECC等。
比如說,MD5,妳在壹些比較正式而嚴格的網站下的東西壹般都會有MD5值給出,如安全焦點的軟件工具,每個都有MD5。
3、例程:
#include<stdio.h>#include<process.h>
#include<conio.h>
#include<stdlib.h>
#define?maxim?65537
#define?fuyi?65536
#define?one?65536
#define?round?8
unsigned?int?inv(unsigned?int?xin);
unsigned?int?mul(unsigned?int?a,unsigned?int?b);
void?cip(unsigned?int?IN[4],unsigned?int?OUT[4],unsigned?int?Z[7][10]);
void?key(unsigned?int?uskey[9],unsigned?int?Z[7][10]);
void?de_key(unsigned?int?Z[7][10],unsigned?int?DK[7][10]);
void?main()
{?
int?i,j,k,x;unsigned?int?Z[7][10],DK[7][10],XX[5],TT[5],YY[5];
unsigned?int?uskey[9];
FILE?*fpout,*fpin;
printf("\n?Input?Key");
for(i=1;i<=8;i++)
scanf("%6u",&uskey[i]);
for(i=0;i<9;i++)
uskey[i]=100+i*3;
key(uskey,Z);/*產生加密子密鑰*/
de_key(Z,DK);/*計算解密子密鑰*/
if((fpin=fopen("ekey.txt","w"))==NULL)
{
printf("cannot?open?file!");
exit(EXIT_FAILURE);
}
for(i=0;i<7;i++)
{
for(j=0;j<10;j++)
fprintf(fpin,"%6u",Z[i][j]);
fprintf(fpin,"\n");
}
fclose(fpin);
/*XX[1..5]中為明文*/
for(i=0;i<4;i++)?XX[i]=2*i+101;
clrscr();
printf("Ming?wen?%6u?%6u?%6u?%6u?\n",XX[0],XX[1],XX[2],XX[3]);
if((fpin=(fopen("ideaming.txt","w")))==NULL)
{printf("cannot?open?file!");
exit(EXIT_FAILURE);
}
fprintf(fpin,"%6u,%6u,%6u,%6u?\n",XX[0],XX[1],XX[2],XX[3]);
fclose(fpin);
for(i=1;i<=30000;i++)
cip(XX,YY,Z);/*用密鑰Z加密XX中的明文並存在YY中*/
printf("\n\n?Mingwen?%6u?%6u?%6u?%6u?\n",YY[0],YY[1],YY[2],YY[3]);
if((fpin=fopen("ideamiwn.txt","w"))==NULL) { printf("cannot?open?file!");exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u?%6u?%6u?%6u\n",YY[0],YY[1],YY[2],YY[3]);
{
printf("cannot?open?file!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u?%6u?%6u?%6u?\n",YY[0],YY[1],YY[2],YY[3]);
fclose(fpout);
for(i=1;i<=30000;i++)
cip(YY,TT,DK);/*encipher?YY?to?TT?with?Key?DK*/
printf("\n?Jie?Mi?%6u?%6u?%6u?%6u?\n",TT[0],TT[1],TT[2],TT[3]);
if((fpout=fopen("dideaout.txt","w"))==NULL)
{
printf("cannot?open?file!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u?%6u?%6u?%6u?\n",TT[0],TT[1],TT[2],TT[3]);
fclose(fpout);
}
/*?此函數執行IDEA算法中的加密過程*/
void?cip(unsigned?int?IN[4],unsigned?int?OUT[4],unsigned?int?Z[7][10])
{
unsigned?int?r,x1,x2,x3,x4,kk,t1,t2,a;
x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
for(r=1;r<=8;r++)
{
/*?對64位的塊進行分組運算*/
x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
/*?MA結構的函數?*/
kk=mul(Z[5][r],(x1^x3));
t1=mul(Z[6][r],(kk+(x2^x4))&one;
/*?隨機變換PI*/
x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
}
/*?輸出轉換*/
OUT[0]=mul(x1,Z[1][round+1]);
OUT[3]=mul(x4,Z[1][round+1]);
OUT[1]=(x3+Z[2][round+1])&one;
OUT[2]=(x2+Z[3][round+1])&one;
}
/*?用高低算法上實現乘法運算*/
unsigned?int?mul(unsigned?int?a,unsigned?int?b)
{
long?int?p;
long?unsigned?q;
if(a==0)?p=maxim-b;
else?if(b==0)?p=maxim-a;
else
{
q=(unsigned?long)a*(unsigned?long)b;
p=(q&one)-(q>>16);
if(p<=0)?p=p+maxim;
{
return?(unsigned)?(p&one);
}
/*通過Euclidean?gcd算法計算xin的倒數*/
unsigned?int?inv(unsigned?int?xin)
{
long?n1,n2,q,r,b1,b2,t;
if(xin==0)
b2=0;
else
{n1=maxim;n2=xin;b2=1;b1=0;
do{
r=(n1%n2);q=(n1-r)/n2;
if(r==0)
if(b2<0)?b2=maxim+b2;
else
{n1=n2;n2=r;
t=b2;
b2=b1-q*b2;b1=t;
}
}while(r!=0);
}
return?(unsigned?long?int)b2;
}
/*產生加密子密鑰Z*/
void?key(unsigned?int?uskey[9],unsigned?int?Z[7][10])
{
unsigned?int?S[54];
int?i,j,r;
for(i=1;i<9;i++)
S[i-1]=uskey[i];
/*?shifts?*/
for(i=8;i<54;i++)
{
if(i+2)%8==0)/*?對於S[14],S[22],...進行計算?*/
S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
else?if((i+1)%8==0)/*?對於S[15],S[23],...進行計算?*/
S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
else
S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
}
/*取得子密鑰*/
for(r=1;r<=round+1;r++)
for(j=1;j<7;j++) Z[j][r]=S[6*(r-1)+j-1];}
/*?計算解子密鑰DK?*/
void?de_key(unsigned?int?Z[7][10],unsigned?int?DK[7][10])
{
int?j;
for(j=1;j<=round+1;j++)
{DK[1][round-j+2]=inv(Z[1][j]);
DK[4][round-j+2]=inv(Z[4][j]);
if(i==1|j==round+1)
{
DK[2][round-j+2]=(fuyi-Z[2][j])&one;
DK[3][round-j+2]=(fuyi-Z[3][j])&one;
}
else
{
DK[2][round-j+2]=inv(Z[3][j]);
DK[3][round-j+2]=inv(Z[2][j]);
}
}
for(j=1;j<=round+1;j++)
{
DK[5][round-j+2]=inv(Z[5][j]);
DK[6][round-j+2]=inv(Z[6][j]);
}
}