DES加密过程中需要16个48位子秘钥子秘钥有用户提供的64位初始秘钥经过16轮迭代生成。1:64位初始秘钥生成;2:选择置换1;3:将选择置换1输出的56位比特数据分成左两个部分每部分28位;4:每一轮将两部分分别循环左移左移的位数与其所在的轮数对应;5:左移后进行置换选择2得到的48位比特的轮秘钥;6:4-5步骤16次生成16轮子秘钥。写个Python程序
来生成这16个子秘钥:
def generate_subkeys(key): # 选择置换1 pc1 = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4] # 置换选择2 pc2 = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32] # 循环左移的位数 shift_table = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] # 初始秘钥置换 key = permute(key, pc1) # 将初始秘钥分成左右两部分 left = key[:28] right = key[28:] subkeys = [] for i in range(16): # 循环左移 left_shifted = left[shift_table[i]:] + left[:shift_table[i]] right_shifted = right[shift_table[i]:] + right[:shift_table[i]] # 合并左右两部分 merged = left_shifted + right_shifted # 选择置换2 subkey = permute(merged, pc2) subkeys.append(subkey) # 更新左右两部分 left = left_shifted right = right_shifted return subkeys
置换函数
def permute(data, table): return [data[i - 1] for i in table]
测试
key = '0001001100110100010101110111100110011011101111001101111111110001' subkeys = generate_subkeys(key) for i, subkey in enumerate(subkeys): print(f'Subkey {i+1}: {subkey}'
原文地址: https://www.cveoy.top/t/topic/hhL2 著作权归作者所有。请勿转载和采集!