SNOW-V算法C语言实现
新手第一次写算法有冗余部分多多包涵。SNOW_V.c部分#include stdio.h #include SNOW_V.h #include string.h #include stdint.h struct Infor { uint16_t Key[16]; //算法运算的密钥 uint16_t IV[8]; //算法运算的初始化向量 uint16_t lfsr_A[16]; //线性移位寄存器A每个小寄存器16位 uint16_t lfsr_B[16]; //线性移位寄存器B每个小寄存器16位 uint32_t R1[4], R2[4], R3[4]; //三个记忆单元每个单元128位采用小端存储 uint32_t T1[4], T2[4]; //进入FSM部分的变量 uint32_t Z[4]; //输出密钥字 uint8_t trigger_signal; }; //实例化唯一 static struct Infor g_info; //全局声明函数区 static inline uint16_t mul_alpha_a(uint16_t x); // 在 F_{2^16}^A 域上乘以本原元 α来自文件的快速实现 static inline uint16_t mul_alpha_b(uint16_t x); // 在 F_{2^16}^B 域上乘以本原元 β来自文件的快速实现 static inline uint16_t mul_alpha_inv_a(uint16_t x); // 在 F_{2^16}^A 域上乘以 α 的逆元 α^{-1} static inline uint16_t mul_alpha_inv_b(uint16_t x); // 在 F_{2^16}^B 域上乘以 β 的逆元 β^{-1} void Infor_Output(); //计算输出函数 void AESR(uint32_t* Result, const uint32_t* Source); //AES轮函数实现 void Sigema(uint32_t* Result, const uint32_t* Source); //σ变换 //初始化寄存器全部置0 void Infor_Init(void) { for (int i 0; i 16; i) { g_info.lfsr_A[i] 0; g_info.lfsr_B[i] 0; } for (int i 0; i 4; i) { g_info.R1[i] 0; g_info.R2[i] 0; g_info.R3[i] 0; g_info.T1[i] 0; g_info.T2[i] 0; g_info.Z[i] 0; } g_info.trigger_signal 0; } //装填密钥和向量(密钥256比特16×16向量128比特8×16) void Infor_Input(uint16_t* Key, uint16_t* IV) { for (int i 0; i 8; i) { g_info.lfsr_A[i] IV[i]; g_info.lfsr_A[i 8] Key[i]; g_info.lfsr_B[i 8] Key[i 8]; g_info.Key[i] Key[i]; g_info.Key[i 8] Key[i 8]; g_info.IV[i] IV[i]; } } //LFSR更新函数(更新一次) void Infor_LFSRupdate(void) { uint16_t temp_a 0, temp_b 0; temp_a g_info.lfsr_B[0] ^ (mul_alpha_a(g_info.lfsr_A[0]))^g_info.lfsr_A[1] ^ mul_alpha_inv_a(g_info.lfsr_A[8]); temp_b g_info.lfsr_A[0] ^ (mul_alpha_b(g_info.lfsr_B[0]))^g_info.lfsr_B[3] ^ mul_alpha_inv_b(g_info.lfsr_B[8]); for (int i 0; i 15; i) { g_info.lfsr_A[i] g_info.lfsr_A[i 1]; g_info.lfsr_B[i] g_info.lfsr_B[i 1]; } g_info.lfsr_A[15] temp_a; g_info.lfsr_B[15] temp_b; } //比特抽取 void Infor_BitExtraction(void) { //LFSR_B高位是KEY高位 g_info.T1[0] (g_info.lfsr_B[9] 16) | g_info.lfsr_B[8]; g_info.T1[1] (g_info.lfsr_B[11] 16) | g_info.lfsr_B[10]; g_info.T1[2] (g_info.lfsr_B[13] 16) | g_info.lfsr_B[12]; g_info.T1[3] (g_info.lfsr_B[15] 16) | g_info.lfsr_B[14]; //LFSR_A低位是IV的值 g_info.T2[0] (g_info.lfsr_A[1] 16) | g_info.lfsr_A[0]; g_info.T2[1] (g_info.lfsr_A[3] 16) | g_info.lfsr_A[2]; g_info.T2[2] (g_info.lfsr_A[5] 16) | g_info.lfsr_A[4]; g_info.T2[3] (g_info.lfsr_A[7] 16) | g_info.lfsr_A[6]; } //FSM更新函数 void Infor_FSMupdate() { uint32_t R1_new[4], R2_new[4], R3_new[4]; uint32_t temp[4] {0}; //更新R1 for (int i 0; i 4; i) { temp[i] g_info.R2[i] (g_info.R3[i] ^ g_info.T2[i]); } //σ变换更新R1 Sigema(R1_new, temp); //更新R2、R3 AESR(R2_new, g_info.R1); AESR(R3_new, g_info.R2); //全部写回 for (int i 0; i 4; i) { g_info.R1[i] R1_new[i]; g_info.R2[i] R2_new[i]; g_info.R3[i] R3_new[i]; } } //初始化模式 void Infor_InitMod() { for (int i 0; i 16; i) { Infor_BitExtraction(); Infor_Output(); Infor_FSMupdate(); for (int j 0; j 8; j) { Infor_LFSRupdate(); } g_info.lfsr_A[8] ^ (g_info.Z[0] 0xffff); g_info.lfsr_A[9] ^ ((g_info.Z[0] 16) 0xffff); g_info.lfsr_A[10] ^ (g_info.Z[1] 0xffff); g_info.lfsr_A[11] ^ ((g_info.Z[1] 16) 0xffff); g_info.lfsr_A[12] ^ (g_info.Z[2] 0xffff); g_info.lfsr_A[13] ^ ((g_info.Z[2] 16) 0xffff); g_info.lfsr_A[14] ^ (g_info.Z[3] 0xffff); g_info.lfsr_A[15] ^ ((g_info.Z[3] 16) 0xffff); if (i 14) { //将密钥的低128位k₇, …, k₀异或到 R1 寄存器 // key[0]~key[7] 对应 k₀~k₇低128位 uint32_t key_word 0; for (int j 0; j 4; j) { // 将两个连续的16位密钥字组合成一个32位字按小端序低位密钥在低16位 key_word ((uint32_t)g_info.Key[2 * j 1] 16) | g_info.Key[2 * j]; g_info.R1[j] ^ key_word; } } if (i 15) { //将密钥的高128位k₁₅, …, k₈异或到 R1 寄存器 // key[8]~key[15] 对应 k₈~k₁₅高128位 uint32_t key_word 0; for (int j 0; j 4; j) { key_word ((uint32_t)g_info.Key[2 * j 9] 16) | g_info.Key[2 * j 8]; g_info.R1[j] ^ key_word; } } } } //工作模式 uint32_t* Infor_WorkMod() { Infor_BitExtraction(); Infor_Output(); Infor_FSMupdate(); for (int i 0; i 8; i) { Infor_LFSRupdate(); } return g_info.Z; } //打印Infor信息 void Infor_Print(void) { uint32_t result 0; uint16_t middle 0; printf(LFSR_A的值为); for (int i 0; i 16; i) { middle __builtin_bswap16(g_info.lfsr_A[i]); printf(%x , middle); } printf(\n); printf(LFSR_B的值为); for (int i 0; i 16; i) { middle __builtin_bswap16(g_info.lfsr_B[i]); printf(%x , middle); } printf(\n); printf(R1的值为); for (int i 0; i 4; i) { result __builtin_bswap32(g_info.R1[i]); printf(%x , result); } printf(\n); printf(R2的值为); for (int i 0; i 4; i) { result __builtin_bswap32( g_info.R2[i]); printf(%x , result); } printf(\n); printf(R3的值为); for (int i 0; i 4; i) { result __builtin_bswap32(g_info.R3[i]); printf(%x , result); } printf(\n); printf(T1的值为); for (int i 0; i 4; i) { result __builtin_bswap32(g_info.T1[i]); printf(%x , result); } printf(\n); printf(T2的值为); for (int i 0; i 4; i) { result __builtin_bswap32(g_info.T2[i]); printf(%x , result); } printf(\n); printf(Z的值为); for (int i 0; i 4; i) { result __builtin_bswap32(g_info.Z[i]); printf(%x , result); } printf(\n); printf(trigger的值为); printf(%d , g_info.trigger_signal); printf(\n); } // 在 F_{2^16}^A 域上乘以本原元 α来自文件的快速实现 static inline uint16_t mul_alpha_a(uint16_t x) { uint16_t GA 0x990f; if (x 0x8000) return (x 1)^GA; else return (x 1); } // 在 F_{2^16}^B 域上乘以本原元 β来自文件的快速实现 static inline uint16_t mul_alpha_b(uint16_t x) { uint16_t GB 0xc963; if (x 0x8000) return (x 1)^GB; else return (x 1); } // 在 F_{2^16}^A 域上乘以 α 的逆元 α^{-1} static inline uint16_t mul_alpha_inv_a(uint16_t x) { uint16_t GA_inv 0xcc87; if (x 0x0001) return (x 1)^GA_inv; else return (x 1); } // 在 F_{2^16}^B 域上乘以 β 的逆元 β^{-1} static inline uint16_t mul_alpha_inv_b(uint16_t x) { uint16_t GB_inv 0xe4b1; if (x 0x0001) return (x 1)^GB_inv; else return (x 1); } //计算输出函数 void Infor_Output() { for (int i 0; i 4; i) { g_info.Z[i] (g_info.R1[i] g_info.T1[i])^g_info.R2[i]; } } //多项式乘2 static inline uint8_t gm2(uint8_t a) { uint8_t t0 a 1; if (a 7 1) return t0 ^ 0x1b; return t0; } //多项式乘3 static inline uint8_t gm3(uint8_t a) { return gm2(a) ^ a; } //AES算法S盒 static const uint8_t AES_SBOX[256] { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; //AES轮函数字节变换 void sub_bytes(uint8_t state[16]) { for (uint8_t i 0; i 16; i) { state[i] AES_SBOX[state[i]]; } } //AES轮函数行移位变换 void shift_rows(uint8_t state[16]) { uint8_t temp0, temp1; temp0 state[1]; state[1] state[5]; state[5] state[9]; state[9] state[13]; state[13] temp0; temp0 state[2]; temp1 state[6]; state[2] state[10]; state[6] state[14]; state[10] temp0; state[14] temp1; temp0 state[15]; state[15] state[11]; state[11] state[7]; state[7] state[3]; state[3] temp0; } //AES轮函数列混合变换 void mix_columns(uint8_t state[16]) { uint8_t i, j, col[4], res[4]; for (j 0; j 4; j) { for (i 0; i 4; i) col[i] state[i 4 * j]; res[0] gm2(col[0]) ^ gm3(col[1]) ^ col[2] ^ col[3]; res[1] col[0] ^ gm2(col[1]) ^ gm3(col[2]) ^ col[3]; res[2] col[0] ^ col[1] ^ gm2(col[2]) ^ gm3(col[3]); res[3] gm3(col[0]) ^ col[1] ^ col[2] ^ gm2(col[3]); for (i 0; i 4; i) state[i 4 * j] res[i]; } } //AES轮函数实现 void AESR(uint32_t* Result, const uint32_t* Source) { // 小端序Source[0]是最低有效字 uint8_t bytes[16]; for (int i 0; i 4; i) { uint32_t word Source[i]; bytes[4 * i] word 0xFF; // 最低字节 bytes[4 * i 1] (word 8) 0xFF; bytes[4 * i 2] (word 16) 0xFF; bytes[4 * i 3] (word 24) 0xFF; // 最高字节 } //字节替换 sub_bytes(bytes); //行移位 shift_rows(bytes); //列混合 mix_columns(bytes); // 转换回32位字小端序 for (int i 0; i 4; i) { Result[i] ((uint32_t)bytes[4 * i 3] 24) | // 最高字节 ((uint32_t)bytes[4 * i 2] 16) | ((uint32_t)bytes[4 * i 1] 8) | bytes[4 * i]; // 最低字节 } } //σ变换 void Sigema(uint32_t* Result, const uint32_t* Source) { // σ置换表 const uint8_t sigma_map[16] { 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 }; // 小端序Source[0]是最低有效字 uint8_t in_bytes[16], out_bytes[16]; for (int i 0; i 4; i) { uint32_t word Source[i]; in_bytes[4 * i] word 0xFF; // 最低字节 in_bytes[4 * i 1] (word 8) 0xFF; in_bytes[4 * i 2] (word 16) 0xFF; in_bytes[4 * i 3] (word 24) 0xFF; // 最高字节 } // 应用σ置换 for (int i 0; i 16; i) { out_bytes[i] in_bytes[sigma_map[i]]; } // 转换回32位字小端序 for (int i 0; i 4; i) { Result[i] ((uint32_t)out_bytes[4 * i 3] 24) | // 最高字节 ((uint32_t)out_bytes[4 * i 2] 16) | ((uint32_t)out_bytes[4 * i 1] 8) | out_bytes[4 * i]; // 最低字节 } }SNOW_V.h部分#ifndef SNOW_V_H #define SNOW_V_H #include string.h #include stdint.h struct Infor; void Infor_Init(void); //初始化寄存器全部置0 void Infor_Input(uint16_t* Key, uint16_t* IV); //装填密钥和向量(密钥256比特16×16向量128比特8×16) void Infor_LFSRupdate(void); //LFSR更新函数 void Infor_BitExtraction(void); //比特抽取 void Infor_FSMupdate(); //FSM更新函数 void Infor_InitMod(); //初始化模式 uint32_t* Infor_WorkMod(); //工作模式 void Infor_Print(void); //打印Infor信息 #endifmain.c部分#include stdio.h #include SNOW_V.h #include string.h #include stdint.h void test_SNOW_V() { uint16_t key[16] {0}; uint16_t IV[8]{0}; Infor_Init(); Infor_Input(key, IV); Infor_InitMod(); //用来转换输出格式不影响算法实现 uint32_t* middleNULL; uint32_t result0; for(int i0;i1;i) { middleInfor_WorkMod(); for(int j0;j4;j) { result __builtin_bswap32(middle[j]); printf(%08x,result); } printf(\n); } } int main() { test_SNOW_V(); return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2576035.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!