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 averti
    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 averti
    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'

###raw>template_hook.ano_emploi###