|
分享一下單片機加密的源碼,大家互相學(xué)習(xí)提高。
51hei.png (48.86 KB, 下載次數(shù): 67)
下載附件
2019-12-18 21:46 上傳
單片機源程序如下:
- /*******************************************************************************************
- * 說 明:此處實現(xiàn)的SHA256算法中字符串的位長度并不是任意長度(0~2^64)的,而是在0~2^32.
- ***********************************************************************************************/
- #include<stddef.h>
- #include<stdio.h>
- /*算法規(guī)定的函數(shù)或宏*/
- #define SHR(x,n) ((x)>>(n))
- #define ROTR(x,n) (((x)>>(n)) | ((x)<<(32-(n))))
- #define CH(sha256_a,sha256_b,sha256_c) (((sha256_a)&(sha256_b)) ^ ((~sha256_a)&(sha256_c)))
- #define MAJ(sha256_a,sha256_b,sha256_c) (((sha256_a)&(sha256_b)) ^ ((sha256_a)&(sha256_c)) ^ ((sha256_b)&(sha256_c)))
- #define E0(x) (ROTR((x),2) ^ ROTR((x),13) ^ ROTR((x),22))
- #define E1(x) (ROTR((x),6) ^ ROTR((x),11) ^ ROTR((x),25))
- #define Q0(x) (ROTR((x),7) ^ ROTR((x),18) ^ SHR((x),3))
- #define Q1(x) (ROTR((x),17) ^ ROTR((x),19) ^ SHR((x),10))
- unsigned long sha256_hh[8];//sha256碼暫存器
- unsigned long sha256_a,sha256_b,sha256_c,sha256_d,sha256_e,sha256_f,sha256_g,sha256_h;//中間變量
- unsigned long sha256_w[64];//工作暫存器
- unsigned long sha256_K[64]=
- {
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
- };//原算法規(guī)定的常量
- /***********************************************************************************************
- * 函數(shù)名稱:unsigned long sha256_GetStrLen(unsigned char* ptr)
- * 功 能:獲取字符串的字節(jié)長度
- * 參 數(shù):字符串指針--ptr
- * 返 回 值:字符串長度
- ***********************************************************************************************/
- unsigned long sha256_GetStrLen(unsigned char* ptr)
- {
- unsigned char* pTmp;
- unsigned long len=0;
-
- pTmp=ptr;
-
- while(pTmp!=NULL&&(*pTmp!='\0'))
- {
- len++;
- pTmp++;
- }
- return len;
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256_AddBitLen(unsigned long blen)
- * 功 能:在工作暫存區(qū)末尾添加字符串位長度信息
- ***********************************************************************************************/
- void sha256_AddBitLen(unsigned long blen)
- {
- sha256_w[14]=0x00000000;
- sha256_w[15]=blen;
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256_ByteToWord(unsigned char* ptr,unsigned char n)
- * 功 能:將以字節(jié)(8位)為單位存儲的字符串轉(zhuǎn)換成以字(32位)為單位存儲。
- * 參 數(shù):轉(zhuǎn)換的字的個數(shù)--n 字符串指針--*ptr
- ***********************************************************************************************/
- void sha256_ByteToWord(unsigned char* ptr,unsigned char n)
- {
- unsigned char* pTmp;
- unsigned char i,j;
-
- pTmp=ptr;
-
- for(i=0;i<n;i++)
- {
- sha256_w[i]=0;
- for(j=0;j<4;j++)
- {
- sha256_w[i]<<=8;
- sha256_w[i]+=*pTmp;
- pTmp++;
- }
- }
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256_ClearW()
- * 功 能:清除工作暫存器區(qū)
- ***********************************************************************************************/
- void sha256_ClearW()
- {
- unsigned char i;
-
- for(i=0;i<64;i++)
- {
- sha256_w[i]=0x00000000;
- }
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256_ProChunk()
- * 功 能:處理一個數(shù)據(jù)塊(512位)
- ***********************************************************************************************/
- void sha256_ProChunk()
- {
- short i;
- unsigned long t1,t2;
-
- //步驟一
- for(i=0;i<64;i++)
- {
- if(0<=i&&i<=15)
- {
- }
- if(16<=i&&i<=63)
- {
- sha256_w[i]=Q1(sha256_w[i-2])+sha256_w[i-7]+Q0(sha256_w[i-15])+sha256_w[i-16];
- }
- }
-
- //步驟二
- sha256_a=sha256_hh[0];
- sha256_b=sha256_hh[1];
- sha256_c=sha256_hh[2];
- sha256_d=sha256_hh[3];
- sha256_e=sha256_hh[4];
- sha256_f=sha256_hh[5];
- sha256_g=sha256_hh[6];
- sha256_h=sha256_hh[7];
-
- //步驟三
- for(i=0;i<64;i++)
- {
- t1=sha256_h+E1(sha256_e)+CH(sha256_e,sha256_f,sha256_g)+sha256_K[i]+sha256_w[i];
- t2=E0(sha256_a)+MAJ(sha256_a,sha256_b,sha256_c);
- sha256_h=sha256_g;
- sha256_g=sha256_f;
- sha256_f=sha256_e;
- sha256_e=sha256_d+t1;
- sha256_d=sha256_c;
- sha256_c=sha256_b;
- sha256_b=sha256_a;
- sha256_a=t1+t2;
- }
-
- //步驟四
- sha256_hh[0] += sha256_a;
- sha256_hh[1] += sha256_b;
- sha256_hh[2] += sha256_c;
- sha256_hh[3] += sha256_d;
- sha256_hh[4] += sha256_e;
- sha256_hh[5] += sha256_f;
- sha256_hh[6] += sha256_g;
- sha256_hh[7] += sha256_h;
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256_Display()
- * 功 能:輸出sha256碼
- ***********************************************************************************************/
- void sha256_Display()
- {
- // 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]);
- }
- /***********************************************************************************************
- * 函數(shù)名稱:void sha256(unsigned char* ptr)
- * 功 能:計算給定的字符串的sha256值
- * 參 數(shù):字符串
- ***********************************************************************************************/
- void SHA256_Test(unsigned char* ptr)//因為是非標版,所以輸入必須為8字節(jié)的倍數(shù)
- {
- unsigned char* pTmp;
- unsigned long len,len1;//len--待處理的字符串長度;len1--字符串的長度
- unsigned char m,n;
-
- pTmp=ptr;
-
- //sha256碼初始化
- sha256_hh[0] = 0x6a09e667;
- sha256_hh[1] = 0xbb67ae85;
- sha256_hh[2] = 0x3c6ef372;
- sha256_hh[3] = 0xa54ff53a;
- sha256_hh[4] = 0x510e527f;
- sha256_hh[5] = 0x9b05688c;
- sha256_hh[6] = 0x1f83d9ab;
- sha256_hh[7] = 0x5be0cd19;
-
- len=sha256_GetStrLen(pTmp);//獲取長度
- len1=len;
- //段0:處理不需要補位的數(shù)據(jù)塊
- while(len/64)
- {
- sha256_ClearW();//工作暫存區(qū)清零,w[16..63]的值不為零的話會發(fā)生錯誤。
- sha256_ByteToWord(pTmp,64);//將一個64字節(jié)的數(shù)據(jù)塊轉(zhuǎn)換為16個字并存入工作暫存器w[0..15]。
- sha256_ProChunk();//數(shù)據(jù)塊處理
- pTmp+=64;//指針指向下一個數(shù)據(jù)塊
- len-=64;//待處理的字符串長度減64
- }
- //段0結(jié)束
-
- m=len/4;
- n=len%4;
- sha256_ClearW();
- sha256_ByteToWord(pTmp,m);
- switch(n)
- {
- case 0:
- sha256_w[m]=0x80000000;
- break;
- case 1:
- sha256_w[m]=*pTmp;
- sha256_w[m]<<=24;
- sha256_w[m]|=0x00800000;
- break;
- case 2:
- sha256_w[m]=*pTmp;
- sha256_w[m]<<=8;
- pTmp++;
- sha256_w[m]+=*pTmp;
- sha256_w[m]<<=16;
- sha256_w[m]|=0x00008000;
- case 3:
- sha256_w[m]=*pTmp;
- sha256_w[m]<<=8;
- pTmp++;
- sha256_w[m]+=*pTmp;
- sha256_w[m]<<=8;
- pTmp++;
- sha256_w[m]+=*pTmp;
- sha256_w[m]<<=8;
- sha256_w[m]|=0x00000080;
- default:;
- }
-
- if((len1%64)>=56)
- {
- sha256_ProChunk();
- sha256_ClearW();
- }
-
- sha256_AddBitLen(len1*8);
- sha256_ProChunk();
-
- sha256_Display();//結(jié)果輸出
- }
復(fù)制代碼
所有資料51hei提供下載:
加密算法源碼.rar
(18.31 KB, 下載次數(shù): 248)
2019-12-18 16:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|