资源描述:
《加密算法和解密算法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VB.NET写的TEA加密算法和解密算法(注:使用的是VB.NET2008)'//最近想了解一下QQ的协议,但第一就是解决TEA加密算法,在网上找了很久,'//发现有很多的版本的,当然也有VB的,但不是VB.NET的.那些VB的已经不能直接用了.'//而且现在VB.NET已经可以移位了.看了以前VB写的.为了移位就写了一个函数。'//只有C#或C++的两行的核心算法VB却要几十行。找遍了网上也没发现有VB.NET做只能靠自己了。'//TEA加密算我上面说过,其实就只有两行核心代码。但是QQ在使用这个算法的时候,'//由于需要加密不定
2、长的数据,所以使用了一些常规的填充办法和交织算法.所以更多是处理填充和交织。''//本人E-Mail:liwqbasic[AT]gamail.com([AT]换成@)QQ:&H12C214E9[0x12C214E9]''NamespaceHashTEAPublicClasshashteaPrivateConstdeltaAsUInteger=&H9E3779B9L'tea算法的delta值PrivatePlain(7)AsByte'指向当前的明文块PrivateprePlain(7)AsByte'指向前面一个明文块Privateou
3、t()AsBytePrivateCryptAsUIntegerPrivatepreCryptAsUInteger'当前加密的密文位置和上一次加密的密文块位置,他们相差8PrivatePosAsLong'当前处理的加密解密块的位置PrivatepaddingAsLong'填充数PrivateKey(15)AsByte'密钥PrivateHeaderAsBoolean'用于加密时,表示当前是否是第一个8字节块,因为加密算法'是反馈的,但是最开始的8个字节没有反馈可用,所有需要标明这种情况1PrivatecontextStartAsLon
4、gPublicFunctionUnHashTEA(ByValBinFromAsByte(),ByValBinTKeyAsByte(),_ByValoffsetAsInteger,ByValIs16RoundsAsBoolean)AsByte()Crypt=0preCrypt=0Key=BinTKeyDimcountAsInteger=0Dimm(offset+7)AsByteDimintlenAsInteger=BinFrom.LengthIfintlen<16Or(intlenMod8<>0)ThenThrowMsg("LenNo
5、Enuf")prePlain=Decipher(BinFrom,Key,True)Pos=prePlain(0)And&H7count=intlen-Pos-10Ifcount<0ThenThrowMsg("CountNoEnuf")Fori=offsetTom.Length-1m(i)=0NextReDimout(count-1)preCrypt=0Crypt=8contextStart=8Pos+=1padding=1Whilepadding<=2IfPos<8ThenPos+=12padding+=1EndIfIfPos=8T
6、henm=BinFromIfNot(Decrypt8Bytes(BinFrom,offset,intlen))ThenThrowMsg("Decrypt8Bytes()failed.")EndIfEndIfEndWhileDimi2=0Whilecount<>0IfPos<8Thenout(i2)=CByte(m(offset+preCrypt+Pos)XorprePlain(Pos))i2+=1count-=1Pos+=1EndIfIfPos=8Thenm=BinFrompreCrypt=Crypt-8Decrypt8Bytes(
7、BinFrom,offset,intlen)EndIfEndWhileFori=1To7IfPos<8ThenIf(m(offset+preCrypt+Pos)XorprePlain(Pos))<>0ThenThrowMsg("tailisnotfilledcorrect.")EndIfPos+=1IfPos=8Thenm=BinFrom3IfNot(Decrypt8Bytes(BinFrom,offset,intlen))ThenThrowMsg("Decrypt8Bytes()failed.")EndIfEndIfEndIfNe
8、xtReturnoutEndFunctionPrivateFunctionDecrypt8Bytes(ByValinput()AsByte,ByValoffsetAsInteger,_ByValintlenAsInteger)AsBo