找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1656|回复: 0
打印 上一主题 下一主题
收起左侧

DES加密在STC12C56单片机中实现程序

[复制链接]
跳转到指定楼层
楼主
在STC12C56,直接下就可以使用!
  1. //单片机的DES加解密程序,参数带入密钥就能加密解密了,注意密钥,原 始数据和加密产生的数据都是8个字节的。
  2. //单片机源程序如下:

  3. #include "des.h"

  4. //密钥:        B4 31 5B 86 9D 7D FA A2
  5. //数据:       1F AD 61 A5 F7 19 77 14
  6. //DES加密结果:4C 78 E9 1A F2 DA 9C D3

  7. unsigned char code initial_tr[64] =      //初始置换
  8. {
  9.   57, 49, 41, 33, 25, 17,  9,  1,
  10.   59, 51, 43, 35, 27, 19, 11,  3,
  11.   61, 53, 45, 37, 29, 21, 13,  5,
  12.   63, 55, 47, 39, 31, 23, 15,  7,
  13.   56, 48, 40, 32, 24, 16,  8,  0,
  14.   58, 50, 42, 34, 26, 18, 10,  2,
  15.   60, 52, 44, 36, 28, 20, 12,  4,
  16.   62, 54, 46, 38, 30, 22, 14,  6
  17. };


  18. unsigned char code final_tr[64] =
  19. {
  20.   39,  7, 47, 15, 55, 23, 63, 31,
  21.   38,  6, 46, 14, 54, 22, 62, 30,
  22.   37,  5, 45, 13, 53, 21, 61, 29,
  23.   36,  4, 44, 12, 52, 20, 60, 28,
  24.   35,  3, 43, 11, 51, 19, 59, 27,
  25.   34,  2, 42, 10, 50, 18, 58, 26,
  26.   33,  1, 41,  9, 49, 17, 57, 25,
  27.   32,  0, 40,  8, 48, 16, 56, 24
  28. };


  29. unsigned char code swap[64] =
  30. {
  31.   33, 34, 35, 36, 37, 38, 39, 40,
  32.   41, 42, 43, 44, 45, 46, 47, 48,
  33.   49, 50, 51, 52, 53, 54, 55, 56,
  34.   57, 58, 59, 60, 61, 62, 63, 64,
  35.    1,  2,  3,  4,  5,  6,  7,  8,
  36.    9, 10, 11, 12, 13, 14, 15, 16,
  37.   17, 18, 19, 20, 21, 22, 23, 24,
  38.   25, 26, 27, 28, 29, 30, 31, 32
  39. };


  40. unsigned char code key_tr1[56] =
  41. {
  42.   56, 48, 40, 32, 24, 16,  8,
  43.    0, 57, 49, 41, 33, 25, 17,
  44.    9,  1, 58, 50, 42, 34, 26,
  45.   18, 10,  2, 59, 51, 43, 35,
  46.   62, 54, 46, 38, 30, 22, 14,
  47.    6, 61, 53, 45, 37, 29, 21,
  48.   13,  5, 60, 52, 44, 36, 28,
  49.   20, 12,  4, 27, 19, 11,  3
  50. };


  51. unsigned char code key_tr2[64] =
  52. {
  53.   0,  0, 13,  4, 16, 10, 23,  0,
  54.   0,  0,  2,  9, 27, 14,  5, 20,
  55.   0,  0, 22,  7, 18, 11,  3, 25,
  56.   0,  0, 15,  1,  6, 26, 19, 12,
  57.   0,  0, 40, 54, 51, 30, 36, 46,
  58.   0,  0, 29, 47, 39, 50, 44, 32,
  59.   0,  0, 43, 52, 48, 38, 55, 33,
  60.   0,  0, 45, 31, 41, 49, 35, 28
  61. };

  62. unsigned char code etr[64] =
  63. {
  64.   0,  0, 31,  4,  0,  1,  2,  3,
  65.   0,  0,  3,  8,  4,  5,  6,  7,
  66.   0,  0,  7, 12,  8,  9, 10, 11,
  67.   0,  0, 11, 16, 12, 13, 14, 15,
  68.   0,  0, 15, 20, 16, 17, 18, 19,
  69.   0,  0, 19, 24, 20, 21, 22, 23,
  70.   0,  0, 23, 28, 24, 25, 26, 27,
  71.   0,  0, 27,  0, 28, 29, 30, 31
  72. };

  73. unsigned char code ptr[32] =
  74. {
  75.   31, 14, 39, 44, 60, 23, 55, 36,
  76.    4, 30, 46, 53, 12, 37, 62, 21,
  77.    5, 15, 47, 29, 63, 54,  6, 20,
  78.   38, 28, 61, 13, 45, 22,  7, 52
  79. };

  80. unsigned char code s[8][64] =
  81. {
  82.   {
  83.    14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
  84.     0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
  85.     4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
  86.    15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13
  87.   },

  88.   {
  89.    15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
  90.     3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
  91.     0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
  92.    13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9
  93.   },

  94.   {
  95.    10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
  96.    13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
  97.    13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
  98.     1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12
  99.   },

  100.   {
  101.     7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
  102.    13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
  103.    10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
  104.     3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14
  105.   },

  106.   {
  107.     2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
  108.    14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
  109.     4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
  110.    11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3
  111.   },

  112.   {
  113.    12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
  114.    10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
  115.     9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
  116.     4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7, 6,  0,  8,  13
  117.   },

  118.   {
  119.     4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
  120.    13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
  121.     1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
  122.     6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12
  123.   },

  124.   {
  125.    13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
  126.     1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
  127.     7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
  128.     2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
  129.   }
  130. };

  131. unsigned char code rots[16] =
  132. {
  133.   1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1
  134. };

  135. unsigned char code bit_msk[8] =
  136. {
  137.   0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
  138. };

  139. unsigned char DES_Encrypt_key[8];
  140. unsigned char DES_Decrypt_key[8];
  141. unsigned char sub_keys[16][8]; //sub_keys[16][8]
  142. unsigned char main_key[8];

  143. /************************************************************************/
  144. /*                                                                      */
  145. /*      Module title:           des                                     */
  146. /*      Module type:            des main rutine                          */
  147. /*                                                                      */
  148. /*      Author:                 YXH                                     */
  149. /*      Date:                   2012-07-13                              */
  150. /*                                                                      */
  151. /*      Last changed by:        YXH                                     */
  152. /*      Date:                   2012-07-13                              */
  153. /*                                                                      */
  154. /*      Functional Description: Encipher and decipher 64 bits string    */
  155. /*                              according to a 64 bits key string       */
  156. /*                              The string format is shown below        */
  157. /*                                                                      */
  158. /*      input parameter 1:      pointer to 64 bits input string         */
  159. /*                      2:      pointer to 64 bits key string           */
  160. /*                      3:      boolean if false indicating enciphering */
  161. /*                              if true dechiphering                    */
  162. /*                      4:      pointer to a 64 bits output string      */
  163. /************************************************************************/
  164. /*                                                                      */
  165. /*                      msb                     lsb                     */
  166. /*                      bit                     bit                     */
  167. /*                      +-- -- -- -- -- -- -- --+                       */
  168. /*              addr    !1st                 8th!                       */
  169. /*                      +-- -- -- -- -- -- -- --+                       */
  170. /*              addr+1  !9th                16th!                       */
  171. /*                      +-- -- -- -- -- -- -- --+                       */
  172. /*                      :                       :                       */
  173. /*                      :                       :                       */
  174. /*                      +-- -- -- -- -- -- -- --+                       */
  175. /*              addr+7  !57th               64th!                       */
  176. /*                      +-- -- -- -- -- -- -- --+                       */
  177. /*                                                                      */
  178. /************************************************************************/

  179. void des(unsigned char *plain_strng, unsigned char *key, unsigned char d, unsigned char *ciph_strng)
  180. {
  181.     unsigned char a_str[8], b_str[8], x_str[8];
  182.     unsigned char i, j, *pkey, temp;
  183.     for (i = 0; i < 8 ; ++i)
  184.     {
  185.         if (key[i] != main_key[i])
  186.         {
  187.             compute_subkeys(key);
  188.             i = 7;
  189.         }
  190.     }

  191.     transpose(plain_strng, a_str, initial_tr, 64);
  192. ……………………

  193. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
  1. #include "STC12C56.h"
  2. #include <stdio.h>
  3. #include "TM1620.H"
  4. #include "des.h"

  5. #define FOSC 11059200L      //System frequency
  6. #define BAUD 57600           //UART baudrate

  7. unsigned char code key_tab[]={0x05,0x51,0x80,0x01,0x05,0x51,0xFf,0xFF};   //密钥
  8. unsigned char code plain_tab[]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};  //明文
  9. uint times=0;
  10. uchar RxdBuff[8];
  11. uchar Uart_DES = 0;
  12. uchar n;

  13. void UartInit(void)                //57600bps@11.0592MHz,开启波特率倍速
  14. {
  15.         PCON |= 0x80;                //使能波特率倍速位SMOD
  16.         SCON = 0x50;                //8位数据,可变波特率
  17.         AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  18.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  19.         TMOD &= 0x0F;                //清除定时器1模式位
  20.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  21.         TL1 = 0xFF;                //设定定时初值
  22.         TH1 = 0xFF;                //设定定时器重装值
  23.         ET1 = 0;                //禁止定时器1中断
  24.         TR1 = 1;                //启动定时器1

  25.         ES = 1;                 //Enable UART interrupt
  26.         EA = 1;                 //Open master interrupt switch
  27. }
  28. void Delay200ms()                //@11.0592MHz
  29. {
  30.         unsigned char i, j, k;

  31.         i = 9;
  32.         j = 104;
  33.         k = 139;
  34.         do
  35.         {
  36.                 do
  37.                 {
  38.                         while (--k);
  39.                 } while (--j);
  40.         } while (--i);
  41. }

  42. void main()
  43. {
  44.         unsigned char cipher1[8];        //密文缓存

  45.         UartInit();
  46.                 Display_num(1,BAUD/10000%10,0);
  47.                 Display_num(2,BAUD/1000%10,0);
  48.                 Display_num(3,BAUD/100%10,0);
  49.                 Display_num(4,BAUD/10%10,0);
  50.                 Display_num(5,BAUD%10,0);
  51.         Delay200ms();
  52.         Delay200ms();
  53.         Init_TM1620();       
  54.        
  55.         des(plain_tab, key_tab, 1, cipher1);

  56.         ES = 0;
  57.         for(n=0;n<8;n++)
  58.         {
  59.                 SBUF=cipher1[n];   //回应发送者以成功接收
  60.                 while(!TI);                       
  61.                 TI = 0;      //手动清零发送中断标志位
  62.         }
  63.        
  64.         ES = 1;

  65.         while(1)
  66.         {

  67.                 times++;
  68.                 if (times%10==0)
  69.                         Display_Bit(1,0x80);
  70.         else  
  71.                         Display_Bit(1,0x00);

  72.                 if(Uart_DES == 1)
  73.                 {
  74.                         Uart_DES = 0;
  75.                 }
  76.         }
  77. }

  78. void Uart_Isr() interrupt 4
  79. {
  80.         ES = 0;
  81.         if(SBUF==0xA5)
  82.         {
  83.                 // uchar n;
  84.                 RI=0;
  85.                 // while(!RI);
  86.                 // RI=0;
  87.                 //Uart_len=SBUF;  //接收数据长度
  88.                 Uart_DES = 1;
  89.                 for(n=0;n<8;n++)  //开始接收数据
  90.                         {
  91.                                 while(!RI);
  92.                                 RI=0;
  93.                                 RxdBuff[n]=SBUF;
  94.                         }
  95.                 for(n=0;n<8;n++)
  96.                 {
  97.                         SBUF=RxdBuff[n];   //回应发送者以成功接收
  98.                         while(!TI);                       
  99.                         TI = 0;      //手动清零发送中断标志位
  100.                 }
  101.     }                       
  102.         else{
  103.                 SBUF=0x0E;   //回应发送者接收失败
  104.                 while(!TI);                       
  105.                 TI = 0;                  
  106.                 RI=0;  
  107.         }       
  108.         ES=1;
  109. }


复制代码


51hei截图_20210604185725.png (41.28 KB, 下载次数: 68)

51hei截图_20210604185725.png

51hei.png (6.79 KB, 下载次数: 47)

51hei.png

des.zip

120.43 KB, 下载次数: 30, 下载积分: 黑币 -5

DES, stc12c56

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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