转载

C++ XXTEA分组加密解密算法

微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。

        TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9 )。

 

下面是作者给出的该算法的C实现:

#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) {          /* Coding Part */  
        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) {  /* Decoding Part */  
        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;  
}  

下面给出的是测试代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#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) {          /* Coding Part */  
        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) {  /* Decoding Part */  
        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;  
}  
  
void main() {  
    long n = 10;  
    long k[4] = {1,2,3,4};  
    char data[1024] = "" ;  
  
    int datalen = 0;  
    char szdata[2048];  
    int i = 0;  
  
    // 控制台输入需要加密的串  
    printf( "Do Encrypt. Input Data: " ) ;  
    scanf( "%s", data) ;  
    printf( "Data:\n %s\n", data ) ;  
  
    btea((long*)data, n, k);   // n为10,表示加密  <1>  
  
    printf( "Encrypt Data:\n %s\n", data);   
  
    // 转换成十六进制格式.  
    datalen = strlen(data);  
    for(i = 0; i < datalen; ++i)  
        sprintf(&szdata[2*i], "%02X", (unsigned char)data[i]);  
    szdata[2 * i] = 0;     
    printf("Hex data: %s\n", szdata);  
  
    //转换回来  
    datalen = strlen(szdata);  
    for(i = 0; i < datalen / 2; ++i)  
        sscanf(&data[i], "%02X", &szdata[2 * i]);  
    data[i] = 0;  
    printf("Bin data: \n %s\n", data);  
  
  
    btea((long*)data, -n, k);   // n为-10,表示解密  
  
    printf( "Decrypt Data:\n %s\n", data);  
    system("pause");  
}  

 

 

文章最后发布于: 2017-11-22 11:12:00
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览