找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4571|回复: 12
收起左侧

各种单片机加密的源代码 DES AES SHA256 MD5 RC6 RSA TEA

  [复制链接]
ID:458261 发表于 2019-12-18 16:17 | 显示全部楼层 |阅读模式
分享一下单片机加密的源码,大家互相学习提高。
51hei.png
单片机源程序如下:
  1. /*******************************************************************************************
  2. * 说    明:此处实现的SHA256算法中字符串的位长度并不是任意长度(0~2^64)的,而是在0~2^32.
  3. ***********************************************************************************************/
  4. #include<stddef.h>
  5. #include<stdio.h>

  6. /*算法规定的函数或宏*/
  7. #define SHR(x,n)     ((x)>>(n))
  8. #define ROTR(x,n)    (((x)>>(n)) | ((x)<<(32-(n))))
  9. #define CH(sha256_a,sha256_b,sha256_c)            (((sha256_a)&(sha256_b)) ^ ((~sha256_a)&(sha256_c)))
  10. #define MAJ(sha256_a,sha256_b,sha256_c)         (((sha256_a)&(sha256_b)) ^ ((sha256_a)&(sha256_c)) ^ ((sha256_b)&(sha256_c)))
  11. #define E0(x)        (ROTR((x),2) ^ ROTR((x),13) ^ ROTR((x),22))
  12. #define E1(x)        (ROTR((x),6) ^ ROTR((x),11) ^ ROTR((x),25))
  13. #define Q0(x)        (ROTR((x),7) ^ ROTR((x),18) ^ SHR((x),3))
  14. #define Q1(x)        (ROTR((x),17) ^ ROTR((x),19) ^ SHR((x),10))

  15. unsigned long sha256_hh[8];//sha256码暂存器
  16. unsigned long sha256_a,sha256_b,sha256_c,sha256_d,sha256_e,sha256_f,sha256_g,sha256_h;//中间变量
  17. unsigned long sha256_w[64];//工作暂存器
  18. unsigned long sha256_K[64]=
  19. {
  20.         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  21.         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  22.         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  23.         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  24.         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  25.         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  26.         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  27.         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  28. };//原算法规定的常量

  29. /***********************************************************************************************
  30. * 函数名称:unsigned long sha256_GetStrLen(unsigned char* ptr)
  31. * 功    能:获取字符串的字节长度
  32. * 参    数:字符串指针--ptr
  33. * 返 回 值:字符串长度
  34. ***********************************************************************************************/
  35. unsigned long sha256_GetStrLen(unsigned char* ptr)
  36. {
  37.         unsigned char* pTmp;
  38.         unsigned long len=0;
  39.         
  40.         pTmp=ptr;
  41.         
  42.         while(pTmp!=NULL&&(*pTmp!='\0'))
  43.         {
  44.                 len++;
  45.                 pTmp++;
  46.         }
  47.         return len;
  48. }

  49. /***********************************************************************************************
  50. * 函数名称:void sha256_AddBitLen(unsigned long blen)
  51. * 功    能:在工作暂存区末尾添加字符串位长度信息
  52. ***********************************************************************************************/
  53. void sha256_AddBitLen(unsigned long blen)
  54. {
  55.         sha256_w[14]=0x00000000;
  56.         sha256_w[15]=blen;
  57. }

  58. /***********************************************************************************************
  59. * 函数名称:void sha256_ByteToWord(unsigned char* ptr,unsigned char n)
  60. * 功    能:将以字节(8位)为单位存储的字符串转换成以字(32位)为单位存储。
  61. * 参    数:转换的字的个数--n      字符串指针--*ptr
  62. ***********************************************************************************************/
  63. void sha256_ByteToWord(unsigned char* ptr,unsigned char n)
  64. {
  65.         unsigned char* pTmp;
  66.         unsigned char i,j;
  67.         
  68.         pTmp=ptr;
  69.         
  70.         for(i=0;i<n;i++)
  71.         {
  72.                 sha256_w[i]=0;
  73.                 for(j=0;j<4;j++)
  74.                 {
  75.                         sha256_w[i]<<=8;
  76.                         sha256_w[i]+=*pTmp;
  77.                         pTmp++;
  78.                 }
  79.         }

  80. }
  81. /***********************************************************************************************
  82. * 函数名称:void sha256_ClearW()
  83. * 功    能:清除工作暂存器区
  84. ***********************************************************************************************/
  85. void sha256_ClearW()
  86. {
  87.         unsigned char i;
  88.         
  89.         for(i=0;i<64;i++)
  90.         {
  91.                 sha256_w[i]=0x00000000;
  92.         }
  93. }

  94. /***********************************************************************************************
  95. * 函数名称:void sha256_ProChunk()
  96. * 功    能:处理一个数据块(512位)
  97. ***********************************************************************************************/
  98. void sha256_ProChunk()
  99. {
  100.         short i;
  101.         unsigned long t1,t2;
  102.         
  103.         //步骤一
  104.         for(i=0;i<64;i++)
  105.         {
  106.                 if(0<=i&&i<=15)
  107.                 {
  108.                 }
  109.                 if(16<=i&&i<=63)
  110.                 {
  111.                         sha256_w[i]=Q1(sha256_w[i-2])+sha256_w[i-7]+Q0(sha256_w[i-15])+sha256_w[i-16];
  112.                 }   
  113.         }
  114.         
  115.         //步骤二
  116.         sha256_a=sha256_hh[0];
  117.         sha256_b=sha256_hh[1];
  118.         sha256_c=sha256_hh[2];
  119.         sha256_d=sha256_hh[3];
  120.         sha256_e=sha256_hh[4];
  121.         sha256_f=sha256_hh[5];
  122.         sha256_g=sha256_hh[6];
  123.         sha256_h=sha256_hh[7];
  124.         
  125.         //步骤三
  126.         for(i=0;i<64;i++)
  127.         {
  128.                 t1=sha256_h+E1(sha256_e)+CH(sha256_e,sha256_f,sha256_g)+sha256_K[i]+sha256_w[i];
  129.                 t2=E0(sha256_a)+MAJ(sha256_a,sha256_b,sha256_c);
  130.                 sha256_h=sha256_g;
  131.                 sha256_g=sha256_f;
  132.                 sha256_f=sha256_e;
  133.                 sha256_e=sha256_d+t1;
  134.                 sha256_d=sha256_c;
  135.                 sha256_c=sha256_b;
  136.                 sha256_b=sha256_a;
  137.                 sha256_a=t1+t2;
  138.         }
  139.         
  140.         //步骤四
  141.         sha256_hh[0] += sha256_a;
  142.         sha256_hh[1] += sha256_b;
  143.         sha256_hh[2] += sha256_c;
  144.         sha256_hh[3] += sha256_d;
  145.         sha256_hh[4] += sha256_e;
  146.         sha256_hh[5] += sha256_f;
  147.         sha256_hh[6] += sha256_g;
  148.         sha256_hh[7] += sha256_h;
  149. }

  150. /***********************************************************************************************
  151. * 函数名称:void sha256_Display()
  152. * 功    能:输出sha256码
  153. ***********************************************************************************************/
  154. void sha256_Display()
  155. {
  156. //        printf("%0lx%0lx%0lx%0lx%0lx%0lx%0lx%0lx\n",sha256_hh[0],sha256_hh[1],sha256_hh[2],sha256_hh[3],sha256_hh[4],sha256_hh[5],sha256_hh[6],sha256_hh[7]);   
  157. }

  158. /***********************************************************************************************
  159. * 函数名称:void sha256(unsigned char* ptr)
  160. * 功    能:计算给定的字符串的sha256值
  161. * 参    数:字符串
  162. ***********************************************************************************************/
  163. void SHA256_Test(unsigned char* ptr)//因为是非标版,所以输入必须为8字节的倍数
  164. {
  165.         unsigned char* pTmp;
  166.         unsigned long len,len1;//len--待处理的字符串长度;len1--字符串的长度
  167.         unsigned char m,n;
  168.         
  169.         pTmp=ptr;
  170.         
  171.         //sha256码初始化
  172.         sha256_hh[0] = 0x6a09e667;
  173.         sha256_hh[1] = 0xbb67ae85;
  174.         sha256_hh[2] = 0x3c6ef372;
  175.         sha256_hh[3] = 0xa54ff53a;
  176.         sha256_hh[4] = 0x510e527f;
  177.         sha256_hh[5] = 0x9b05688c;
  178.         sha256_hh[6] = 0x1f83d9ab;
  179.         sha256_hh[7] = 0x5be0cd19;
  180.         
  181.         len=sha256_GetStrLen(pTmp);//获取长度
  182.         len1=len;

  183.         //段0:处理不需要补位的数据块
  184.         while(len/64)
  185.         {
  186.                 sha256_ClearW();//工作暂存区清零,w[16..63]的值不为零的话会发生错误。
  187.                 sha256_ByteToWord(pTmp,64);//将一个64字节的数据块转换为16个字并存入工作暂存器w[0..15]。
  188.                 sha256_ProChunk();//数据块处理
  189.                 pTmp+=64;//指针指向下一个数据块
  190.                 len-=64;//待处理的字符串长度减64
  191.         }        
  192.         //段0结束
  193.         
  194.         m=len/4;
  195.         n=len%4;
  196.         sha256_ClearW();
  197.         sha256_ByteToWord(pTmp,m);
  198.         switch(n)
  199.         {
  200.                 case 0:
  201.                         sha256_w[m]=0x80000000;
  202.                 break;
  203.                 case 1:
  204.                         sha256_w[m]=*pTmp;
  205.                         sha256_w[m]<<=24;
  206.                         sha256_w[m]|=0x00800000;
  207.                 break;
  208.                 case 2:
  209.                         sha256_w[m]=*pTmp;
  210.                         sha256_w[m]<<=8;
  211.                         pTmp++;
  212.                         sha256_w[m]+=*pTmp;
  213.                         sha256_w[m]<<=16;
  214.                         sha256_w[m]|=0x00008000;
  215.                 case 3:
  216.                         sha256_w[m]=*pTmp;
  217.                         sha256_w[m]<<=8;
  218.                         pTmp++;
  219.                         sha256_w[m]+=*pTmp;
  220.                         sha256_w[m]<<=8;
  221.                         pTmp++;
  222.                         sha256_w[m]+=*pTmp;
  223.                         sha256_w[m]<<=8;
  224.                         sha256_w[m]|=0x00000080;
  225.                 default:;   
  226.         }
  227.         
  228.         if((len1%64)>=56)
  229.         {
  230.                 sha256_ProChunk();
  231.                 sha256_ClearW();   
  232.         }
  233.         
  234.         sha256_AddBitLen(len1*8);
  235.         sha256_ProChunk();
  236.         
  237.         sha256_Display();//结果输出
  238. }
复制代码

所有资料51hei提供下载:
加密算法源码.rar (18.31 KB, 下载次数: 240)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:729953 发表于 2020-4-15 18:06 | 显示全部楼层
谢谢楼主,好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:192883 发表于 2020-5-8 23:12 | 显示全部楼层
这个很有用,下来测试一下,如果行的通就太感谢了。
回复

使用道具 举报

ID:565307 发表于 2020-7-18 18:09 | 显示全部楼层
期待 RSA签名可用,谢谢楼主分享
回复

使用道具 举报

ID:893670 发表于 2021-3-18 20:52 | 显示全部楼层
终于找到了,RSA不知道可用不
回复

使用道具 举报

ID:893670 发表于 2021-3-18 20:53 | 显示全部楼层
RSA签名可用吗,找了很久了,mbedtls大RSA放单片机用不了
回复

使用道具 举报

ID:962834 发表于 2021-8-29 10:06 | 显示全部楼层
用RSA试一下,之前找的程序跑步起来
回复

使用道具 举报

ID:433219 发表于 2022-11-24 10:31 | 显示全部楼层
vic.huang 发表于 2021-3-18 20:53
RSA签名可用吗,找了很久了,mbedtls大RSA放单片机用不了

是速度不够,还是什么其它原因???
回复

使用道具 举报

ID:1048397 发表于 2022-11-24 11:09 | 显示全部楼层
谢谢楼主,好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:307239 发表于 2023-3-2 09:44 | 显示全部楼层
支持一下  主要用RSA
回复

使用道具 举报

ID:1075630 发表于 2023-5-6 11:30 | 显示全部楼层

支持一下  主要用RSA
回复

使用道具 举报

ID:341045 发表于 2023-5-8 15:32 | 显示全部楼层
收藏备用, 谢谢楼主分享
回复

使用道具 举报

ID:641483 发表于 2023-5-13 13:22 | 显示全部楼层
还是小白,谢谢楼主,希望以后用的着
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表