📄 loop_serpent.c
字号:
if (key_len < 256) { while(i < 8) l_key[i++] = 0; i = key_len / 32; lk = 1 << key_len % 32; l_key[i] &= lk - 1; l_key[i] |= lk; } for(i = 0; i < 132; ++i) { lk = l_key[i] ^ l_key[i + 3] ^ l_key[i + 5] ^ l_key[i + 7] ^ 0x9e3779b9 ^ i; l_key[i + 8] = (lk << 11) | (lk >> 21); } GETKEY(r0, r1, r2, r3, 0); S3(r0,r1,r2,r3,r4); SETKEY(r1, r2, r3, r4, 0) GETKEY(r0, r1, r2, r3, 4); S2(r0,r1,r2,r3,r4); SETKEY(r2, r3, r1, r4, 4) GETKEY(r0, r1, r2, r3, 8); S1(r0,r1,r2,r3,r4); SETKEY(r3, r1, r2, r0, 8) GETKEY(r0, r1, r2, r3, 12); S0(r0,r1,r2,r3,r4); SETKEY(r1, r4, r2, r0, 12) GETKEY(r0, r1, r2, r3, 16); S7(r0,r1,r2,r3,r4); SETKEY(r2, r4, r3, r0, 16) GETKEY(r0, r1, r2, r3, 20); S6(r0,r1,r2,r3,r4) SETKEY(r0, r1, r4, r2, 20) GETKEY(r0, r1, r2, r3, 24); S5(r0,r1,r2,r3,r4); SETKEY(r1, r3, r0, r2, 24) GETKEY(r0, r1, r2, r3, 28); S4(r0,r1,r2,r3,r4) SETKEY(r1, r4, r0, r3, 28) GETKEY(r0, r1, r2, r3, 32); S3(r0,r1,r2,r3,r4); SETKEY(r1, r2, r3, r4, 32) GETKEY(r0, r1, r2, r3, 36); S2(r0,r1,r2,r3,r4); SETKEY(r2, r3, r1, r4, 36) GETKEY(r0, r1, r2, r3, 40); S1(r0,r1,r2,r3,r4); SETKEY(r3, r1, r2, r0, 40) GETKEY(r0, r1, r2, r3, 44); S0(r0,r1,r2,r3,r4); SETKEY(r1, r4, r2, r0, 44) GETKEY(r0, r1, r2, r3, 48); S7(r0,r1,r2,r3,r4); SETKEY(r2, r4, r3, r0, 48) GETKEY(r0, r1, r2, r3, 52); S6(r0,r1,r2,r3,r4) SETKEY(r0, r1, r4, r2, 52) GETKEY(r0, r1, r2, r3, 56); S5(r0,r1,r2,r3,r4); SETKEY(r1, r3, r0, r2, 56) GETKEY(r0, r1, r2, r3, 60); S4(r0,r1,r2,r3,r4) SETKEY(r1, r4, r0, r3, 60) GETKEY(r0, r1, r2, r3, 64); S3(r0,r1,r2,r3,r4); SETKEY(r1, r2, r3, r4, 64) GETKEY(r0, r1, r2, r3, 68); S2(r0,r1,r2,r3,r4); SETKEY(r2, r3, r1, r4, 68) GETKEY(r0, r1, r2, r3, 72); S1(r0,r1,r2,r3,r4); SETKEY(r3, r1, r2, r0, 72) GETKEY(r0, r1, r2, r3, 76); S0(r0,r1,r2,r3,r4); SETKEY(r1, r4, r2, r0, 76) GETKEY(r0, r1, r2, r3, 80); S7(r0,r1,r2,r3,r4); SETKEY(r2, r4, r3, r0, 80) GETKEY(r0, r1, r2, r3, 84); S6(r0,r1,r2,r3,r4) SETKEY(r0, r1, r4, r2, 84) GETKEY(r0, r1, r2, r3, 88); S5(r0,r1,r2,r3,r4); SETKEY(r1, r3, r0, r2, 88) GETKEY(r0, r1, r2, r3, 92); S4(r0,r1,r2,r3,r4) SETKEY(r1, r4, r0, r3, 92) GETKEY(r0, r1, r2, r3, 96); S3(r0,r1,r2,r3,r4); SETKEY(r1, r2, r3, r4, 96) GETKEY(r0, r1, r2, r3, 100); S2(r0,r1,r2,r3,r4); SETKEY(r2, r3, r1, r4, 100) GETKEY(r0, r1, r2, r3, 104); S1(r0,r1,r2,r3,r4); SETKEY(r3, r1, r2, r0, 104) GETKEY(r0, r1, r2, r3, 108); S0(r0,r1,r2,r3,r4); SETKEY(r1, r4, r2, r0, 108) GETKEY(r0, r1, r2, r3, 112); S7(r0,r1,r2,r3,r4); SETKEY(r2, r4, r3, r0, 112) GETKEY(r0, r1, r2, r3, 116); S6(r0,r1,r2,r3,r4) SETKEY(r0, r1, r4, r2, 116) GETKEY(r0, r1, r2, r3, 120); S5(r0,r1,r2,r3,r4); SETKEY(r1, r3, r0, r2, 120) GETKEY(r0, r1, r2, r3, 124); S4(r0,r1,r2,r3,r4) SETKEY(r1, r4, r0, r3, 124) GETKEY(r0, r1, r2, r3, 128); S3(r0,r1,r2,r3,r4); SETKEY(r1, r2, r3, r4, 128) };/* Encryption and decryption functions. The rounds are fully inlined. * The sboxes alters the bit order of the output, and the altered * bit ordrer is used progressivly. *//* encrypt a block of text */static void serpent_encrypt(u32 *l_key, const u8 *in, u8 *out, int wrongByteOrder){ const u32 *in_blk = (u32 *) in; u32 *out_blk = (u32 *) out; u32 r0,r1,r2,r3,r4; if (wrongByteOrder) { /* incorrect byte order */ r0 = io_swap_be(in_blk[3]); r1 = io_swap_be(in_blk[2]); r2 = io_swap_be(in_blk[1]); r3 = io_swap_be(in_blk[0]); } else { /* correct byte order */ r0 = io_swap_le(in_blk[0]); r1 = io_swap_le(in_blk[1]); r2 = io_swap_le(in_blk[2]); r3 = io_swap_le(in_blk[3]); } /* round 1 */ KEYMIX(r0,r1,r2,r3,r4,0); S0(r0,r1,r2,r3,r4); LINTRANS(r1,r4,r2,r0,r3); /* round 2 */ KEYMIX(r1,r4,r2,r0,r3,4); S1(r1,r4,r2,r0,r3); LINTRANS(r0,r4,r2,r1,r3); /* round 3 */ KEYMIX(r0,r4,r2,r1,r3,8); S2(r0,r4,r2,r1,r3); LINTRANS(r2,r1,r4,r3,r0); /* round 4 */ KEYMIX(r2,r1,r4,r3,r0,12); S3(r2,r1,r4,r3,r0); LINTRANS(r1,r4,r3,r0,r2); /* round 5 */ KEYMIX(r1,r4,r3,r0,r2,16); S4(r1,r4,r3,r0,r2) LINTRANS(r4,r2,r1,r0,r3); /* round 6 */ KEYMIX(r4,r2,r1,r0,r3,20); S5(r4,r2,r1,r0,r3); LINTRANS(r2,r0,r4,r1,r3); /* round 7 */ KEYMIX(r2,r0,r4,r1,r3,24); S6(r2,r0,r4,r1,r3) LINTRANS(r2,r0,r3,r4,r1); /* round 8 */ KEYMIX(r2,r0,r3,r4,r1,28); S7(r2,r0,r3,r4,r1); LINTRANS(r3,r1,r4,r2,r0); /* round 9 */ KEYMIX(r3,r1,r4,r2,r0,32); S0(r3,r1,r4,r2,r0); LINTRANS(r1,r0,r4,r3,r2); /* round 10 */ KEYMIX(r1,r0,r4,r3,r2,36); S1(r1,r0,r4,r3,r2); LINTRANS(r3,r0,r4,r1,r2); /* round 11 */ KEYMIX(r3,r0,r4,r1,r2,40); S2(r3,r0,r4,r1,r2); LINTRANS(r4,r1,r0,r2,r3); /* round 12 */ KEYMIX(r4,r1,r0,r2,r3,44); S3(r4,r1,r0,r2,r3); LINTRANS(r1,r0,r2,r3,r4); /* round 13 */ KEYMIX(r1,r0,r2,r3,r4,48); S4(r1,r0,r2,r3,r4) LINTRANS(r0,r4,r1,r3,r2); /* round 14 */ KEYMIX(r0,r4,r1,r3,r2,52); S5(r0,r4,r1,r3,r2); LINTRANS(r4,r3,r0,r1,r2); /* round 15 */ KEYMIX(r4,r3,r0,r1,r2,56); S6(r4,r3,r0,r1,r2) LINTRANS(r4,r3,r2,r0,r1); /* round 16 */ KEYMIX(r4,r3,r2,r0,r1,60); S7(r4,r3,r2,r0,r1); LINTRANS(r2,r1,r0,r4,r3); /* round 17 */ KEYMIX(r2,r1,r0,r4,r3,64); S0(r2,r1,r0,r4,r3); LINTRANS(r1,r3,r0,r2,r4); /* round 18 */ KEYMIX(r1,r3,r0,r2,r4,68); S1(r1,r3,r0,r2,r4); LINTRANS(r2,r3,r0,r1,r4); /* round 19 */ KEYMIX(r2,r3,r0,r1,r4,72); S2(r2,r3,r0,r1,r4); LINTRANS(r0,r1,r3,r4,r2); /* round 20 */ KEYMIX(r0,r1,r3,r4,r2,76); S3(r0,r1,r3,r4,r2); LINTRANS(r1,r3,r4,r2,r0); /* round 21 */ KEYMIX(r1,r3,r4,r2,r0,80); S4(r1,r3,r4,r2,r0) LINTRANS(r3,r0,r1,r2,r4); /* round 22 */ KEYMIX(r3,r0,r1,r2,r4,84); S5(r3,r0,r1,r2,r4); LINTRANS(r0,r2,r3,r1,r4); /* round 23 */ KEYMIX(r0,r2,r3,r1,r4,88); S6(r0,r2,r3,r1,r4) LINTRANS(r0,r2,r4,r3,r1); /* round 24 */ KEYMIX(r0,r2,r4,r3,r1,92); S7(r0,r2,r4,r3,r1); LINTRANS(r4,r1,r3,r0,r2); /* round 25 */ KEYMIX(r4,r1,r3,r0,r2,96); S0(r4,r1,r3,r0,r2); LINTRANS(r1,r2,r3,r4,r0); /* round 26 */ KEYMIX(r1,r2,r3,r4,r0,100); S1(r1,r2,r3,r4,r0); LINTRANS(r4,r2,r3,r1,r0); /* round 27 */ KEYMIX(r4,r2,r3,r1,r0,104); S2(r4,r2,r3,r1,r0); LINTRANS(r3,r1,r2,r0,r4); /* round 28 */ KEYMIX(r3,r1,r2,r0,r4,108); S3(r3,r1,r2,r0,r4); LINTRANS(r1,r2,r0,r4,r3); /* round 29 */ KEYMIX(r1,r2,r0,r4,r3,112); S4(r1,r2,r0,r4,r3) LINTRANS(r2,r3,r1,r4,r0); /* round 30 */ KEYMIX(r2,r3,r1,r4,r0,116); S5(r2,r3,r1,r4,r0); LINTRANS(r3,r4,r2,r1,r0); /* round 31 */ KEYMIX(r3,r4,r2,r1,r0,120); S6(r3,r4,r2,r1,r0) LINTRANS(r3,r4,r0,r2,r1); /* round 32 */ KEYMIX(r3,r4,r0,r2,r1,124); S7(r3,r4,r0,r2,r1); KEYMIX(r0,r1,r2,r3,r4,128); if (wrongByteOrder) { /* incorrect byte order */ out_blk[3] = io_swap_be(r0); out_blk[2] = io_swap_be(r1); out_blk[1] = io_swap_be(r2); out_blk[0] = io_swap_be(r3); } else { /* correct byte order */ out_blk[0] = io_swap_le(r0); out_blk[1] = io_swap_le(r1); out_blk[2] = io_swap_le(r2); out_blk[3] = io_swap_le(r3); }};/* decrypt a block of text */static void serpent_decrypt(u32 *l_key, const u8 *in, u8 *out, int wrongByteOrder){ const u32 *in_blk = (const u32 *)in; u32 *out_blk = (u32 *)out; u32 r0,r1,r2,r3,r4; if (wrongByteOrder) { /* incorrect byte order */ r0 = io_swap_be(in_blk[3]); r1 = io_swap_be(in_blk[2]); r2 = io_swap_be(in_blk[1]); r3 = io_swap_be(in_blk[0]); } else { /* correct byte order */ r0 = io_swap_le(in_blk[0]); r1 = io_swap_le(in_blk[1]); r2 = io_swap_le(in_blk[2]); r3 = io_swap_le(in_blk[3]); } /* round 1 */ KEYMIX(r0,r1,r2,r3,r4,128); I7(r0,r1,r2,r3,r4); KEYMIX(r3,r0,r1,r4,r2,124); /* round 2 */ ILINTRANS(r3,r0,r1,r4,r2); I6(r3,r0,r1,r4,r2); KEYMIX(r0,r1,r2,r4,r3,120); /* round 3 */ ILINTRANS(r0,r1,r2,r4,r3); I5(r0,r1,r2,r4,r3); KEYMIX(r1,r3,r4,r2,r0,116); /* round 4 */ ILINTRANS(r1,r3,r4,r2,r0); I4(r1,r3,r4,r2,r0); KEYMIX(r1,r2,r4,r0,r3,112); /* round 5 */ ILINTRANS(r1,r2,r4,r0,r3); I3(r1,r2,r4,r0,r3); KEYMIX(r4,r2,r0,r1,r3,108); /* round 6 */ ILINTRANS(r4,r2,r0,r1,r3); I2(r4,r2,r0,r1,r3); KEYMIX(r2,r3,r0,r1,r4,104); /* round 7 */ ILINTRANS(r2,r3,r0,r1,r4); I1(r2,r3,r0,r1,r4); KEYMIX(r4,r2,r1,r0,r3,100); /* round 8 */ ILINTRANS(r4,r2,r1,r0,r3); I0(r4,r2,r1,r0,r3); KEYMIX(r4,r3,r2,r0,r1,96); /* round 9 */ ILINTRANS(r4,r3,r2,r0,r1); I7(r4,r3,r2,r0,r1); KEYMIX(r0,r4,r3,r1,r2,92); /* round 10 */ ILINTRANS(r0,r4,r3,r1,r2); I6(r0,r4,r3,r1,r2); KEYMIX(r4,r3,r2,r1,r0,88); /* round 11 */ ILINTRANS(r4,r3,r2,r1,r0); I5(r4,r3,r2,r1,r0); KEYMIX(r3,r0,r1,r2,r4,84); /* round 12 */ ILINTRANS(r3,r0,r1,r2,r4); I4(r3,r0,r1,r2,r4); KEYMIX(r3,r2,r1,r4,r0,80); /* round 13 */ ILINTRANS(r3,r2,r1,r4,r0); I3(r3,r2,r1,r4,r0); KEYMIX(r1,r2,r4,r3,r0,76); /* round 14 */ ILINTRANS(r1,r2,r4,r3,r0); I2(r1,r2,r4,r3,r0); KEYMIX(r2,r0,r4,r3,r1,72); /* round 15 */ ILINTRANS(r2,r0,r4,r3,r1); I1(r2,r0,r4,r3,r1); KEYMIX(r1,r2,r3,r4,r0,68); /* round 16 */ ILINTRANS(r1,r2,r3,r4,r0); I0(r1,r2,r3,r4,r0); KEYMIX(r1,r0,r2,r4,r3,64); /* round 17 */ ILINTRANS(r1,r0,r2,r4,r3); I7(r1,r0,r2,r4,r3); KEYMIX(r4,r1,r0,r3,r2,60); /* round 18 */ ILINTRANS(r4,r1,r0,r3,r2); I6(r4,r1,r0,r3,r2); KEYMIX(r1,r0,r2,r3,r4,56); /* round 19 */ ILINTRANS(r1,r0,r2,r3,r4); I5(r1,r0,r2,r3,r4); KEYMIX(r0,r4,r3,r2,r1,52); /* round 20 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -