找回密码
 立即注册
查看: 142|回复: 3

STC32的芯片能不能跑3DES加密和解密算法?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2026-03-16 20:48:36

24

主题

129

回帖

592

积分

高级会员

积分
592
发表于 2026-2-9 17:15:40 | 显示全部楼层 |阅读模式
如题,串口通讯,需要3DES加解密,能不能跑的起来?

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:183
  • 最近打卡:2026-03-27 00:18:27

25

主题

231

回帖

2079

积分

金牌会员

积分
2079
发表于 2026-2-9 19:07:57 | 显示全部楼层
这个完全没问题,支持C语言就可以。
没有硬件加速器,用软件计算。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2026-03-27 08:57:04
已绑定手机

104

主题

4202

回帖

9329

积分

荣誉版主

无情的代码机器

积分
9329
发表于 2026-2-9 21:14:18 | 显示全部楼层
可以研究openssl源码移植

以下示例代码摘自:3DES加解密 C语言 - 单行道| - 博客园
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define DES_LONG unsigned long
  5. #define LEN_OF_KEY 24
  6. #define ITERATIONS 16
  7. #define c2l(c,l)        (l =((DES_LONG)(*((c)++)))    , \
  8.                          l|=((DES_LONG)(*((c)++)))<< 8L, \
  9.                          l|=((DES_LONG)(*((c)++)))<<16L, \
  10.                          l|=((DES_LONG)(*((c)++)))<<24L)
  11. #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \
  12.                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
  13.                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
  14.                          *((c)++)=(unsigned char)(((l)>>24L)&0xff))
  15. #define ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
  16. #define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
  17. #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
  18.         u=R^s[S  ]; \
  19.         t=R^s[S+1]
  20. #define D_ENCRYPT(LL,R,S) {\
  21.         LOAD_DATA_tmp(R,S,u,t,E0,E1); \
  22.         t=ROTATE(t,4); \
  23.         LL^=\
  24.                 DES_SPtrans[0][(u>> 2L)&0x3f]^ \
  25.                 DES_SPtrans[2][(u>>10L)&0x3f]^ \
  26.                 DES_SPtrans[4][(u>>18L)&0x3f]^ \
  27.                 DES_SPtrans[6][(u>>26L)&0x3f]^ \
  28.                 DES_SPtrans[1][(t>> 2L)&0x3f]^ \
  29.                 DES_SPtrans[3][(t>>10L)&0x3f]^ \
  30.                 DES_SPtrans[5][(t>>18L)&0x3f]^ \
  31.                 DES_SPtrans[7][(t>>26L)&0x3f]; }
  32. #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
  33.         (b)^=(t),\
  34.         (a)^=((t)<<(n)))
  35. #define IP(l,r) \
  36.         { \
  37.         register DES_LONG tt; \
  38.         PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
  39.         PERM_OP(l,r,tt,16,0x0000ffffL); \
  40.         PERM_OP(r,l,tt, 2,0x33333333L); \
  41.         PERM_OP(l,r,tt, 8,0x00ff00ffL); \
  42.         PERM_OP(r,l,tt, 1,0x55555555L); \
  43.         }
  44. #define FP(l,r) \
  45.         { \
  46.         register DES_LONG tt; \
  47.         PERM_OP(l,r,tt, 1,0x55555555L); \
  48.         PERM_OP(r,l,tt, 8,0x00ff00ffL); \
  49.         PERM_OP(l,r,tt, 2,0x33333333L); \
  50.         PERM_OP(r,l,tt,16,0x0000ffffL); \
  51.         PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
  52.         }
  53. extern const DES_LONG DES_SPtrans[8][64];
  54. #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
  55.         (a)=(a)^(t)^(t>>(16-(n))))
  56. static const DES_LONG des_skb[8][64] = {
  57.     {
  58.      /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  59.      0x00000000L, 0x00000010L, 0x20000000L, 0x20000010L,
  60.      0x00010000L, 0x00010010L, 0x20010000L, 0x20010010L,
  61.      0x00000800L, 0x00000810L, 0x20000800L, 0x20000810L,
  62.      0x00010800L, 0x00010810L, 0x20010800L, 0x20010810L,
  63.      0x00000020L, 0x00000030L, 0x20000020L, 0x20000030L,
  64.      0x00010020L, 0x00010030L, 0x20010020L, 0x20010030L,
  65.      0x00000820L, 0x00000830L, 0x20000820L, 0x20000830L,
  66.      0x00010820L, 0x00010830L, 0x20010820L, 0x20010830L,
  67.      0x00080000L, 0x00080010L, 0x20080000L, 0x20080010L,
  68.      0x00090000L, 0x00090010L, 0x20090000L, 0x20090010L,
  69.      0x00080800L, 0x00080810L, 0x20080800L, 0x20080810L,
  70.      0x00090800L, 0x00090810L, 0x20090800L, 0x20090810L,
  71.      0x00080020L, 0x00080030L, 0x20080020L, 0x20080030L,
  72.      0x00090020L, 0x00090030L, 0x20090020L, 0x20090030L,
  73.      0x00080820L, 0x00080830L, 0x20080820L, 0x20080830L,
  74.      0x00090820L, 0x00090830L, 0x20090820L, 0x20090830L,
  75.      },
  76.     {
  77.      /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
  78.      0x00000000L, 0x02000000L, 0x00002000L, 0x02002000L,
  79.      0x00200000L, 0x02200000L, 0x00202000L, 0x02202000L,
  80.      0x00000004L, 0x02000004L, 0x00002004L, 0x02002004L,
  81.      0x00200004L, 0x02200004L, 0x00202004L, 0x02202004L,
  82.      0x00000400L, 0x02000400L, 0x00002400L, 0x02002400L,
  83.      0x00200400L, 0x02200400L, 0x00202400L, 0x02202400L,
  84.      0x00000404L, 0x02000404L, 0x00002404L, 0x02002404L,
  85.      0x00200404L, 0x02200404L, 0x00202404L, 0x02202404L,
  86.      0x10000000L, 0x12000000L, 0x10002000L, 0x12002000L,
  87.      0x10200000L, 0x12200000L, 0x10202000L, 0x12202000L,
  88.      0x10000004L, 0x12000004L, 0x10002004L, 0x12002004L,
  89.      0x10200004L, 0x12200004L, 0x10202004L, 0x12202004L,
  90.      0x10000400L, 0x12000400L, 0x10002400L, 0x12002400L,
  91.      0x10200400L, 0x12200400L, 0x10202400L, 0x12202400L,
  92.      0x10000404L, 0x12000404L, 0x10002404L, 0x12002404L,
  93.      0x10200404L, 0x12200404L, 0x10202404L, 0x12202404L,
  94.      },
  95.     {
  96.      /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
  97.      0x00000000L, 0x00000001L, 0x00040000L, 0x00040001L,
  98.      0x01000000L, 0x01000001L, 0x01040000L, 0x01040001L,
  99.      0x00000002L, 0x00000003L, 0x00040002L, 0x00040003L,
  100.      0x01000002L, 0x01000003L, 0x01040002L, 0x01040003L,
  101.      0x00000200L, 0x00000201L, 0x00040200L, 0x00040201L,
  102.      0x01000200L, 0x01000201L, 0x01040200L, 0x01040201L,
  103.      0x00000202L, 0x00000203L, 0x00040202L, 0x00040203L,
  104.      0x01000202L, 0x01000203L, 0x01040202L, 0x01040203L,
  105.      0x08000000L, 0x08000001L, 0x08040000L, 0x08040001L,
  106.      0x09000000L, 0x09000001L, 0x09040000L, 0x09040001L,
  107.      0x08000002L, 0x08000003L, 0x08040002L, 0x08040003L,
  108.      0x09000002L, 0x09000003L, 0x09040002L, 0x09040003L,
  109.      0x08000200L, 0x08000201L, 0x08040200L, 0x08040201L,
  110.      0x09000200L, 0x09000201L, 0x09040200L, 0x09040201L,
  111.      0x08000202L, 0x08000203L, 0x08040202L, 0x08040203L,
  112.      0x09000202L, 0x09000203L, 0x09040202L, 0x09040203L,
  113.      },
  114.     {
  115.      /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
  116.      0x00000000L, 0x00100000L, 0x00000100L, 0x00100100L,
  117.      0x00000008L, 0x00100008L, 0x00000108L, 0x00100108L,
  118.      0x00001000L, 0x00101000L, 0x00001100L, 0x00101100L,
  119.      0x00001008L, 0x00101008L, 0x00001108L, 0x00101108L,
  120.      0x04000000L, 0x04100000L, 0x04000100L, 0x04100100L,
  121.      0x04000008L, 0x04100008L, 0x04000108L, 0x04100108L,
  122.      0x04001000L, 0x04101000L, 0x04001100L, 0x04101100L,
  123.      0x04001008L, 0x04101008L, 0x04001108L, 0x04101108L,
  124.      0x00020000L, 0x00120000L, 0x00020100L, 0x00120100L,
  125.      0x00020008L, 0x00120008L, 0x00020108L, 0x00120108L,
  126.      0x00021000L, 0x00121000L, 0x00021100L, 0x00121100L,
  127.      0x00021008L, 0x00121008L, 0x00021108L, 0x00121108L,
  128.      0x04020000L, 0x04120000L, 0x04020100L, 0x04120100L,
  129.      0x04020008L, 0x04120008L, 0x04020108L, 0x04120108L,
  130.      0x04021000L, 0x04121000L, 0x04021100L, 0x04121100L,
  131.      0x04021008L, 0x04121008L, 0x04021108L, 0x04121108L,
  132.      },
  133.     {
  134.      /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  135.      0x00000000L, 0x10000000L, 0x00010000L, 0x10010000L,
  136.      0x00000004L, 0x10000004L, 0x00010004L, 0x10010004L,
  137.      0x20000000L, 0x30000000L, 0x20010000L, 0x30010000L,
  138.      0x20000004L, 0x30000004L, 0x20010004L, 0x30010004L,
  139.      0x00100000L, 0x10100000L, 0x00110000L, 0x10110000L,
  140.      0x00100004L, 0x10100004L, 0x00110004L, 0x10110004L,
  141.      0x20100000L, 0x30100000L, 0x20110000L, 0x30110000L,
  142.      0x20100004L, 0x30100004L, 0x20110004L, 0x30110004L,
  143.      0x00001000L, 0x10001000L, 0x00011000L, 0x10011000L,
  144.      0x00001004L, 0x10001004L, 0x00011004L, 0x10011004L,
  145.      0x20001000L, 0x30001000L, 0x20011000L, 0x30011000L,
  146.      0x20001004L, 0x30001004L, 0x20011004L, 0x30011004L,
  147.      0x00101000L, 0x10101000L, 0x00111000L, 0x10111000L,
  148.      0x00101004L, 0x10101004L, 0x00111004L, 0x10111004L,
  149.      0x20101000L, 0x30101000L, 0x20111000L, 0x30111000L,
  150.      0x20101004L, 0x30101004L, 0x20111004L, 0x30111004L,
  151.      },
  152.     {
  153.      /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
  154.      0x00000000L, 0x08000000L, 0x00000008L, 0x08000008L,
  155.      0x00000400L, 0x08000400L, 0x00000408L, 0x08000408L,
  156.      0x00020000L, 0x08020000L, 0x00020008L, 0x08020008L,
  157.      0x00020400L, 0x08020400L, 0x00020408L, 0x08020408L,
  158.      0x00000001L, 0x08000001L, 0x00000009L, 0x08000009L,
  159.      0x00000401L, 0x08000401L, 0x00000409L, 0x08000409L,
  160.      0x00020001L, 0x08020001L, 0x00020009L, 0x08020009L,
  161.      0x00020401L, 0x08020401L, 0x00020409L, 0x08020409L,
  162.      0x02000000L, 0x0A000000L, 0x02000008L, 0x0A000008L,
  163.      0x02000400L, 0x0A000400L, 0x02000408L, 0x0A000408L,
  164.      0x02020000L, 0x0A020000L, 0x02020008L, 0x0A020008L,
  165.      0x02020400L, 0x0A020400L, 0x02020408L, 0x0A020408L,
  166.      0x02000001L, 0x0A000001L, 0x02000009L, 0x0A000009L,
  167.      0x02000401L, 0x0A000401L, 0x02000409L, 0x0A000409L,
  168.      0x02020001L, 0x0A020001L, 0x02020009L, 0x0A020009L,
  169.      0x02020401L, 0x0A020401L, 0x02020409L, 0x0A020409L,
  170.      },
  171.     {
  172.      /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
  173.      0x00000000L, 0x00000100L, 0x00080000L, 0x00080100L,
  174.      0x01000000L, 0x01000100L, 0x01080000L, 0x01080100L,
  175.      0x00000010L, 0x00000110L, 0x00080010L, 0x00080110L,
  176.      0x01000010L, 0x01000110L, 0x01080010L, 0x01080110L,
  177.      0x00200000L, 0x00200100L, 0x00280000L, 0x00280100L,
  178.      0x01200000L, 0x01200100L, 0x01280000L, 0x01280100L,
  179.      0x00200010L, 0x00200110L, 0x00280010L, 0x00280110L,
  180.      0x01200010L, 0x01200110L, 0x01280010L, 0x01280110L,
  181.      0x00000200L, 0x00000300L, 0x00080200L, 0x00080300L,
  182.      0x01000200L, 0x01000300L, 0x01080200L, 0x01080300L,
  183.      0x00000210L, 0x00000310L, 0x00080210L, 0x00080310L,
  184.      0x01000210L, 0x01000310L, 0x01080210L, 0x01080310L,
  185.      0x00200200L, 0x00200300L, 0x00280200L, 0x00280300L,
  186.      0x01200200L, 0x01200300L, 0x01280200L, 0x01280300L,
  187.      0x00200210L, 0x00200310L, 0x00280210L, 0x00280310L,
  188.      0x01200210L, 0x01200310L, 0x01280210L, 0x01280310L,
  189.      },
  190.     {
  191.      /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
  192.      0x00000000L, 0x04000000L, 0x00040000L, 0x04040000L,
  193.      0x00000002L, 0x04000002L, 0x00040002L, 0x04040002L,
  194.      0x00002000L, 0x04002000L, 0x00042000L, 0x04042000L,
  195.      0x00002002L, 0x04002002L, 0x00042002L, 0x04042002L,
  196.      0x00000020L, 0x04000020L, 0x00040020L, 0x04040020L,
  197.      0x00000022L, 0x04000022L, 0x00040022L, 0x04040022L,
  198.      0x00002020L, 0x04002020L, 0x00042020L, 0x04042020L,
  199.      0x00002022L, 0x04002022L, 0x00042022L, 0x04042022L,
  200.      0x00000800L, 0x04000800L, 0x00040800L, 0x04040800L,
  201.      0x00000802L, 0x04000802L, 0x00040802L, 0x04040802L,
  202.      0x00002800L, 0x04002800L, 0x00042800L, 0x04042800L,
  203.      0x00002802L, 0x04002802L, 0x00042802L, 0x04042802L,
  204.      0x00000820L, 0x04000820L, 0x00040820L, 0x04040820L,
  205.      0x00000822L, 0x04000822L, 0x00040822L, 0x04040822L,
  206.      0x00002820L, 0x04002820L, 0x00042820L, 0x04042820L,
  207.      0x00002822L, 0x04002822L, 0x00042822L, 0x04042822L,
  208.      }
  209. };
  210. const DES_LONG DES_SPtrans[8][64] = {
  211.     {
  212.         /* nibble 0 */
  213.         0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L,
  214.         0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L,
  215.         0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L,
  216.         0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L,
  217.         0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
  218.         0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L,
  219.         0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L,
  220.         0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L,
  221.         0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L,
  222.         0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
  223.         0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L,
  224.         0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L,
  225.         0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L,
  226.         0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L,
  227.         0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
  228.         0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L,
  229.     },
  230.     {
  231.         /* nibble 1 */
  232.         0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L,
  233.         0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L,
  234.         0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L,
  235.         0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L,
  236.         0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
  237.         0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L,
  238.         0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L,
  239.         0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L,
  240.         0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L,
  241.         0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
  242.         0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L,
  243.         0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L,
  244.         0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L,
  245.         0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L,
  246.         0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
  247.         0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L,
  248.     },
  249.     {
  250.         /* nibble 2 */
  251.         0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L,
  252.         0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L,
  253.         0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L,
  254.         0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L,
  255.         0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
  256.         0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L,
  257.         0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L,
  258.         0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L,
  259.         0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L,
  260.         0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
  261.         0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L,
  262.         0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L,
  263.         0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L,
  264.         0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L,
  265.         0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
  266.         0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L,
  267.     },
  268.     {
  269.         /* nibble 3 */
  270.         0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L,
  271.         0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L,
  272.         0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L,
  273.         0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L,
  274.         0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
  275.         0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L,
  276.         0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L,
  277.         0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L,
  278.         0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L,
  279.         0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
  280.         0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L,
  281.         0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L,
  282.         0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L,
  283.         0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L,
  284.         0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
  285.         0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L,
  286.     },
  287.     {
  288.         /* nibble 4 */
  289.         0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L,
  290.         0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L,
  291.         0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L,
  292.         0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L,
  293.         0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
  294.         0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L,
  295.         0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L,
  296.         0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L,
  297.         0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L,
  298.         0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
  299.         0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L,
  300.         0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L,
  301.         0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L,
  302.         0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L,
  303.         0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
  304.         0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L,
  305.     },
  306.     {
  307.         /* nibble 5 */
  308.         0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L,
  309.         0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L,
  310.         0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L,
  311.         0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L,
  312.         0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
  313.         0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L,
  314.         0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L,
  315.         0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L,
  316.         0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L,
  317.         0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
  318.         0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L,
  319.         0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L,
  320.         0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L,
  321.         0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L,
  322.         0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
  323.         0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L,
  324.     },
  325.     {
  326.         /* nibble 6 */
  327.         0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L,
  328.         0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L,
  329.         0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L,
  330.         0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L,
  331.         0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
  332.         0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L,
  333.         0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L,
  334.         0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L,
  335.         0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L,
  336.         0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
  337.         0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L,
  338.         0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L,
  339.         0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L,
  340.         0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L,
  341.         0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
  342.         0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L,
  343.     },
  344.     {
  345.         /* nibble 7 */
  346.         0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L,
  347.         0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L,
  348.         0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L,
  349.         0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L,
  350.         0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
  351.         0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L,
  352.         0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L,
  353.         0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L,
  354.         0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L,
  355.         0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
  356.         0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L,
  357.         0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L,
  358.         0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L,
  359.         0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L,
  360.         0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
  361.         0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L,
  362.     }
  363. };
  364. typedef unsigned char DES_cblock[8];
  365. typedef /* const */ unsigned char const_DES_cblock[8];
  366. typedef struct DES_ks {
  367.     union {
  368.         DES_cblock cblock;
  369.         /*
  370.          * make sure things are correct size on machines with 8 byte longs
  371.          */
  372.         DES_LONG deslong[2];
  373.     } ks[16];
  374. } DES_key_schedule;
  375. # define DES_ENCRYPT     1
  376. # define DES_DECRYPT     0
  377. void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
  378.                       DES_key_schedule *ks1, DES_key_schedule *ks2,
  379.                       DES_key_schedule *ks3, int enc);
  380. void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc);
  381. void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc);
  382. void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
  383.                   DES_key_schedule *ks2, DES_key_schedule *ks3);
  384. void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
  385.                   DES_key_schedule *ks2, DES_key_schedule *ks3);
  386. void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
  387. /************************************************************************
  388. * 3DES-ECB加密方式
  389. * 8字节密钥,加密内容8位补齐,补齐方式为:PKCS7。
  390. *
  391. * file: des3_func.c.c
  392. * gcc -Wall -O2 -o des3_func des3_func.c
  393. *
  394. * @author  Edward
  395. *
  396. ************************************************************************/
  397. int main(int argc, char *argv[])
  398. {
  399.     int i = 0;
  400.     int len = 0;
  401.     int nlen = 0;
  402.     int klen = 0;
  403.     char ch = '\0';
  404.     char *k = "ABCDEFGHABCDEFGHABCDEFGH";
  405.     char *data = "123456789ABCDEFG";  /* 原始明文 */
  406.     unsigned char key[LEN_OF_KEY];
  407.     unsigned char src[64] = {0};
  408.     unsigned char out[64] = {0};
  409.     unsigned char tmp[64] = {0};
  410.     unsigned char block[8] = {0};
  411.     DES_key_schedule ks1, ks2, ks3;
  412.     /* 设置密码表 */
  413.     klen = strlen(k);
  414.     memcpy(key, k, klen);
  415.     memset(key + klen, 0x00, LEN_OF_KEY - klen);
  416.     memcpy(block, key, sizeof(block));
  417.     DES_set_key_unchecked((const_DES_cblock *)block, &ks1);
  418.     memcpy(block, key + 8, sizeof(block));
  419.     DES_set_key_unchecked((const_DES_cblock *)block, &ks2);
  420.     memcpy(block, key + 16, sizeof(block));
  421.     DES_set_key_unchecked((const_DES_cblock *)block, &ks3);
  422.     nlen = strlen(data);
  423.     memcpy(src, data, nlen);
  424.     //len = (nlen / 8 + (nlen % 8 ? 1: 0)) * 8;
  425.     len = (nlen / 8 + 1) * 8;
  426.     ch = 8 - nlen % 8;
  427.     //memset(src + nlen, ch, (8 - nlen % 8) % 8);
  428.      memset(src + nlen, ch, (8 - nlen % 8));
  429.     for (i = 0; i < len; i += 8) {
  430.         DES_ecb3_encrypt((const_DES_cblock *)(src + i), (DES_cblock *)(out + i), &ks1, &ks2, &ks3, DES_ENCRYPT);
  431.     }
  432.     printf("encrypted Hex:");
  433.     for (i = 0; i < len; i++) {
  434.         printf("%02X" , *(out + i));
  435.     }
  436.     printf("\n");
  437.     for (i = 0; i < len; i += 8) {
  438.         DES_ecb3_encrypt((const_DES_cblock *)(out + i), (DES_cblock *)(tmp + i), &ks1, &ks2, &ks3, DES_DECRYPT);
  439.     }
  440.     printf("decrypted Hex:");
  441.     for (i = 0; i < len; i++) {
  442.         printf("%02X", *(tmp + i));
  443.     }
  444.     printf("\n");
  445.     printf("decrypted Bin:");
  446.     for (i = 0; i < len; i++) {
  447.         printf("%c", *(tmp + i));
  448.     }
  449.     printf("\n");
  450.     return 0;
  451. }
  452. void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
  453. {
  454.     static const int shifts2[16] =
  455.         { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 };
  456.     register DES_LONG c, d, t, s, t2;
  457.     register const unsigned char *in;
  458.     register DES_LONG *k;
  459.     register int i;
  460.     k = &schedule->ks->deslong[0];
  461.     in = &(*key)[0];
  462.     c2l(in, c);
  463.     c2l(in, d);
  464.     /*
  465.      * do PC1 in 47 simple operations :-) Thanks to John Fletcher
  466.      * (john_fletcher@lccmail.ocf.llnl.gov) for the inspiration. :-)
  467.      */
  468.     PERM_OP(d, c, t, 4, 0x0f0f0f0fL);
  469.     HPERM_OP(c, t, -2, 0xcccc0000L);
  470.     HPERM_OP(d, t, -2, 0xcccc0000L);
  471.     PERM_OP(d, c, t, 1, 0x55555555L);
  472.     PERM_OP(c, d, t, 8, 0x00ff00ffL);
  473.     PERM_OP(d, c, t, 1, 0x55555555L);
  474.     d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) |
  475.          ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L));
  476.     c &= 0x0fffffffL;
  477.     for (i = 0; i < ITERATIONS; i++) {
  478.         if (shifts2[i]) {
  479.             c = ((c >> 2L) | (c << 26L));
  480.             d = ((d >> 2L) | (d << 26L));
  481.         } else {
  482.             c = ((c >> 1L) | (c << 27L));
  483.             d = ((d >> 1L) | (d << 27L));
  484.         }
  485.         c &= 0x0fffffffL;
  486.         d &= 0x0fffffffL;
  487.         /*
  488.          * could be a few less shifts but I am to lazy at this point in time
  489.          * to investigate
  490.          */
  491.         s = des_skb[0][(c) & 0x3f] |
  492.             des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] |
  493.             des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] |
  494.             des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) |
  495.                        ((c >> 22L) & 0x38)];
  496.         t = des_skb[4][(d) & 0x3f] |
  497.             des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] |
  498.             des_skb[6][(d >> 15L) & 0x3f] |
  499.             des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)];
  500.         /* table contained 0213 4657 */
  501.         t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL;
  502.         *(k++) = ROTATE(t2, 30) & 0xffffffffL;
  503.         t2 = ((s >> 16L) | (t & 0xffff0000L));
  504.         *(k++) = ROTATE(t2, 26) & 0xffffffffL;
  505.     }
  506. }
  507. void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
  508.                       DES_key_schedule *ks1, DES_key_schedule *ks2,
  509.                       DES_key_schedule *ks3, int enc)
  510. {
  511.     register DES_LONG l0, l1;
  512.     DES_LONG ll[2];
  513.     const unsigned char *in = &(*input)[0];
  514.     unsigned char *out = &(*output)[0];
  515.     c2l(in, l0);
  516.     c2l(in, l1);
  517.     ll[0] = l0;
  518.     ll[1] = l1;
  519.     if (enc)
  520.         DES_encrypt3(ll, ks1, ks2, ks3);
  521.     else
  522.         DES_decrypt3(ll, ks1, ks2, ks3);
  523.     l0 = ll[0];
  524.     l1 = ll[1];
  525.     l2c(l0, out);
  526.     l2c(l1, out);
  527. }
  528. void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc)
  529. {
  530.     register DES_LONG l, r, t, u;
  531.     /*
  532. #ifdef DES_PTR
  533.     register const unsigned char *des_SP = (const unsigned char *)DES_SPtrans;
  534. #endif
  535. #ifndef DES_UNROLL
  536. #endif*/
  537.     register int i;
  538.     register DES_LONG *s;
  539.     r = data[0];
  540.     l = data[1];
  541.     IP(r, l);
  542.     /*
  543.      * Things have been modified so that the initial rotate is done outside
  544.      * the loop.  This required the DES_SPtrans values in sp.h to be rotated
  545.      * 1 bit to the right. One perl script later and things have a 5% speed
  546.      * up on a sparc2. Thanks to Richard Outerbridge
  547.      * <71755.204@CompuServe.COM> for pointing this out.
  548.      */
  549.     /* clear the top bits on machines with 8byte longs */
  550.     /* shift left by 2 */
  551.     r = ROTATE(r, 29) & 0xffffffffL;
  552.     l = ROTATE(l, 29) & 0xffffffffL;
  553.     s = ks->ks->deslong;
  554.     /*
  555.      * I don't know if it is worth the effort of loop unrolling the inner
  556.      * loop
  557.      */
  558.     if (enc) {
  559.         for (i = 0; i < 32; i += 4) {
  560.             D_ENCRYPT(l, r, i + 0); /* 1 */
  561.             D_ENCRYPT(r, l, i + 2); /* 2 */
  562.         }
  563.     } else {
  564.         for (i = 30; i > 0; i -= 4) {
  565.             D_ENCRYPT(l, r, i - 0); /* 16 */
  566.             D_ENCRYPT(r, l, i - 2); /* 15 */
  567.         }
  568.     }
  569.     /* rotate and clear the top bits on machines with 8byte longs */
  570.     l = ROTATE(l, 3) & 0xffffffffL;
  571.     r = ROTATE(r, 3) & 0xffffffffL;
  572.     FP(r, l);
  573.     data[0] = l;
  574.     data[1] = r;
  575.     l = r = t = u = 0;
  576. }
  577. void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc)
  578. {
  579.     register DES_LONG l, r, t, u;
  580.     /*
  581. #ifdef DES_PTR
  582.     register const unsigned char *des_SP = (const unsigned char *)DES_SPtrans;
  583. #endif
  584. #ifndef DES_UNROLL
  585.     register int i;
  586. #endif*/
  587.     register int i;
  588.     register DES_LONG *s;
  589.     r = data[0];
  590.     l = data[1];
  591.     /*
  592.      * Things have been modified so that the initial rotate is done outside
  593.      * the loop.  This required the DES_SPtrans values in sp.h to be rotated
  594.      * 1 bit to the right. One perl script later and things have a 5% speed
  595.      * up on a sparc2. Thanks to Richard Outerbridge
  596.      * <71755.204@CompuServe.COM> for pointing this out.
  597.      */
  598.     /* clear the top bits on machines with 8byte longs */
  599.     r = ROTATE(r, 29) & 0xffffffffL;
  600.     l = ROTATE(l, 29) & 0xffffffffL;
  601.     s = ks->ks->deslong;
  602.     /*
  603.      * I don't know if it is worth the effort of loop unrolling the inner
  604.      * loop
  605.      */
  606.     if (enc) {
  607.         for (i = 0; i < 32; i += 4) {
  608.             D_ENCRYPT(l, r, i + 0); /* 1 */
  609.             D_ENCRYPT(r, l, i + 2); /* 2 */
  610.         }
  611.     } else {
  612.         for (i = 30; i > 0; i -= 4) {
  613.             D_ENCRYPT(l, r, i - 0); /* 16 */
  614.             D_ENCRYPT(r, l, i - 2); /* 15 */
  615.         }
  616.     }
  617.     /* rotate and clear the top bits on machines with 8byte longs */
  618.     data[0] = ROTATE(l, 3) & 0xffffffffL;
  619.     data[1] = ROTATE(r, 3) & 0xffffffffL;
  620.     l = r = t = u = 0;
  621. }
  622. void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
  623.                   DES_key_schedule *ks2, DES_key_schedule *ks3)
  624. {
  625.     register DES_LONG l, r;
  626.     l = data[0];
  627.     r = data[1];
  628.     IP(l, r);
  629.     data[0] = l;
  630.     data[1] = r;
  631.     DES_encrypt2((DES_LONG *)data, ks1, DES_ENCRYPT);
  632.     DES_encrypt2((DES_LONG *)data, ks2, DES_DECRYPT);
  633.     DES_encrypt2((DES_LONG *)data, ks3, DES_ENCRYPT);
  634.     l = data[0];
  635.     r = data[1];
  636.     FP(r, l);
  637.     data[0] = l;
  638.     data[1] = r;
  639. }
  640. void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
  641.                   DES_key_schedule *ks2, DES_key_schedule *ks3)
  642. {
  643.     register DES_LONG l, r;
  644.     l = data[0];
  645.     r = data[1];
  646.     IP(l, r);
  647.     data[0] = l;
  648.     data[1] = r;
  649.     DES_encrypt2((DES_LONG *)data, ks3, DES_DECRYPT);
  650.     DES_encrypt2((DES_LONG *)data, ks2, DES_ENCRYPT);
  651.     DES_encrypt2((DES_LONG *)data, ks1, DES_DECRYPT);
  652.     l = data[0];
  653.     r = data[1];
  654.     FP(r, l);
  655.     data[0] = l;
  656.     data[1] = r;
  657. }
复制代码


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2026-03-16 20:48:36

24

主题

129

回帖

592

积分

高级会员

积分
592
发表于 2026-2-13 09:16:36 | 显示全部楼层
erci*** 发表于 2026-2-9 21:14
可以研究openssl源码移植

以下示例代码摘自:3DES加解密 C语言 - 单行道| - 博客园

这么复杂。
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-27 11:22 , Processed in 0.108622 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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