Le standard :
https://csrc.nist.gov/csrc/media/publications/fips/46/3/archive/1999-10-25/documents/fips46-3.pdf
Les bits de la clé sont numérotés 1, 2, 3, ... 64 de gauche à droite (notation des années 70) et non 63, 62, 61, ... 0 comme de nos jours.
États initiaux des deux registres à décalages C et D après l'action de pc1 (Permuted choice 1).
C = [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]
D = [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]
def shift(L, n):
"""Permutation circulaire à gauche de n rangs sur la liste L
"""
return L[n:]+L[:n]
print(shift(C, 1))
Permuted Choice 2 : forme la sous-clé de 48 bits à partir des registres C et D (28+28=56 bits --> 48 bits)
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]
ppc2 = [x-1 for x in pc2] # en Python les tableaux commencent à l'indice 0 et non 1
def sKey(C, D):
"""Retourne la sous-clé qui correspond aux registres C et D
"""
CD = C + D
return [CD[ppc2[i]] for i in range(48)]
print(sKey(C, D))
Table donnant le décalage des registres pour chacun des 16 rounds.
r = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
Calcul des 16 sous-clés :
for nround in range(16):
print('K'+str(nround+1))
C = shift(C, r[nround])
D = shift(D, r[nround])
print(sKey(C, D))
On a donc
k16 = [18, 59, 42, 3, 57, 25, 41, 36, 10, 17, 27, 50, 11, 43, 34, 33, 52, 1, 2, 9, 44,\
35, 26, 49, 30, 5, 47, 62, 45, 12, 55, 38, 13, 61, 31, 37, 6, 29, 46, 4, 23, 28,\
53, 22, 21, 7, 63, 39]
[i for i in range(1, 65) if i not in k16]
8, 16, 24, 32, 40, 48, 56, 64 : bits de parité
14, 15, 19, 20, 51, 54, 58, 60 : bits indéterminés
Le 16/03/2018 - Contact : Rossignol@bribes.org