tmp[0] ^= Rcon[(i + 4) // 4] key[i] = np.bitwise_xor(key[i + 4], tmp) return key T = Trace(1, 0) n_sample = len(cipher_state) lastRoundKey = np.zeros((16)) all_CorrTrace = [] for i in range(16): table = np.zeros((n_sample, 256)) byte = cipher_state[:, i] for subkey in range(256): for n in range(n_sample): table[n, subkey] = T.hamming_weight(byte[n] ^ subkey) CorrTraces = correlationTraces(all_trace_df.values, table) CorrTraces[0, :] = 0 all_CorrTrace.append(CorrTraces) lastRoundKey[i] = np.argmax(np.max(CorrTraces, axis=1)) key = inv_key_schedule(lastRoundKey) tmp = np.stack([lastRoundKey, key[:4].flatten()], axis=0).astype(int) df = pd.DataFrame(tmp) df.to_csv("Key.csv", index=False, header=None) line = [] for i in range(16): CorrTraces = all_CorrTrace[i] rank = np.argsort(np.max(CorrTraces, axis=1))