Algorithme aes (advanced encryption standard) sur visual basic 6

Soyez le premier à donner votre avis sur cette source.

Vue 5 738 fois - Téléchargée 694 fois

Description

Ceci est un programme qui utilise le chiffrement AES (devenu standard depuis 2001). Il prend en entrée un bloc de 128 bits (16 octets) et utilise une clé de 128 bits. Les 16 octets en entrée sont permutés selon une table définie au préalable. Ces octets sont ensuite placés dans une matrice de 4x4 éléments et ses lignes subissent une rotation vers la droite. L'incrément pour la rotation varie selon le numéro de la ligne. Une transformation linéaire est ensuite appliquée sur la matrice, elle consiste en la multiplication binaire de chaque élément de la matrice avec des polynômes issus d'une matrice auxiliaire, cette multiplication est soumise à des règles spéciales selon GF(28) (groupe de Galois ou corps fini). La transformation linéaire garantit une meilleure diffusion (propagation des bits dans la structure) sur plusieurs tours.

Source / Exemple :


'module.bas
'-----------------------------------------------------------

Public Function NoSpace(mystr As String) As String
a = 0: tmp = "": c = "": NoSpace = ""
For a = 1 To Len(mystr)
c = Mid(mystr, a, 1)
If Asc(c) <> 32 Then tmp = tmp & c Else
Next
NoSpace = tmp
End Function

Public Function AES_Encrypt(PlainText, AES_KEY)

Dim ExtendedKey, Key_i, DATA_i, After_XOR, SubBytes, SubBytes_TAB, ShiftRows, ShiftRows_TAB, MixColumns
ExtendedKey = GenKey(AES_KEY)
DATA_i = PlainText

1

i = i + 1
Key_i = Mid(ExtendedKey, 32 * (i - 1) + 1, 32)

After_XOR = XXOR_HEX(DATA_i, Key_i)
SubBytes_TAB = "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16"

SubBytes = Mask(After_XOR, SubBytes_TAB)

ShiftRows_TAB = "00050A0F04090E03080D02070C01060B"
ShiftRows = FxPermu(SubBytes, ShiftRows_TAB)

If i = 10 Then MixColumns = XXOR_HEX(ShiftRows, Right(ExtendedKey, 32)) Else MixColumns = fx_GF28(ShiftRows, 0)
If i <= 9 Then DATA_i = MixColumns: GoTo 1 Else

AES_Encrypt = MixColumns

End Function

Public Function AES_Decrypt(CipherText, AES_KEY)
Dim ExtendedKey, Key_i, DATA_i, After_XOR, SubBytes, SubBytes_TAB, ShiftRows, ShiftRows_TAB, MixColumns

ExtendedKey = GenKey(AES_KEY)
DATA_i = CipherText

1

i = i + 1
Key_i = Mid(ExtendedKey, Len(ExtendedKey) - 32 * i + 1, 32)

After_XOR = XXOR_HEX(DATA_i, Key_i)

If i = 1 Then MixColumns = After_XOR Else MixColumns = fx_GF28(After_XOR, 1)

ShiftRows_TAB = "000D0A0704010E0B0805020F0C090603"
ShiftRows = FxPermu(MixColumns, ShiftRows_TAB)

SubBytes_TAB = "52096ad53036a538bf40a39e81f3d7fb7ce339829b2fff87348e4344c4dee9cb547b9432a6c2233dee4c950b42fac34e082ea16628d924b2765ba2496d8bd12572f8f66486689816d4a45ccc5d65b6926c704850fdedb9da5e154657a78d9d8490d8ab008cbcd30af7e45805b8b34506d02c1e8fca3f0f02c1afbd0301138a6b3a9111414f67dcea97f2cfcef0b4e67396ac7422e7ad3585e2f937e81c75df6e47f11a711d29c5896fb7620eaa18be1bfc563e4bc6d279209adbc0fe78cd5af41fdda8338807c731b11210592780ec5f60517fa919b54a0d2de57a9f93c99cefa0e03b4dae2af5b0c8ebbb3c83539961172b047eba77d626e169146355210c7d"
SubBytes = Mask(ShiftRows, SubBytes_TAB)

If i <= 9 Then DATA_i = SubBytes: GoTo 1 Else

final = XXOR_HEX(SubBytes, Left(ExtendedKey, 32))

AES_Decrypt = final

End Function

Public Function GenKey(myKey)
Dim W(43)
tmp = myKey
W(0) = Left(myKey, 8)
W(1) = Mid(myKey, 9, 8)
W(2) = Mid(myKey, 17, 8)
W(3) = Right(myKey, 8)

1
i = i + 4
Rcon = Hex(BinToDec("1" & Nfois("0", Int(i / 4) - 1))): If Len(Rcon) = 1 Then Rcon = "0" & Rcon & "000000" Else Rcon = Rcon & "000000"
If i = 36 Then Rcon = "1B000000" Else
If i = 40 Then Rcon = "36000000" Else

MASK_TAB = "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16"
W(i) = XXOR_HEX(XXOR_HEX(Mask(FxPermu(W(i - 1), "01020300"), MASK_TAB), W(i - 4)), Rcon)
W(i + 1) = XXOR_HEX(W(i), W(i - 3))
W(i + 2) = XXOR_HEX(W(i + 1), W(i - 2))
W(i + 3) = XXOR_HEX(W(i + 2), W(i - 1))
If i + 3 <> 43 Then GoTo 1 Else

For x = 0 To 43
tmp2 = tmp2 & W(x)
Next

GenKey = tmp2

End Function

Public Function fx_GF28(myINPUT, Algo_TYPE)
For i = 1 To Len(myINPUT) / 2 Step 4
a0 = Mid(myINPUT, i * 2 - 1, 2)
a1 = Mid(myINPUT, i * 2 + 1, 2)
a2 = Mid(myINPUT, i * 2 + 3, 2)
a3 = Mid(myINPUT, i * 2 + 5, 2)

Select Case Algo_TYPE
Case 0
b0 = Hex(Val("&h" & GF28("02", a0)) Xor Val("&h" & GF28("03", a1)) Xor Val("&h" & a2) Xor Val("&h" & a3))
b1 = Hex(Val("&h" & a0) Xor Val("&h" & GF28("02", a1)) Xor Val("&h" & GF28("03", a2)) Xor Val("&h" & a3))
b2 = Hex(Val("&h" & a0) Xor Val("&h" & a1) Xor Val("&h" & GF28("02", a2)) Xor Val("&h" & GF28("03", a3)))
b3 = Hex(Val("&h" & GF28("03", a0)) Xor Val("&h" & a1) Xor Val("&h" & a2) Xor Val("&h" & GF28("02", a3)))
Case 1
b0 = Hex(Val("&h" & GF28("0E", a0)) Xor Val("&h" & GF28("0B", a1)) Xor Val("&h" & GF28("0D", a2)) Xor Val("&h" & GF28("09", a3)))
b1 = Hex(Val("&h" & GF28("09", a0)) Xor Val("&h" & GF28("0E", a1)) Xor Val("&h" & GF28("0B", a2)) Xor Val("&h" & GF28("0D", a3)))
b2 = Hex(Val("&h" & GF28("0D", a0)) Xor Val("&h" & GF28("09", a1)) Xor Val("&h" & GF28("0E", a2)) Xor Val("&h" & GF28("0B", a3)))
b3 = Hex(Val("&h" & GF28("0B", a0)) Xor Val("&h" & GF28("0D", a1)) Xor Val("&h" & GF28("09", a2)) Xor Val("&h" & GF28("0E", a3)))

End Select

If Len(b0) = 1 Then b0 = "0" & b0 Else
If Len(b1) = 1 Then b1 = "0" & b1 Else
If Len(b2) = 1 Then b2 = "0" & b2 Else
If Len(b3) = 1 Then b3 = "0" & b3 Else

c = c & b0 & b1 & b2 & b3

Next
fx_GF28 = c
End Function

Public Function FxPermu(mystr, PERMU_table) As String
ReDim mytab(Len(mystr) / 2)
For a = 1 To Len(mystr) / 2
b = Val("&h" & Mid(PERMU_table, 2 * a - 1, 2))
bb = 2 * b + 1
c = Mid(mystr, bb, 2)
d = d & c
Next
FxPermu = d
End Function

Public Function Mask(mystr, tmp) As String
Dim Masktable(15, 15) As String

For a = 0 To 15
    For b = 0 To 15
    d = 2 * (a * 16 + b) + 1
    Masktable(a, b) = Mid(tmp, d, 2)
    
    Next
Next
For e = 1 To Len(mystr) Step 2
x = Val("&h" & Mid(mystr, e, 1))
y = Val("&h" & Mid(mystr, e + 1, 1))
z = z + Masktable(x, y)
Next
Mask = z

End Function

Public Function ToBin(n) As String
Do Until n = 0
    If (n Mod 2) Then ToBin = "1" & ToBin Else ToBin = "0" & ToBin
    n = n \ 2
Loop
If Len(ToBin) <> 8 Then ToBin = Nfois("0", 8 - Len(ToBin)) & ToBin Else
End Function

Public Function Nfois(a, n) As String
For i = 1 To n
j = j & a
Next
Nfois = j
End Function

Public Function toPOS(nBIN) As String
For i = 1 To 8
a = Mid(nBIN, i, 1)
If a = 1 Then b = b & (8 - i)
Next
toPOS = b
End Function

Public Function XXOR(Small, Big) As String
For i = 1 To Len(Small)
c = Val(Mid(Small, i, 1))
d = Val(Mid(Big, i, 1))
e = c Xor d
ee = ee & LTrim(Str(e))
Next
XXOR = ee
End Function

Public Function XXOR_HEX(HEX1, HEX2)
For i = 1 To Len(HEX1) / 2
a = Val("&h" & Mid(HEX1, 2 * i - 1, 2))
b = Val("&h" & Mid(HEX2, 2 * i - 1, 2))
c = Hex(a Xor b): If Len(c) = 1 Then c = "0" & c Else
d = d & c
Next
XXOR_HEX = d
End Function

Public Function BinToDec(BinNum) As String
If Len(BinNum) <> 8 Then BinNum = Nfois("0", 8 - Len(BinNum)) & BinNum Else
  For i = 8 To 1 Step -1
 j = j + Val(Mid(BinNum, i, 1)) * 2 ^ (8 - i)
  Next
  BinToDec = j

End Function

Public Function GF28(FirstByte, SecondByte)
a = ToBin(Val("&h" & FirstByte))
b = ToBin(Val("&h" & SecondByte))
If a = 0 Or b = 0 Then GF28 = "00": GoTo 3 Else 'FAUX
c = toPOS(a)
d = toPOS(b)

ReDim tab1(Len(c) - 1, Len(d) - 1)

For i = 0 To Len(c) - 1
nbr1 = Val(Mid(c, i + 1, 1))
    For j = 0 To Len(d) - 1
    nbr2 = Val(Mid(d, j + 1, 1))
    nbr3 = nbr1 + nbr2
    str_nbr = LTrim(Str(nbr3))
    If Len(str_nbr) = 1 Then str_nbr = "0" & str_nbr Else
    str_nbr2 = str_nbr2 & str_nbr
    Next
Next

1
For x = 1 To Len(str_nbr2) / 2
y = Mid(str_nbr2, x * 2 - 1, 2)
loc1 = InStr(str_nbr2, y)
loc2 = InStrRev(str_nbr2, y)
If (loc1 <> loc2) And (loc1 Mod 2 = 1) And (loc2 Mod 2 = 1) Then
str_nbr3 = Left(str_nbr2, loc1 - 1) & Mid(str_nbr2, loc1 + 2, loc2 - loc1 - 2) & Right(str_nbr2, Len(str_nbr2) - loc2 - 1)
str_nbr2 = str_nbr3
GoTo 1
End If
Next

lnSTR = Val(Left(str_nbr2, 2))
ReDim tab2(lnSTR)
For x = 1 To Len(str_nbr2) / 2
y = Val(Mid(str_nbr2, x * 2 - 1, 2))

tab2(y) = 1
Next

For x = lnSTR To 0 Step -1
If tab2(x) = "" Then tab2(x) = 0 Else
Step1 = Step1 & tab2(x)
Next

2
If Len(Step1) > 8 Then
XOR_const = "100011011" 'x^8+x^4+x^3+x+1
xor_str = XXOR(XOR_const, Step1)

If Val(xor_str) <> 0 Then After_XOR = Right(xor_str, Len(xor_str) - InStr(xor_str, "1") + 1) & Right(Step1, Len(Step1) - Len(xor_str)) Else After_XOR = Right(Step1, Len(Step1) - Len(xor_str))
Step1 = After_XOR
GoTo 2
End If
Step2 = Step1
myHex = Hex(BinToDec(Step2))
If Len(myHex) = 1 Then myHex = "0" & myHex Else
3 GF28 = myHex
End Function

'form1.frm
'---------------------------------------------------------

'Codé par laaraj11@hotmail.com
'En 2011

Private Sub Command1_Click()
Text4.Text = AES_Encrypt(NoSpace(Text1.Text), NoSpace(Text2.Text))
End Sub

Private Sub Command2_Click()
Text4.Text = AES_Decrypt(NoSpace(Text1.Text), NoSpace(Text2.Text))
End Sub

Private Sub Form_Load()
Skin1.LoadSkin "winaqua.skn"
Skin1.ApplySkin Me.hWnd
End Sub

Conclusion :


La difficulté dans ce programme réside dans la compréhension de l'algorithme ^^
Bonne lecture à tous !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
6 août 2014 à 14:29
Désolé, mais je n'ai pas vraiment le temps de faire des sources sur demandes (c'est déjà limite, j'ai pas le temps de faire des codes pour moi ... )
freesix Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 25 août 2014
5 août 2014 à 10:01
Salut NHenry,

J'ai l'impression que tu as l'air de bien comprendre tres bien la chose.

S'il te plait, peux-tu nous en faire une si complete en Vb6 et Vb .Net ???
laaraj11 Messages postés 6 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 13 janvier 2013
12 juin 2012 à 01:11
Cher LOULOU69,
la seul dll dans mon code est celle qui sert à améliorer le graphisme. Tu peux pallier à ce problème en effaçant les lignes suivant :
Private Sub Form_Load()
Skin1.LoadSkin "winaqua.skn"
Skin1.ApplySkin Me.hWnd
End Sub

et en supprimant l'objet Skin1 du form1 !

Espérant que ça va régler ton problème. Bon courage :)
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
11 juin 2012 à 10:46
Bonjour
il faut apparemment une Dll spécifique même enregistré sous Windows\system32 j'ai une erreur de chargement Erreur Système &H80004005. ou peut on prendre la bonne version de cette Dll?.
laaraj11 Messages postés 6 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 13 janvier 2013
8 juin 2012 à 22:35
Merci NHenry pour ces remarques !
En faite, je ne suis qu'un amateur en programmation ! je me rend compte que mon code n'est pas très didactique vue que j'ai pas mis de commentaires ni déclaré toutes mes variables !
Vous allez vous rendre compte en lisant la suite du code que la plupart des variables sont de type "String".
Je sais qu'il y'a beaucoup à optimiser !

Bonne soirée ^^
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.