zoukankan      html  css  js  c++  java
  • TEA,XXTEA介绍,对称加密

    总结:在使用加密的时候,我们可以加入随机数,这样相同的明文,每次加密后得到不同的密文,同时可以在密文中加入密文有效期,控制密文的有效时间长度。

    针对有的功能扩展使用,很好的思想。

    TEA对 64 位数据加密密钥长达 128 位,安全性相当好。其可靠性是通过加密轮数而不是算法的复杂度来保证的。从中可以看到TEA 算法主要运用了移位和异或运算。密钥在加密过程中始终不变。

    TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据。TEA特点是速度快、效率高,实现也非常简单。由于针对TEA的攻击不断出现,所以TEA也发展出几个版本,分别是XTEA、Block TEA和XXTEA。

    TEA使用64位一组加密,128长度的秘钥,加密的到结果。相对XXTEA其加密可靠性低。

    void encrypt(unsigned long *v, unsigned long *k) {
     2     unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
     3     unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
     4     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
     5     for (i=0; i < 32; i++) {                        /* basic cycle start */
     6         sum += delta;
     7         y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
     8         z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
     9     }
    10     v[0]=y;
    11     v[1]=z;
    12 }
    13 
    14 void decrypt(unsigned long *v, unsigned long *k) {
    15     unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
    16     unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
    17     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
    18     for(i=0; i<32; i++) {                            /* basic cycle start */
    19         z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
    20         y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
    21         sum -= delta;                                /* end cycle */
    22     }
    23     v[0]=y;
    24     v[1]=z;
    25 }

    XXTEA加密字符串长度不是 4 的整数倍,则这些实现的在加密后无法真正还原,还原以后的字符串实际上与原字符串不相等,而是后面多了一些  的字符,或者少了一些  的字符。原因在于 XXTEA 算法只定义了如何对 32 位的信息块数组(实际上是 32 位无符号整数数组)进行加密,而并没有定义如何来将字符串编码为这种数组。而现有的实现中在将字符串编码为整数数组时,都丢失了字符串长度信息,因此还原出现了问题。

     

      #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);
     
      long btea(long* v, long n, long* k) {
        unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
        long p, q ;
        if (n > 1) {         
          q = 6 + 52/n;
          while (q-- > 0) {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
            y = v[0];
            z = v[n-1] += MX;
          }
          return 0 ;
        } else if (n < -1) { 
          n = -n;
          q = 6 + 52/n;
          sum = q*DELTA ;
          while (sum != 0) {
            e = (sum >> 2) & 3;
            for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
            z = v[n-1];
            y = v[0] -= MX;
            sum -= DELTA;
          }
          return 0;
        }
        return 1;
      }

     long btea(long* v, long n, long* k)

    v是要加密的组元的起始地址,以32bit为单位,这里用long来实现。

    n是要加密的组元个数,正数是加密,负数是解密。

    k是密钥的起始地址,长度为4个组元,4*32=128bit。

    返回值为0或1(对应n=0,没有计算)。

    加密的结果会直接写回到v中。

    经过试验,我还有一点要补充的,XXTEA的计算是空间相关的,也就是说,在一个组元中,4个字节是不能断章取义的,即密文的一部分,并不能还原成明文的一部分。所以,当数据不能被4个字节整除时,要做好字节的填充和对其等辅助工作。

  • 相关阅读:
    提高代码质量:如何编写函数
    如何写自我评价
    写简历注意事项
    Android开发注意细节
    Android:onNewIntent()触发机制及注意事项
    Atom与markdown
    Java程序性能优化总结
    Java中的继承与组合
    Fragment生命周期总结
    C# 生成随机姓名
  • 原文地址:https://www.cnblogs.com/swing07/p/5657838.html
Copyright © 2011-2022 走看看