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个字节整除时,要做好字节的填充和对其等辅助工作。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/swing07/p/5657838.html
Copyright © 2011-2022 走看看