1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include <stdio.h> #include <stdint.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void encrypt(uint32_t *v, int n, uint32_t const key[4]) { uint32_t y, z, sum; unsigned p, rounds, e; rounds = 6 + 52 / n; sum = 0; z = v[n - 1]; do { sum += DELTA; e = (sum >> 2) & 3; for (p = 0; p < n - 1; p++) { y = v[p + 1]; z = v[p] += MX; } y = v[0]; z = v[n - 1] += MX; } while (--rounds); } void decrypt(uint32_t *v, int n, uint32_t const key[4]){ uint32_t y, z, sum; unsigned p, rounds, e;
rounds = 6 + 52 / n; sum = rounds*DELTA; y = v[0]; do { e = (sum >> 2) & 3; for (p = n - 1; p>0; p--) { z = v[p - 1]; y = v[p] -= MX; } z = v[n - 1]; y = v[0] -= MX; sum -= DELTA; } while (--rounds); }
int main() { uint32_t v[6] = {0x40cea5bc,0xe7b2b2f4, 0x129d12a9,0x5bc810ae, 0x1d06d73d,0xdcf870dc}; uint32_t k[4] = { 1,2,3,4 };
int n = sizeof(v) / sizeof(uint32_t);
printf("加密前原始数据:0x%x 0x%x\n", v[0], v[1]); encrypt(v, n, k); printf("加密后的数据:0x%x 0x%x\n", v[0], v[1]); decrypt(v, n, k); printf("解密后的数据:0x%x 0x%x\n", v[0], v[1]); for (int i = 0; i < n; i++) { for (int j = 0; j < sizeof(uint32_t) / sizeof(uint8_t); j++) { printf("%x", (v[i] >> (j * 8)) & 0xFF); } } printf("\n"); return 0; }
|