Aller au contenu principal

2.4 The ChaCha20 Encryption Algorithm (L'algorithme de chiffrement ChaCha20)

2.4 The ChaCha20 Encryption Algorithm (L'algorithme de chiffrement ChaCha20)

ChaCha20 est un chiffrement par flux conçu par D. J. Bernstein. C'est un raffinement de l'algorithme Salsa20 et il utilise une clé de 256 bits.

ChaCha20 appelle successivement la fonction de bloc ChaCha20, avec la même clé et le même nonce, et avec des paramètres de compteur de blocs successivement croissants. ChaCha20 sérialise ensuite l'état résultant en écrivant les nombres dans l'ordre little-endian, créant un bloc de flux de clés. La concaténation des blocs de flux de clés des blocs successifs forme un flux de clés. La fonction ChaCha20 effectue ensuite un XOR de ce flux de clés avec le texte en clair. Alternativement, chaque bloc de flux de clés peut être XORé avec un bloc de texte en clair avant de procéder à la création du bloc suivant, économisant ainsi de la mémoire. Il n'y a aucune exigence pour que le texte en clair soit un multiple entier de 512 bits. S'il y a un flux de clés supplémentaire du dernier bloc, il est jeté. Les protocoles spécifiques PEUVENT exiger que le texte en clair et le texte chiffré aient une certaine longueur. De tels protocoles doivent spécifier comment le texte en clair est rembourré et combien de rembourrage il reçoit.

Les entrées de ChaCha20 sont:

  • Une clé de 256 bits

  • Un compteur initial de 32 bits. Celui-ci peut être défini sur n'importe quel nombre, mais sera généralement zéro ou un. Il est logique d'utiliser un si nous utilisons le bloc zéro pour autre chose, comme générer une clé d'authentificateur à usage unique dans le cadre d'un algorithme AEAD.

  • Un nonce de 96 bits. Dans certains protocoles, cela est connu sous le nom de vecteur d'initialisation.

  • Un texte en clair de longueur arbitraire

La sortie est un message chiffré, ou "texte chiffré", de la même longueur.

Le déchiffrement se fait de la même manière. La fonction de bloc ChaCha20 est utilisée pour étendre la clé en un flux de clés, qui est XORé avec le texte chiffré pour redonner le texte en clair.

2.4.1 The ChaCha20 Encryption Algorithm in Pseudocode (L'algorithme de chiffrement ChaCha20 en pseudocode)

chacha20_encrypt(key, counter, nonce, plaintext):
for j = 0 upto floor(len(plaintext)/64)-1
key_stream = chacha20_block(key, counter+j, nonce)
block = plaintext[(j*64)..(j*64+63)]
encrypted_message += block ^ key_stream
end
if ((len(plaintext) % 64) != 0)
j = floor(len(plaintext)/64)
key_stream = chacha20_block(key, counter+j, nonce)
block = plaintext[(j*64)..len(plaintext)-1]
encrypted_message += (block^key_stream)[0..len(plaintext)%64]
end
return encrypted_message
end

2.4.2 Example and Test Vector for the ChaCha20 Cipher (Exemple et vecteur de test pour le chiffrement ChaCha20)

Pour un vecteur de test, nous utiliserons les entrées suivantes pour la fonction de bloc ChaCha20:

  • Key = 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f.

  • Nonce = (00:00:00:00:00:00:00:4a:00:00:00:00).

  • Initial Counter = 1.

Nous utilisons ce qui suit pour le texte en clair. Il a été choisi pour être suffisamment long pour nécessiter plus d'un bloc, mais pas si long qu'il rendrait cet exemple encombrant (donc, moins de 3 blocs):

Plaintext Sunscreen: (Texte en clair crème solaire)

000  4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c  Ladies and Gentl
016 65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 emen of the clas
032 73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 s of '99: If I c
048 6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f ould offer you o
064 6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 nly one tip for
080 74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 the future, suns
096 63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 creen would be i
112 74 2e t.

La figure suivante montre quatre matrices d'état ChaCha:

  1. Premier bloc tel qu'il est configuré.

  2. Deuxième bloc tel qu'il est configuré. Notez que ces blocs ne sont séparés que de deux bits -- seul le compteur en position 12 est différent.

  3. Le troisième bloc est le premier bloc après l'application de l'opération de bloc ChaCha20.

  4. Le dernier bloc est le deuxième bloc après l'application de l'opération de bloc ChaCha20.

Après cela, nous montrons le flux de clés.

First block setup: (Configuration du premier bloc)

    61707865  3320646e  79622d32  6b206574
03020100 07060504 0b0a0908 0f0e0d0c
13121110 17161514 1b1a1918 1f1e1d1c
00000001 00000000 4a000000 00000000

Second block setup: (Configuration du deuxième bloc)

    61707865  3320646e  79622d32  6b206574
03020100 07060504 0b0a0908 0f0e0d0c
13121110 17161514 1b1a1918 1f1e1d1c
00000002 00000000 4a000000 00000000

First block after block operation: (Premier bloc après l'opération de bloc)

    f3514f22  e1d91b40  6f27de2f  ed1d63b8
821f138c e2062c3d ecca4f7e 78cff39e
a30a3b8a 920a6072 cd7479b5 34932bed
40ba4c79 cd343ec6 4c2c21ea b7417df0

Second block after block operation: (Deuxième bloc après l'opération de bloc)

    9f74a669  410f633f  28feca22  7ec44dec
6d34d426 738cb970 3ac5e9f3 45590cc4
da6e8b39 892c831a cdea67c1 2b7e1d90
037463f3 a11a2073 e8bcfb88 edc49139

Keystream: (Flux de clés)

22:4f:51:f3:40:1b:d9:e1:2f:de:27:6f:b8:63:1d:ed:8c:13:1f:82:3d:2c:06
e2:7e:4f:ca:ec:9e:f3:cf:78:8a:3b:0a:a3:72:60:0a:92:b5:79:74:cd:ed:2b
93:34:79:4c:ba:40:c6:3e:34:cd:ea:21:2c:4c:f0:7d:41:b7:69:a6:74:9f:3f
63:0f:41:22:ca:fe:28:ec:4d:c4:7e:26:d4:34:6d:70:b9:8c:73:f3:e9:c5:3a
c4:0c:59:45:39:8b:6e:da:1a:83:2c:89:c1:67:ea:cd:90:1d:7e:2b:f3:63

Enfin, nous XORons le flux de clés avec le texte en clair, donnant le texte chiffré:

Ciphertext Sunscreen: (Texte chiffré crème solaire)

000  6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81  n.5.%h..A..(..i.
016 e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b .~z..C`..'......
032 f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 ..e.RG3..Y=..b.W
048 16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 .9.$.QR..S.5..a.
064 07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e ....P.jaV....".^
080 52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36 R.QM.........y76
096 5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 Z...t.[......x^B
112 87 4d .M