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
| #include <bits/stdc++.h> using namespace std; #define MX ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)) void xxteaEncrtpy(uint32_t *v, size_t n, uint32_t *k) { uint32_t y, z, sum; uint32_t p, rounds, e; uint32_t delta = 0x9E3779B9; 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 xxteaDecrypt(uint32_t *v, size_t n, uint32_t *k) { uint32_t y, z, sum; uint32_t p, rounds, e; uint32_t delta = 0x9E3779B9; 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 k[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210}; char v[] = "Eleven11"; xxteaEncrtpy((uint32_t *)v, strlen(v) / 4, k); for (int i = 0; i < 8; i++) printf("%c", v[i] & 0xFF); printf("\n"); xxteaDecrypt((uint32_t *)v, strlen(v) / 4, k); for (int i = 0; i < 8; i++) printf("%c", v[i]); printf("\n"); return 0; }
|