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.
    
  • 相关阅读:
    JS调用WebService
    C# FTP FtpWebRequest UsePassive 属性
    vs2010 rdlc .net4.0 卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015) 解决办法
    DotNetBar RibbonControl控件office2007风格
    C# WinForm RDLC报表不预览直接连续打印
    C# 调用 WebService 连接ORACLE 11g
    C# WinForm程序打印条码 Code39码1
    RDLC报表 在WinForm里运行出现 未能加载文件或程序集microsoft.reportviewer.winforms
    C# 使用 SAP NCO3.0 调用SAP RFC函数接口
    在ui自动化中,如果有多个case在不同的class 下,要全部执行并且要求只启动一次浏览器页面,怎么处理?
  • 原文地址:https://www.cnblogs.com/schips/p/10763392.html
Copyright © 2011-2022 走看看