找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5750|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

各種單片機加密的源代碼 DES AES SHA256 MD5 RC6 RSA TEA

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:458261 發(fā)表于 2019-12-18 16:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
分享一下單片機加密的源碼,大家互相學(xué)習(xí)提高。

單片機源程序如下:
  1. /*******************************************************************************************
  2. * 說    明:此處實現(xiàn)的SHA256算法中字符串的位長度并不是任意長度(0~2^64)的,而是在0~2^32.
  3. ***********************************************************************************************/
  4. #include<stddef.h>
  5. #include<stdio.h>

  6. /*算法規(guī)定的函數(shù)或宏*/
  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. };//原算法規(guī)定的常量

  29. /***********************************************************************************************
  30. * 函數(shù)名稱:unsigned long sha256_GetStrLen(unsigned char* ptr)
  31. * 功    能:獲取字符串的字節(jié)長度
  32. * 參    數(shù):字符串指針--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. * 函數(shù)名稱:void sha256_AddBitLen(unsigned long blen)
  51. * 功    能:在工作暫存區(qū)末尾添加字符串位長度信息
  52. ***********************************************************************************************/
  53. void sha256_AddBitLen(unsigned long blen)
  54. {
  55.         sha256_w[14]=0x00000000;
  56.         sha256_w[15]=blen;
  57. }

  58. /***********************************************************************************************
  59. * 函數(shù)名稱:void sha256_ByteToWord(unsigned char* ptr,unsigned char n)
  60. * 功    能:將以字節(jié)(8位)為單位存儲的字符串轉(zhuǎn)換成以字(32位)為單位存儲。
  61. * 參    數(shù):轉(zhuǎn)換的字的個數(shù)--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. * 函數(shù)名稱:void sha256_ClearW()
  83. * 功    能:清除工作暫存器區(qū)
  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. * 函數(shù)名稱:void sha256_ProChunk()
  96. * 功    能:處理一個數(shù)據(jù)塊(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. * 函數(shù)名稱: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. * 函數(shù)名稱:void sha256(unsigned char* ptr)
  160. * 功    能:計算給定的字符串的sha256值
  161. * 參    數(shù):字符串
  162. ***********************************************************************************************/
  163. void SHA256_Test(unsigned char* ptr)//因為是非標版,所以輸入必須為8字節(jié)的倍數(shù)
  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:處理不需要補位的數(shù)據(jù)塊
  184.         while(len/64)
  185.         {
  186.                 sha256_ClearW();//工作暫存區(qū)清零,w[16..63]的值不為零的話會發(fā)生錯誤。
  187.                 sha256_ByteToWord(pTmp,64);//將一個64字節(jié)的數(shù)據(jù)塊轉(zhuǎn)換為16個字并存入工作暫存器w[0..15]。
  188.                 sha256_ProChunk();//數(shù)據(jù)塊處理
  189.                 pTmp+=64;//指針指向下一個數(shù)據(jù)塊
  190.                 len-=64;//待處理的字符串長度減64
  191.         }        
  192.         //段0結(jié)束
  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();//結(jié)果輸出
  238. }
復(fù)制代碼

所有資料51hei提供下載:
加密算法源碼.rar (18.31 KB, 下載次數(shù): 248)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:729953 發(fā)表于 2020-4-15 18:06 | 只看該作者
謝謝樓主,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

板凳
ID:192883 發(fā)表于 2020-5-8 23:12 | 只看該作者
這個很有用,下來測試一下,如果行的通就太感謝了。
回復(fù)

使用道具 舉報

地板
ID:565307 發(fā)表于 2020-7-18 18:09 | 只看該作者
期待 RSA簽名可用,謝謝樓主分享
回復(fù)

使用道具 舉報

5#
ID:893670 發(fā)表于 2021-3-18 20:52 | 只看該作者
終于找到了,RSA不知道可用不
回復(fù)

使用道具 舉報

6#
ID:893670 發(fā)表于 2021-3-18 20:53 | 只看該作者
RSA簽名可用嗎,找了很久了,mbedtls大RSA放單片機用不了
回復(fù)

使用道具 舉報

7#
ID:962834 發(fā)表于 2021-8-29 10:06 | 只看該作者
用RSA試一下,之前找的程序跑步起來
回復(fù)

使用道具 舉報

8#
ID:433219 發(fā)表于 2022-11-24 10:31 | 只看該作者
vic.huang 發(fā)表于 2021-3-18 20:53
RSA簽名可用嗎,找了很久了,mbedtls大RSA放單片機用不了

是速度不夠,還是什么其它原因???
回復(fù)

使用道具 舉報

9#
ID:1048397 發(fā)表于 2022-11-24 11:09 | 只看該作者
謝謝樓主,好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

10#
ID:307239 發(fā)表于 2023-3-2 09:44 | 只看該作者
支持一下  主要用RSA
回復(fù)

使用道具 舉報

11#
ID:1075630 發(fā)表于 2023-5-6 11:30 | 只看該作者

支持一下  主要用RSA
回復(fù)

使用道具 舉報

12#
ID:341045 發(fā)表于 2023-5-8 15:32 | 只看該作者
收藏備用, 謝謝樓主分享
回復(fù)

使用道具 舉報

13#
ID:641483 發(fā)表于 2023-5-13 13:22 | 只看該作者
還是小白,謝謝樓主,希望以后用的著
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表