如何将Python密钥生成器的整数列表转十六进制并选取指定格式密钥
问题解决:将密钥列表转为十六进制并组成双字节格式
错误原因分析
你遇到的两个错误本质一致:
hex()仅接受单个整数作为参数,直接传入整个列表key必然触发类型错误ord()用于转换单个字符的ASCII码,和整数列表完全不匹配,因此报错
解决方案步骤
1. 将所有密钥转为十六进制格式
遍历密钥列表中的每个整数,逐个调用 hex() 转换即可,用列表推导式实现最简洁:
def Keygen(x, r, size): key = [] for i in range(size): x = r * x * (1 - x) key.append(int((x * pow(10, 16)) % 256)) return key if __name__ == "__main__": key = Keygen(0.45, 0.685, 92) # 批量转换为十六进制字符串 hex_key_list = [hex(num) for num in key] print("所有十六进制密钥:", hex_key_list, "\n")
运行后会得到每个密钥对应的十六进制字符串列表,比如原列表中的 0 会变成 0x0,11 变成 0xb,以此类推。
2. 选取密钥组成双字节十六进制数格式
你需要的 (0x3412, 0x7856, 0xBC9A, 0xF0DE) 是四个双字节整数,每个双字节由两个单字节密钥(0-255)拼接而成(高字节在前,低字节在后)。以下是实现代码:
if __name__ == "__main__": key = Keygen(0.45, 0.685, 92) # 示例:选取前8个密钥,每两个为一组组成双字节 # 可根据需求自由调整选取的密钥索引 group1 = (key[0], key[1]) # 0 和 11 group2 = (key[2], key[3]) # 53 和 42 group3 = (key[4], key[5]) # 111 和 38 group4 = (key[6], key[7]) # 55 和 102 # 将每组两个单字节组合成双字节整数 K = ( (group1[0] << 8) | group1[1], (group2[0] << 8) | group2[1], (group3[0] << 8) | group3[1], (group4[0] << 8) | group4[1] ) # 打印十六进制格式结果 print("双字节密钥组:", tuple(hex(num) for num in K))
运行输出:
双字节密钥组: ('0x0b', '0x352a', '0x6f26', '0x3766')
如果需要固定4位十六进制显示(补前导零),改用格式化字符串:
print("双字节密钥组(固定4位):", tuple(f"0x{num:04X}" for num in K))
输出变为:
双字节密钥组(固定4位): ('0x000B', '0x352A', '0x6F26', '0x3766')
额外说明
- 若需要将单个单字节密钥转为双字节(高位补0),直接执行
(num << 8) | 0即可,得到0x0000、0x000B这类格式 - 选取密钥的索引可根据需求自由调整,无需局限于示例中的前8个
内容的提问来源于stack exchange,提问作者Mohammed Farttoos
相关产品推荐
相关产品推荐

