单向散列函数算法(Hash算法):一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(过程不可逆),常见的单向散列算法有MD5,SHA.RIPE-MD,HAVAL,N-Hash由于Hash函数的为不可逆算法,所以软件智能使用Hash函数作为一个加密的中间步骤MD5算法:即为消息摘要算法(MessageDigestAlgorithm),对输入的任意长度的消息进行预算,产生一个128位的消息摘要简易过程:1、数据填充..即填出消息使得其长度与448(mod512)同余,也就是说长度比512要小64位(为什么数据长度本身已经满足却仍然需要填充?直接填充一个整数倍)填充方法是附一个1在后面,然后用0来填充..2、添加长度..在上述结果之后附加64位的消息长度,使得最终消息的长度正好是512的倍数..3、初始化变量..用到4个变量来计算消息长度(即4轮运算),设4个变量分别为A,B,C,D(全部为32位寄存器)A=1234567H,B=89abcdefH,C=fedcba98H,D=7654321H4、数据处理..首先进行分组,以512位为一个单位,以单位来处理消息..首先定义4个辅助函数,以3个32为双字作为输入,输出一个32为双字F(X,Y,Z)=(X&Y)|((~X)&Z)G(X,Y,Z)=(X&Z)|(Y&(~Z))H(X,Y,Z)=X^Y^ZI(X,Y,Z)=Y^(X|(~Z))其中,^是异或操作这4轮变换是对进入主循环的512为消息分组的16个32位字分别进行如下操作:(重点)将A,B,C,D的副本a,b,c,d中的3个经F,G,H,I运算后的结果与第四个相加,再加上32位字和一个32位字的加法常数(所用的加法常数由这样一张表T[i]定义,期中i为1至64之中的值,T[i]等于4294967296乘以abs(sin(i))所得结果的整数部分)(什么是加法常数),并将所得之值循环左移若干位(若干位是随机的??),最后将所得结果加上a,b,c,d之一(这个之一也是随机的?)(一轮运算中这个之一是有规律的递增的..如下运算式),并回送至A,B,C,D,由此完成一次循环。(这个循环式对4个变量值进行计算还是对数据进行变换??)Fori=0toN/16doForj=0to15doSetX[i]toM[i*16+j]EndAA=ABB=BCC=CDD=D//第一轮,令[ABCDKSI]表示下面的操作://A=B+((A+F(B,C,D)+X[K]+T[I])S)//做如下16次操作[ABCD071][DABC1122][CDAB2173][BCDA3224][ABCD475][DABC5126][CDAB6177][BCDA7228][ABCD879]….有一共16次//第二轮,令[ABCDKSI]表示如下操作//A=B+((A+G(B,C,D)+X[K]+T[I])S)//操作循环16次[ABCD1517][DABC6918][CDAB111419][BCDA02020][ABCD5521][DABC10922][CDAB151423]..进行有规律的16运算//第三轮,令[ABCDKSI]表示如下操作//A=B+((A+H(B,C,D)+X[K]+T[I])S)//做如下16次操作[ABCD5433][DABC81134][CDAB111635][BCDA142336]//第四轮,令[ABCDKSI]表示如下运算//A=B+((A+I(B,C,D)+X[K]+T[I])S)//做如下16次运算..[ABCD0649][DABC71050][CDAB141551][BCDA52152]然后做如下加法运算…A=A+AAB=B+BBC=C+CCD=D+DDEND当所有的512位分组运算完毕后,ABCD的级联将被输出成为MD5散列结果SHA算法即安全散列算法(SecureHashAlgorithm),有SHA-1,SHA-256,SHA-384和SHA-512几种分别产生160位,256位,384位和512位的散列值简易过程:1、消息分组和填充方式与MD5相同2、使用了f0,f1,…,f79这样一个逻辑函数序列,每一个ft(0=t=79)对3个32位的双字B,C,D进行操作,产生一个32位双字的输出。Ft(B,C,D)定义如下:Ft(B,C,D)=(B&C)|((~B)&D)0=t=19Ft(B,C,D)=B^C^D20=t=39Ft(B,C,D)=(B&C)|(B&D)|(C&D)40=t=59Ft(B,C,D)=B^C^D60=t=79在C语言中常用宏定义进行初始化同样SHA-1也使用了一系列的常数K(0),K(1),….,K(79)).用十六进制表示就是Kt=5A8279990=t=19Kt=6ED9EBA120=t=39Kt=8F1BBCDC40=t=59Kt=CA62C1D660=t=79(为什么用这些常数进行初始化??范围是怎么回事??)SHA-1产生160位的消息摘要对称加密算法对称加密算法的加密密钥和解密密钥是完全相同的..安全性主要依赖于---1.加密算大必须是足够强(其中有依赖于数学问题),可以抵御各种类型的攻击..2.加密的安全性依赖于密钥的秘密性,而不是保密性..常见的对称分组加密算法有DES(DataEncryptionStandard)(数据加密标准),IDEA(InternationalDataEncryptionAlgorithm)(国际数据加密算法),AES(AdvancedEncryptionStandard)(改进加密标准),BlowFish,Twofish,TEA,流密码RC4RC4流密码为现在最为流行的流密码,应用于SSL(SecureSockesLayer)(安全套接层),WEP简易原理:生成一种称为密钥流的伪随机流(伪在这里表示有规律之意)同明文通过异或操作相混合以达到加密的目的,解密时,同密文进行异或操作。其密钥流由两部分组成::KSA和PRGA1,KSA(theKey-SchedulingAlgorithm)(密钥调度算法)首先使用KSA来完成对大小为256的字节数组S(这个字节数组是什么??是要加密的消息么??)的初始化及替换,在替换时使用密钥,密钥长度一般取5-16字节,即40-128位,首先用0-255初始化数组S,然后使用密钥进行替换,伪代码如下:Fori=0to255doS[i]=i;j:=0;Fori=0to255doj:=(j+S[i]+key[imodkeylength])mod256;//重复使用密钥swap(S[i],S[j]);2,PRGA(thePseudo-RandomGenerationAlgorithm)(伪随机流产生算法)数组S在完成初始化之后,输入密钥便不再使用。密钥流的生成是从S[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换。当S[255]完成转换后,操作继续重复执行(不明白!!)得到子密码K用以和明文进行XOR运算,得到密文,解密方法相同…3,弱点:因为RC4加密所用的是XOR,所以一旦子密钥序列出现了重复,密文就可能被破解(为什么出现重复就容易被破解??因为异或运算可逆??这的重复是指什么??相同的子密钥??)RC4产生一个伪随机比特流(akeystream),加密的时候,把它跟明文进行比特级别的异或处理,解密时进行一样的步骤(因为异或操作是对称的)。(这个类似于Vernamcipher,只不过后者不使用伪随机比特流而直接使用随机比特流)。为了产生keystream,本密码算法使用时需要两个数据的私有空间来保存内部状态:1.总共256个字节的序列(下面用“S代替)2.两个8比特的索引指针(下面用“i”和“j”代替)比特流序列的初始化是根据key的长度(key的长度通常在40到256比特之间),使用key-scheduling算法来进行的(KSA),一旦完成了初始化,比特流就可以根据伪随机生成算法(PRGA)来产生。Thekey-schedulingalgorithm(KSA)key-scheduling算法用来初始化数组“S”中的字节序列,“keylength”定义了key的字节长度,可能的范围是[1,256],典型的值是5到16之间,相应的key长度就是40-128比特。首先,数组“S”被初始化成identitypermutation(身份鉴别的序列),随后在PRGA的算法中进行256为周期的循环列举出来,每次处理的方式都是一样的,是联合key的字节进行的。forifrom0to255S[i]:=iendforj:=0forifrom0to255j:=(j+S[i]+key[imodkeylength])mod256swap(&S[i],&S[j])endfor伪随机生成算法(PRGA)对于尽可能多的每个列举过程,PRGA算法修改内部的状态并输出keystream的一个字节。在每次循环中,PRGA把i加一,并把i所指向的S值加到j上去,然后交换S[i]和S[j]的值,最后输出S[i]和S[j]的和(取256的模)对应的S值。至多经过256次,S每个位置上的值都被交换一次。i:=0j:=0whileGeneratingOutput:i:=(i+1)mod256j:=(j+S[i])mod256swap(&S[i],&S[j])outputS[(S[i]+S[j])mod256]endwhileTEA算法全称TinyEncryptionAlgorithm(微型加密算法)简易原理:1,TEA分组长度为64位,密钥长度为128位。采用Feistel网络(在BlowFish算法处有解释),作者推荐使用32次循环加密,即64轮,加密过程如下(其中K[0]-K[3]为密钥,v[0]-v[1]为待加密消息):voidTEA_Encrypt(long*v,long*k){Unsignedlongy=v[0],z=v[1],sum=0,delta=0x9e3779b9(密钥调服常数),n=32(循环次数);while(n--0){sum+=delta;y+=((z4)+k[0])^(z+sum)^((z5)+k[1]);z+=((y4)+k[2])^(y+sum)^((y5)+k[3]);}v[0]=y;v[1]=z;}其中,delta是由黄金分割得来的,解密算法是加密算法的逆过程..2,弱点::比如相关密钥攻击对其可以造成很大威胁,也提出了改进算法XTEA..IDEA算法IDEA(InternationalDataEncryptionAlgorithm)(国际数据加密算法)简易原理:1,分组密码IDEA明文和密文的分组长度为64位,密钥长度为128位。特点是使用了3中不同的代数群(在代数几何中,一个代数群(或群簇)是一个群是一个代数簇,其簇之乘与逆由正则函数提供。以范畴论描述,一个代数群是一个于代数簇范畴(数学)中的群对象)(还是不懂..囧!!)上的操作。2,子密钥的产生:IDEA共使用52个16位的子密钥,其由输入的128为密钥生成。过程如下首先,输入的128位密钥被分成8个16位的分组,直接作为前8个子密钥。128位密钥循环左移25位,生成的新的128位密钥被重新分成8组16位的分组,作为后面的8个子密钥。重复上述步骤,直至52个子密钥全部生成。(52个子密钥不是8的倍数,最后一次分组只分了4组,这样的话128位被分成4组,每组的数量就不同了..??还是分组方式我理解错了??)3,加密算法:IDEA的加密过程由8个相同的加密步骤(称为加密轮函数)和一个输出变换组成,过程如图(图看不懂!!):4,过程:首先,64位明文(明文在加密过程中呈什么形式??是一些2进制数据??为什么说是64位明文??)(这里是因为IDEA加密算法对明文进行分组,即64位一组,以组为单位来处理数据)被分成4个16位分组,每一轮加密都需要6个子密钥,最