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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
| class ZUCBasic: """ZUC-128流密码基础实现""" D = [ 0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF, 0x4D78, 0x2F13, 0x6BC4, 0x1AF1, 0x5E26, 0x3C4D, 0x789A, 0x47AC ] def __init__(self, key, iv): """ 初始化ZUC算法 key: 16字节密钥 (128-bit) iv: 16字节初始向量 (128-bit) """ if len(key) != 16: raise ValueError("Key must be 16 bytes (128-bit)") if len(iv) != 16: raise ValueError("IV must be 16 bytes (128-bit)") self.key = key self.iv = iv self.S = [0] * 16 self._key_iv_load() self._initialization() def _key_iv_load(self): """密钥和IV加载到线性反馈移位寄存器(LFSR)""" k = [int.from_bytes(self.key[i:i+2], 'big') for i in range(0, 16, 2)] iv_words = [int.from_bytes(self.iv[i:i+2], 'big') for i in range(0, 16, 2)] for i in range(16): self.S[i] = ((k[i] << 16) & 0x7FFFFFFF) | (iv_words[i] & 0xFFFF) def _bit_reorganization(self): """比特重组""" X0 = ((self.S[15] & 0x7FFF8000) << 1) | (self.S[14] & 0xFFFF) X1 = ((self.S[11] & 0xFFFF) << 16) | (self.S[9] >> 15) X2 = ((self.S[7] & 0xFFFF) << 16) | (self.S[5] >> 15) X3 = ((self.S[2] & 0xFFFF) << 16) | (self.S[0] >> 15) return X0, X1, X2, X3 def _lfsr_initialization_mode(self, u): """LFSR初始化模式""" v = (self.S[0] << 8) & 0x7FFFFFFF v = self._add31(v, self.S[0] >> 23) v = self._add31(v, (self.S[4] << 20) & 0x7FFFFFFF) v = self._add31(v, self.S[4] >> 11) v = self._add31(v, (self.S[10] << 21) & 0x7FFFFFFF) v = self._add31(v, self.S[10] >> 10) v = self._add31(v, (self.S[13] << 17) & 0x7FFFFFFF) v = self._add31(v, self.S[13] >> 14) v = self._add31(v, (self.S[15] << 15) & 0x7FFFFFFF) v = self._add31(v, self.S[15] >> 16) if u == 0: u = 0x7FFFFFFF v = self._add31(v, u) for i in range(15): self.S[i] = self.S[i + 1] self.S[15] = v def _lfsr_work_mode(self): """LFSR工作模式""" v = (self.S[0] << 8) & 0x7FFFFFFF v = self._add31(v, self.S[0] >> 23) v = self._add31(v, (self.S[4] << 20) & 0x7FFFFFFF) v = self._add31(v, self.S[4] >> 11) v = self._add31(v, (self.S[10] << 21) & 0x7FFFFFFF) v = self._add31(v, self.S[10] >> 10) v = self._add31(v, (self.S[13] << 17) & 0x7FFFFFFF) v = self._add31(v, self.S[13] >> 14) v = self._add31(v, (self.S[15] << 15) & 0x7FFFFFFF) v = self._add31(v, self.S[15] >> 16) for i in range(15): self.S[i] = self.S[i + 1] self.S[15] = v def _add31(self, a, b): """模2^31-1加法""" result = (a + b) & 0x7FFFFFFF carry = (a + b) >> 31 return (result + carry) & 0x7FFFFFFF def _f_function(self, X0, X1, X2): """F函数:非线性函数""" W = (X0 ^ X1) + X2 W1 = (X0 + X1) ^ X2 return W & 0xFFFFFFFF, W1 & 0xFFFFFFFF def _initialization(self): """初始化阶段""" R1 = 0 R2 = 0 for _ in range(32): X0, X1, X2, X3 = self._bit_reorganization() W, W1 = self._f_function(X0, X1, X2) self._lfsr_initialization_mode(W >> 1) R1 = X3 ^ R1 R2 = W1 ^ R2 X0, X1, X2, X3 = self._bit_reorganization() W, W1 = self._f_function(X0, X1, X2) self._lfsr_work_mode() def generate_keystream(self, length): """生成密钥流""" keystream = bytearray() for _ in range(0, length, 4): X0, X1, X2, X3 = self._bit_reorganization() W, _ = self._f_function(X0, X1, X2) Z = W ^ X3 keystream.extend(Z.to_bytes(4, 'big')) self._lfsr_work_mode() return bytes(keystream[:length]) def encrypt(self, plaintext): """加密数据""" keystream = self.generate_keystream(len(plaintext)) ciphertext = bytearray() for i in range(len(plaintext)): ciphertext.append(plaintext[i] ^ keystream[i]) return bytes(ciphertext) def decrypt(self, ciphertext): """解密数据(与加密相同)""" return self.encrypt(ciphertext)
def test_zuc_basic(): print("=== ZUC-128 基础实现测试 ===") key = bytes.fromhex("00000000000000000000000000000000") iv = bytes.fromhex("00000000000000000000000000000000") zuc = ZUCBasic(key, iv) keystream = zuc.generate_keystream(16) print(f"密钥流 (前16字节): {keystream.hex()}") plaintext = b"ZUC Algorithm Test" ciphertext = zuc.encrypt(plaintext) print(f"明文: {plaintext}") print(f"密文: {ciphertext.hex()}") zuc2 = ZUCBasic(key, iv) decrypted = zuc2.decrypt(ciphertext) print(f"解密: {decrypted}") print(f"解密成功: {plaintext == decrypted}")
|