一天无聊看到了一个亮点

作者在 2011-11-09 15:31:02 发布以下内容
TEA加密算法   TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明[3]。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
   代码如下:
   void qq_encipher(unsigned long *const plain, const unsigned long *const key, unsigned long *const crypt)   
//参数为8字节的明文输入和16字节的密钥,输出8字节密文  
 {   
      unsigned long left = plain[0],right = plain[1],
   a = key[0], b = key[1],
   c = key[2], d = key[3],
   n = 32, sum = 0,
   delta = 0x9E3779B9;
   // 明文输入被分为左右两部分,密钥分为四部分存入寄存器,n表示加密轮数推荐32。Delta为一常数。
   while (n-- > 0) {
   sum += delta;
   left += ((right << 4) + a) ^ (right + sum) ^ ((right >> 5) + b);
   right += ((left << 4) + c) ^ (left + sum) ^ ((left >> 5) + d);
  }
   crypt[0] = left ;
   crypt[1] = right ;
   }
   虽然TEA算法比 DES(Data Encryption Standard) 要简单得多, 但有很强的抗差分分析能力,加密速度也比 DES 快得多,而且对 64 位数据加密的密钥长达 128 位,安全性相当好。其可靠性是通过加密轮数而不是算法的复杂度来保证的。从中可以看到TEA 算法主要运用了移位和异或运算。密钥在加密过程中始终不变。
       QQTEA 算法建立在标准 TEA算法的基础上,使用16轮的加密(这是最低限,推荐应该是32轮)。QQ在使用这个算法的时候,由于需要加密不定长的数据,所以使用了一些常规的填 充办法和交织算法。
   1 填充算法
  如果明文本身的长度不是8的倍数,那么还要进行填充以使其成为8的倍数。以字节为单位,令N=原始字符串+10+填充字节数n,则N应该是8的倍数。
   具体的填充方法:第一个字节为:(random()&0xf8)|n,随后填充(n+2)个字节random()&0xff ,后面接原始数据,最后填充7 个字节0x00 。
   因为使用了不同的随机数,所以填充的结果使得即使对于相同的明文,密文的结果也会不同。
   2 交织算法
   消息被分为多个加密单元,每一个加密单元都是8字节,使用TEA进行加密,加密结果与下一个加密单元做异或运算后再作为待加密的明文。
默认分类 | 阅读 1666 次
文章评论,共0条
游客请输入验证码
浏览255648次