zoukankan      html  css  js  c++  java
  • 【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

    ref : https://blog.csdn.net/gsls200808/article/details/48243019


    在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫·惠勒与罗杰·尼达姆。这项技术最初于1994年提交给鲁汶的快速软件加密的研讨会上,并在该研讨会上演讲中首次发表。

    在给出的代码中:加密使用的数据为2个32位无符号整数,密钥为4个32位无符号整数即密钥长度为128位

    加密过程:

    算法实现:

    示例代码:
    C语言代码(需支持C99)

    1. #include <stdio.h>
    2.  
    3. //加密函数
    4. void encrypt (uint32_t* v, uint32_t* k) {
    5. uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */
    6. uint32_t delta=0x9e3779b9; /* a key schedule constant */
    7. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
    8. for (i=0; i < 32; i++) { /* basic cycle start */
    9. sum += delta;
    10. v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
    11. v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    12. } /* end cycle */
    13. v[0]=v0; v[1]=v1;
    14. }
    15. //解密函数
    16. void decrypt (uint32_t* v, uint32_t* k) {
    17. uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
    18. uint32_t delta=0x9e3779b9; /* a key schedule constant */
    19. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
    20. for (i=0; i<32; i++) { /* basic cycle start */
    21. v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    22. v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
    23. sum -= delta;
    24. } /* end cycle */
    25. v[0]=v0; v[1]=v1;
    26. }
    27.  
    28. int main()
    29. {
    30. uint32_t v[2]={1,2},k[4]={2,2,3,4};
    31. // v为要加密的数据是两个32位无符号整数
    32. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    33. printf("加密前原始数据:%u %u ",v[0],v[1]);
    34. encrypt(v, k);
    35. printf("加密后的数据:%u %u ",v[0],v[1]);
    36. decrypt(v, k);
    37. printf("解密后的数据:%u %u ",v[0],v[1]);
    38. return 0;
    39. }

    执行结果:

    http://write.blog.csdn.net/postedithttp://write.blog.csdn.net/postedit

    加密前原始数据:1 2
    加密后的数据:1347371722 925494771
    解密后的数据:1 2
    
    Process returned 0 (0x0)   execution time : 0.020 s
    Press any key to continue.
    


    XTEA是TEA的升级版,增加了更多的密钥表,移位和异或操作等等,设计者是Roger Needham, David Wheeler

    加密过程:

    算法实现:

    示例代码:

    1. #include <stdio.h>
    2.  
    3. /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
    4.  
    5. void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    6. unsigned int i;
    7. uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    8. for (i=0; i < num_rounds; i++) {
    9. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    10. sum += delta;
    11. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    12. }
    13. v[0]=v0; v[1]=v1;
    14. }
    15.  
    16. void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    17. unsigned int i;
    18. uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    19. for (i=0; i < num_rounds; i++) {
    20. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    21. sum -= delta;
    22. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    23. }
    24. v[0]=v0; v[1]=v1;
    25. }
    26.  
    27. int main()
    28. {
    29. uint32_t v[2]={1,2};
    30. uint32_t const k[4]={2,2,3,4};
    31. unsigned int r=32;//num_rounds建议取值为32
    32. // v为要加密的数据是两个32位无符号整数
    33. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    34. printf("加密前原始数据:%u %u ",v[0],v[1]);
    35. encipher(r, v, k);
    36. printf("加密后的数据:%u %u ",v[0],v[1]);
    37. decipher(r, v, k);
    38. printf("解密后的数据:%u %u ",v[0],v[1]);
    39. return 0;
    40. }

    加密前原始数据:1 2
    加密后的数据:1345390024 2801624574
    解密后的数据:1 2
    
    Process returned 0 (0x0)   execution time : 0.034 s
    Press any key to continue.
    


    XXTEA,又称Corrected Block TEA,是XTEA的升级版,设计者是Roger Needham, David Wheeler
    加密过程:

    算法实现:

    示例代码:

    1. #include <stdio.h>
    2. #define DELTA 0x9e3779b9
    3. #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
    4.  
    5. void btea(uint32_t *v, int n, uint32_t const key[4])
    6. {
    7. uint32_t y, z, sum;
    8. unsigned p, rounds, e;
    9. if (n > 1) /* Coding Part */
    10. {
    11. rounds = 6 + 52/n;
    12. sum = 0;
    13. z = v[n-1];
    14. do
    15. {
    16. sum += DELTA;
    17. e = (sum >> 2) & 3;
    18. for (p=0; p<n-1; p++)
    19. {
    20. y = v[p+1];
    21. z = v[p] += MX;
    22. }
    23. y = v[0];
    24. z = v[n-1] += MX;
    25. }
    26. while (--rounds);
    27. }
    28. else if (n < -1) /* Decoding Part */
    29. {
    30. n = -n;
    31. rounds = 6 + 52/n;
    32. sum = rounds*DELTA;
    33. y = v[0];
    34. do
    35. {
    36. e = (sum >> 2) & 3;
    37. for (p=n-1; p>0; p--)
    38. {
    39. z = v[p-1];
    40. y = v[p] -= MX;
    41. }
    42. z = v[n-1];
    43. y = v[0] -= MX;
    44. sum -= DELTA;
    45. }
    46. while (--rounds);
    47. }
    48. }
    49.  
    50.  
    51. int main()
    52. {
    53. uint32_t v[2]= {1,2};
    54. uint32_t const k[4]= {2,2,3,4};
    55. int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
    56. // v为要加密的数据是两个32位无符号整数
    57. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    58. printf("加密前原始数据:%u %u ",v[0],v[1]);
    59. btea(v, n, k);
    60. printf("加密后的数据:%u %u ",v[0],v[1]);
    61. btea(v, -n, k);
    62. printf("解密后的数据:%u %u ",v[0],v[1]);
    63. return 0;
    64. }


    加密前原始数据:1 2
    加密后的数据:3238569099 2059193138
    解密后的数据:1 2
    
    Process returned 0 (0x0)   execution time : 0.369 s
    Press any key to continue.
    
  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/schips/p/10763392.html
Copyright © 2011-2022 走看看