;;;;;; données necessaires pour un bon fonctionnement
ckey:
dd @f-$-4 ; directive brute force pour connaitre la taille d'un champ sous fasm.
db 'Mot de passe'
@@: ; etiquette anonyme, utilisée pour la directive precedente
dd 0 ; padding pour ne pas avoir d'erreur dans la mot de passe.
filetocrypt: ; peut etre n'importe quel fichier binaire
dd @f-$-4 ; respecter juste la structure autours du fichier.
file 'fichier à crypter .extension'
@@:
dd 0 ; padding utilisé pour ne pas deborder
;;;;;; pour executer le code
...
mov esi,ckey ; charger le mot de passe
call rnd1.init ; initialiser le PRNG
mov esi,filetocrypt ; pointer le fichier a crypter
mov edi,[esi] ; en connaitre la taille
add esi,4
call crypt ; lancer le chiffrement, dechiffrement
...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; petit algo de chiffrement;;;;;;;;;;;;;;;;
crypt:
call rnd1 ; generer un nombre aleatoire
xor [esi],ecx ; appliquer le XOR sur le fichier
inc esi ; pointer au prochain char du fichier, probleme d'alignement, mais c'est pas grave...
dec edi ; decrementer le compteur
jne crypt ; si c'est pas la fin, continuer
ret
;;;;;;;;; generateur pseudo aleatoire pour le chiffreur
rnd1:
mov ecx,[.seed]
add ecx,[.seed1]
add ecx,[.seed2]
add ecx,[.seed3]
or ecx,1
ror ecx,1
add [.seed],ecx
and cl,1
shr ecx,cl
adc [.seed1],ecx
and cl,1
shr ecx,cl
adc [.seed2],ecx
and cl,1
shr ecx,cl
adc [.seed3],ecx
ret
;;;;;;;; initialisation du generateur aleatoire depuis un mot de passe en ascii
.init:
push eax ebx ecx
mov ecx,[esi]
add esi,4
mov [.seed],ecx ; initialiser les graines avec la taille du mot de passe
mov [.seed1],ecx
mov [.seed2],ecx
mov [.seed3],ecx
@@:
movzx eax,byte[esi] ; charger un char du mot de passe.
movsx ebx,al
ror ebx,16
add eax,ebx
add [.seed],eax
adc [.seed1],0
adc [.seed2],0
adc [.seed3],0
inc esi
dec ecx
jne @b
pop ecx ebx eax
ret
align 4
.seed dd 0
.seed1 dd 0
.seed2 dd 0
.seed3 dd 0