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 77 78 79
| #include <stdio.h> #include <stdint.h> typedef uint32_t u32; const u32 delta = 0x9e3779b9; const int rounds = 32;
void encrypt(uint32_t * v , uint32_t * k) { u32 v0 = v[0], v1 = v[1]; u32 k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; u32 sum = 0;
for (int i = 0; i < rounds; i ++) { sum += delta; v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); }
v[0] = v0; v[1] = v1; }
void decrypt(uint32_t * v , uint32_t * k) { u32 v0 = v[0], v1 = v[1]; u32 k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; u32 sum = 32 * delta;
for(int i = 0; i < rounds; i ++) { v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); sum -= delta; }
v[0] = v0; v[1] = v1; }
void encrypt_multiple_blocks(unsigned char * text , unsigned char * key) { uint32_t *v = (uint32_t *)text; uint32_t *k = (uint32_t*)key; for (int i = 0; i < 8; i += 2) { encrypt(v + i, k); printf("加密后的数据:%u %u\n", v[i], v[i+1]); }
for (int i = 0; i < 32; i++) { printf("0x%x ,", text[i]); } }
void decrypt_multiple_blocks(unsigned char * text , unsigned char * key) { uint32_t *v = (uint32_t *)text; uint32_t *k = (uint32_t*)key; for (int i = 0; i < 8; i += 2) { decrypt(v + i, k); printf("解密后的数据:%u %u\n", v[i], v[i+1]); }
for (int i = 0; i < 32; i++) { printf("%c", text[i]); } }
unsigned char keys[] = "WelcomeToNewStar"; unsigned char plain[] = {0x66, 0x6c, 0x61, 0x67, 0x7b, 0x54, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x52, 0x5f, 0x54, 0x45, 0x41, 0x5f, 0x58, 0x54, 0x45, 0x41, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x58, 0x58, 0x54, 0x45, 0x41, 0x7d}; unsigned char cipher[] = {0x78 ,0x20 ,0xf7 ,0xb3 ,0xc5 ,0x42 ,0xce ,0xda ,0x85 ,0x59 ,0x21 ,0x1a ,0x26 ,0x56 ,0x5a ,0x59 ,0x29 ,0x2 ,0xd ,0xed ,0x7 ,0xa8 ,0xb9 ,0xee ,0x36 ,0x59 ,0x11 ,0x87 ,0xfd ,0x5c ,0x23 ,0x24}; int main() { unsigned char a; encrypt_multiple_blocks(plain, keys); decrypt_multiple_blocks(cipher , keys); return 0; }
|