IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Assembleur Discussion :

Exemple de chiffrement-déchiffrement 128 bits


Sujet :

Contribuez Assembleur

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut Exemple de chiffrement-déchiffrement 128 bits
    Salut..

    Je vois qu'il y a quand même pas mal de monde qui passe dans cette partie du forum, alors je décide de contribuer, si ça peut aider à comprendre l'asm.

    Un programme que j'ai écrit lorsque je débutais. C'est un exemple simple de chiffrement-déchiffrement avec une clef de 128 bits. Ca a été écrit pour Fasm et WIn32 mais c'est facilement adaptable pour d'autres compilateurs et Linux.

    Par contre, ce n'est qu'un exemple, ça doit donc être considéré en tant que tel et non utilisé pour chiffrer des documents. Pour cela, il y a de vrais solutions fiables, comme l'AES par exemple.

    Le code d'origine a un strlen, mais je l'ai viré volontairement, comme ça vous pourrez vous amuser à en rajouter un.
    Modifier des codes, les améliorer, c'est excellent pour apprendre rapidement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    format PE console
    include 'include/windows/win32a.inc'
    entry start
     
    section '.text' code readable executable
     
     
     
    start:
    	stdcall	demo,buf1,32,buf2	;chiffrement des bytes du buf1 vers le buf2
    	stdcall	demo,buf2,32,buf3	;déchiffrement des bytes du buf2 vers le buf3
    	cinvoke	printf,forms,buf3	;affichage des bytes déchiffrés du buf3
     
    	ret
     
     
     
    proc demo inbuf,len,outbuf
     
    	mov	esi,dword [inbuf]
    	mov	edi,dword [outbuf]
    	mov	ecx,dword [len]
     
         @@:
    	mov	ebx,table
        @re:
    	mov	al,byte [ebx]
    	or	al,al
    	jz	@b
    	inc	ebx
    	shl	ax,8
    	lodsb
    	cmp	al,ah
    	jz	@f
    	xor	al,ah
         @@:
    	stosb
    	dec	ecx
    	jnz	@re
     
    	ret
    endp
     
     
     
     
    section '.data' data readable writeable
     
    buf1 db 'la petite maison dans la prairie',0
    buf2 rb 256
    buf3 rb 256
     
    table db 0x7d,0x72,0x6f,0xd7,0x84,0x09,0xb2,0x18,\
    	 0x12,0xd7,0x43,0xf3,0x33,0x1b,0xa4,0x6f
     
    forms db '%s',13,10,0
     
     
     
     
    section '.idata' import data readable writeable
     
    library msvcrt, 'msvcrt.dll'
     
    import msvcrt,\
    printf, 'printf'
    Le même code en raw, donc sans les macros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    format PE console
    entry start
     
    section '.text' code readable executable
     
     
     
      start:
    	push	buf2
    	push	32
    	push	buf1
    	call	demo
     
    	push	buf3
    	push	32
    	push	buf2
    	call	demo
     
    	push	buf3
    	push	forms
    	call	[printf]
     
    	add	esp,8
    	ret
     
     
     
       demo:
    	push	ebp
    	mov	ebp,esp
     
    	mov	esi,dword [ebp+8]
    	mov	ecx,dword [ebp+12]
    	mov	edi,dword [ebp+16]
     
         @@:
    	mov	ebx,table
        @re:
    	mov	al,byte [ebx]
    	or	al,al
    	jz	@b
    	inc	ebx
    	shl	ax,8
    	lodsb
    	cmp	al,ah
    	jz	@f
    	xor	al,ah
         @@:
    	stosb
    	dec	ecx
    	jnz	@re
     
    	mov	esp,ebp
    	pop	ebp
    	ret	12
     
     
     
     
    section '.data' data readable writeable
     
    buf1 db 'la petite maison dans la prairie',0
    buf2 rb 256
    buf3 rb 256
     
    table db 0x7d,0x72,0x6f,0xd7,0x84,0x09,0xb2,0x18,\
    	 0x12,0xd7,0x43,0xf3,0x33,0x1b,0xa4,0x6f
     
    forms db '%s',13,10,0
     
     
     
     
    section '.idata' import data readable writeable
     
    dd 0,0,0,rva msvcrt_name,rva	msvcrt_table
    dd 0,0,0,0,0
     
    msvcrt_table:
      printf	dd rva _printf
      dd 0
     
    _printf		db 0,0,'printf',0
    msvcrt_name	db 'msvcrt.dll',0

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut
    Erreurs dans le code.
    Il manque un byte 0 à la fin de la table.
    Et la comparaison ne sert apparemment à rien..
    Je sais pas pourquoi j'avais conclu à l'époque que c'était obligatoire.
    Je viens de voir tout ça en réutilisant le code pour autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    format PE console
    include 'include/windows/win32a.inc'
     
    section '.text' code readable executable
     
    entry $
    	stdcall	demo,buf1,32,buf2	;chiffrement des bytes du buf1 vers le buf2
    	stdcall	demo,buf2,32,buf3	;déchiffrement des bytes du buf2 vers le buf3
    	cinvoke	printf,forms,buf3	;affichage des bytes déchiffrés du buf3
     
    	ret
     
    proc demo inbuf,len,outbuf
     
    	mov	esi,dword [inbuf]
    	mov	edi,dword [outbuf]
    	mov	ecx,dword [len]
     
         @@:
    	mov	ebx,table
        @re:
    	mov	al,byte [ebx]
    	or	al,al
    	jz	@b
    	inc	ebx
    	shl	ax,8
    	lodsb
    	xor	al,ah
    	stosb
    	dec	ecx
    	jnz	@re
     
    	ret
    endp
     
     
    section '.data' data readable writeable
     
    buf1 db 'la petite maison dans la prairie',0
    buf2 rb 256
    buf3 rb 256
     
    table db 0x7d,0x72,0x6f,0xd7,0x84,0x09,0xb2,0x18,\
    	 0x12,0xd7,0x43,0xf3,0x33,0x1b,0xa4,0x6f,0
     
    forms db '%s',13,10,0
     
    section '.idata' import data readable writeable
     
    library msvcrt, 'msvcrt.dll'
     
    import msvcrt,\
    printf, 'printf'

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut
    Nouvelle version 2025, parce que bon, je sais pas où j'avais la tête pour coller ce shl ax,8....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    format PE console 4.0
    include 'include/win32a.inc'
     
    section '.text' code readable executable
     
    entry start
     
    start:
        stdcall xor_cipher, buf1, 32, buf2   ; Chiffre buf1 -> buf2
        stdcall xor_cipher, buf2, 32, buf3   ; Déchiffre buf2 -> buf3
        cinvoke printf, format_str, buf3     ; Affiche le résultat
     
        invoke ExitProcess, 0
     
    ; ------------------------------------------------------------
    ; XOR cipher : applique un XOR entre chaque byte d'entrée
    ;              et la clé issue de la table (en boucle)
    ; inbuf  = source
    ; len    = longueur
    ; outbuf = destination
    ; ------------------------------------------------------------
    proc xor_cipher inbuf:DWORD, len:DWORD, outbuf:DWORD
     
        push esi edi ecx eax ebx
     
        mov esi, [inbuf]      ; Source
        mov edi, [outbuf]     ; Destination
        mov ecx, [len]        ; Taille à traiter
        xor ebx, ebx          ; Index dans la table
     
    @@:
        mov al, [esi]         ; Lire byte source
        mov dl, [table + ebx] ; Lire octet de la table
        xor al, dl            ; Chiffrement XOR
        mov [edi], al         ; Stocker résultat
     
        inc esi
        inc edi
        inc ebx
        cmp byte [table + ebx], 0
        jne .no_reset
        xor ebx, ebx          ; Recommence depuis le début de la table
    .no_reset:
        dec ecx
        jnz @b
     
        pop ebx eax ecx edi esi
        ret
    endp
     
    section '.data' data readable writeable
     
    buf1 db 'la petite maison dans la prairie', 0
    buf2 rb 256
    buf3 rb 256
     
    table db 0x7D, 0x72, 0x6F, 0xD7, 0x84, 0x09, 0xB2, 0x18,\
           0x12, 0xD7, 0x43, 0xF3, 0x33, 0x1B, 0xA4, 0x6F, 0
     
    format_str db 'Résultat : %s', 13, 10, 0
     
    section '.idata' import data readable writeable
     
    library msvcrt, 'msvcrt.dll',\
            kernel32, 'kernel32.dll'
     
    import msvcrt,\
           printf, 'printf'
     
    import kernel32,\
           ExitProcess, 'ExitProcess'

Discussions similaires

  1. Déchiffrement AES 128 bits
    Par Happpy dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/03/2014, 00h27
  2. Problème d'alignement sur 128 bits
    Par progfou dans le forum C++
    Réponses: 24
    Dernier message: 06/07/2007, 16h15
  3. Nombre de 128 bits
    Par Elendhil dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2007, 17h00
  4. déclaration de variables de 16, 32 et 128 bits
    Par samipate dans le forum C++
    Réponses: 10
    Dernier message: 30/12/2004, 22h33
  5. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo