RC6加密C语言的例子,可以直接C编译器编译可以直接通过

  1 #include <stdio.h>
  2   
  3 #define w 32    /* word为32bits */
  4 #define r 20    //加密轮数
  5 
  6 #define P32 0xB7E15163      /* 定义两个常量,用于子密钥生成 */
  7 #define Q32 0x9E3779B9
  8 
 12 #define bytes   (w / 8)                        /* 定义字节*/
 13 #define c       ((b + bytes - 1) / bytes)      /* 密钥字数 */
 14 #define R24     (2 * r + 4)
 15 #define lgw     5                           /* log2(w)  */
 16 
 17 /* 定义逻辑移位操作运算 */
 18 #define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1)))))
 19 #define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1)))))
 20 
 21 unsigned int S[R24 - 1];                    /* 子密钥组 */
 22 
 23 void rc6_key_setup(unsigned char *K, int b)
 24 {
 25     int i, j, s, v;
 26     unsigned int L[(32 + bytes - 1) / bytes]; /* Big enough for max b */
 27     unsigned int A, B;
 28 
 29     L[c - 1] = 0;
 30     for (i = b - 1; i >= 0; i--)
 31         L[i / bytes] = (L[i / bytes] << 8) + K[i];
 32 
 33     S[0] = P32;
 34     for (i = 1; i <= 2 * r + 3; i++)
 35         S[i] = S[i - 1] + Q32;
 36 
 37     A = B = i = j = 0;
 38     v = R24;
 39     if (c > v) v = c;
 40     v *= 3;
 41 
 42     for (s = 1; s <= v; s++)
 43     {
 44         A = S[i] = ROTL(S[i] + A + B, 3);
 45         B = L[j] = ROTL(L[j] + A + B, A + B);
 46         i = (i + 1) % R24;
 47         j = (j + 1) % c;
 48     }
 49 }
 50 
 51 void rc6_block_encrypt(unsigned int *pt, unsigned int *ct)
 52 {
 53     unsigned int A, B, C, D, t, u, x;
 54     int i;
 55 
 56     A = pt[0];
 57     B = pt[1];
 58     C = pt[2];
 59     D = pt[3];
 60     B += S[0];
 61     D += S[1];
 62     for (i = 2; i <= 2 * r; i += 2)
 63     {
 64         t = ROTL(B * (2 * B + 1), lgw);
 65         u = ROTL(D * (2 * D + 1), lgw);
 66         A = ROTL(A ^ t, u) + S[i];
 67         C = ROTL(C ^ u, t) + S[i + 1];
 68         x = A;
 69         A = B;
 70         B = C;
 71         C = D;
 72         D = x;
 73     }
 74     A += S[2 * r + 2];
 75     C += S[2 * r + 3];
 76     ct[0] = A;
 77     ct[1] = B;
 78     ct[2] = C;
 79     ct[3] = D;
 80 }
 81 
 82 void rc6_block_decrypt(unsigned int *ct, unsigned int *pt)
 83 {
 84     unsigned int A, B, C, D, t, u, x;
 85     int i;
 86 
 87     A = ct[0];
 88     B = ct[1];
 89     C = ct[2];
 90     D = ct[3];
 91     C -= S[2 * r + 3];
 92     A -= S[2 * r + 2];
 93     for (i = 2 * r; i >= 2; i -= 2)
 94     {
 95         x = D;
 96         D = C;
 97         C = B;
 98         B = A;
 99         A = x;
100         u = ROTL(D * (2 * D + 1), lgw);
101         t = ROTL(B * (2 * B + 1), lgw);
102         C = ROTR(C - S[i + 1], t) ^ u;
103         A = ROTR(A - S[i], u) ^ t;
104     }
105     D -= S[1];
106     B -= S[0];
107     pt[0] = A;
108     pt[1] = B;
109     pt[2] = C;
110     pt[3] = D;    
111 }
112 
113 struct test_struct
114 {
115     int keylen;
116     unsigned char key[32];
117     unsigned int pt[4];
118     unsigned int ct[4];
119 } tests[] =
120 {
121     { 16,   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
123         {0x00000000, 0x00000000, 0x00000000, 0x00000000},
124         {0x36a5c38f, 0x78f7b156, 0x4edf29c1, 0x1ea44898},
125     },
126 
127     { 16,   {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
128          0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78},
129         {0x35241302, 0x79685746, 0xbdac9b8a, 0xf1e0dfce},
130         {0x2f194e52, 0x23c61547, 0x36f6511f, 0x183fa47e},
131     },
132 
133     { 24,   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
136         {0x00000000, 0x00000000, 0x00000000, 0x00000000},
137         {0xcb1bd66c, 0x38300b19, 0x163f8a4e, 0x82ae9086},
138     },
139 
140     { 24,   {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
141          0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78,
142          0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0},
143         {0x35241302, 0x79685746, 0xbdac9b8a, 0xf1e0dfce},
144         {0xd0298368, 0x0405e519, 0x2ae9521e, 0xd49152f9},
145     },
146 
147     { 32,   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
151         {0x00000000, 0x00000000, 0x00000000, 0x00000000},
152         {0x05bd5f8f, 0xa85fd110, 0xda3ffa93, 0xc27e856e},
153     },
154 
155     { 32,   {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
156          0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78,
157          0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0,
158          0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe},
159         {0x35241302, 0x79685746, 0xbdac9b8a, 0xf1e0dfce},
160         {0x161824c8, 0x89e4d7f0, 0xa116ad20, 0x485d4e67},
161     },
162 
163     {       0,
164     }
165 };
166 
167 int
168 main()
169 {
170     unsigned int ct[4], pt[4];
171     int i,j;
172     struct test_struct *p;
173 
174     for (p = tests, i = 1; p->keylen; p++, i++)
175     {
176         rc6_key_setup(p->key, p->keylen);
177         rc6_block_encrypt(p->pt, ct);
178         printf("Test   %d\n",i);
179 
180         printf("密钥是%d字:\n密钥为:",p->keylen);
181         for(j=0;j<p->keylen;j++)
182             printf("%.8lx ",p->key[j]);
183         printf("\n");
184         printf("加密:\n明文:%08x %08x %08x %08x\n",
185             p->pt[0], p->pt[1], p->pt[2], p->pt[3]);
186         printf("密文: %08x %08x %08x %08x\n",
187             ct[0], ct[1], ct[2], ct[3]);
188         rc6_block_decrypt(ct, pt);
189         printf("解密:\n密文:%08x %08x %08x %08x\n",
190             ct[0], ct[1], ct[2], ct[3]);
191         printf("明文: %08x %08x %08x %08x\n\n",
192             pt[0], pt[1], pt[2], pt[3]);
193     }
194     system("pause");
195     return 0;
196     
197 }
原文地址:https://www.cnblogs.com/yekang/p/2851158.html