[ASM] Szyfrowanie RSA - porównywanie kodów ASCII

0

Witam.

Mam dziwny problem związany z szyfrowaniem oraz deszyfrowaniem.

Otóż szyfrowanie odbywa się na podstawie kodów ASCII.

Pobierany jest kod ASCII znaku, a następnie liczba ta jest szyfrowana za pomocą klucza publicznego.

Problemu nie ma jeśli szyfruję zwykłe pliku tekstowe, typu : "Ala ma kota ..." wtedy wszystko jest ok, plik jest szyfrowany, a po odszyfrowaniu można odczytać tekst ukryty.

Nieciekawie zaczyna się robić gdy chcę zaszyfrować na przykład plik zip, rar bądź exe.

Możliwe jest, że pliki te posiadają znaki, których kodów nie ma w tablicy ASCII ?

Kolejny problem to polskie znaki. Zamiast nich pojawiają się inne litery.

Procedury szyfrujące / deszyfrujące wyglądają tak ;

POT_MOD PROC a:DWORD, w:DWORD, n:DWORD

	LOCAL pot:DWORD, wyn:DWORD ,q:DWORD
	LOCAL reszta:DWORD
	LOCAL temp_1:DWORD, temp_2:DWORD
	
	push ebx
	push edx
	push ecx
	
	mov pot		, 0
	mov wyn		, 0
	mov q		, 0	
	mov reszta	, 0
	mov temp_1	, 0
	mov temp_2	, 0
	

	
	;pot = a
	mov eax, a
	mov pot, eax
	
    ;wyn = 1
    mov wyn, 1
    
    ;q = w
    mov eax, w
    mov q, eax
    
    ;while(q > 0)
 
    .WHILE q > 0
    
		;if((q % 2) != 0)
		;reszta = q % 1
		mov eax, 0	; zerowanie rejestrow
		mov ecx, 0  ; zerowanie rejestrow
		mov edx, 0  ; zerowanie rejestrow
			

		mov eax, q
		mov ecx, 2
		div ecx
		mov reszta, edx
		
		.IF reszta != 0
			; wyn = (wyn * pot) % n;
			
			;wyn * pot
			mov eax, wyn
			mul pot
			mov temp_1, eax
			
			mov eax, 0
			mov ecx, 0
			mov edx, 0
			
			mov eax, temp_1
			mov ecx, n
			div ecx
			mov wyn, edx
		.ENDIF
		
		;pot = (pot * pot) % n;
		
		mov eax, pot
		mul pot
		mov temp_2, eax
		
		mov eax, 0
		mov ecx, 0
		mov edx, 0
		
		mov eax, temp_2
		mov ecx, n
		div ecx
		mov pot, edx
		
		;q = q / 2
		mov eax, 0
		mov ecx, 0
		mov edx, 0
    	
		mov eax, q
		mov ecx, 2
		div ecx
		mov q, eax	
		
    .ENDW
  
	mov eax, wyn
    mov EncodeMessage, eax

	pop ecx
	pop edx
	pop ebx
	
	ret
POT_MOD ENDP


;Pobiera jeden znak z łańcucha
;source - adres bufora z łańcuchem
:index - numer elementu w łańcuchu
GetSign PROC source:DWORD, index:DWORD

	xor esi, esi
	xor edi, edi
	
	mov esi, source
	mov edi, index

	movsx eax, byte ptr [esi+edi] ;<--- lub movzx
	ret
GetSign ENDP


; procedura szyfrująca plik
EncodingFile PROC

	LOCAL message:DWORD		; wiadomość do zaszyfrowania
	LOCAL temp:DWORD
	
	mov temp, 4

	; odczy zawartości pliku wejsciowego do bufora (buffer)
	;--------------------------------------------
	invoke ReadFromFile, ADDR input_file

	
	mov EncodeMessage, 0				; wyzerowanie zmiennej przechowującej wynik kodowania / dekodowania
	
	mov ecx, 0
	mov edx, 0
	mov ebx, offset buffer_read
	
	; zapis do buffer_red co 4 bajty
	
	.WHILE ecx != bytes_readed

		invoke GetSign, ADDR buffer, ecx   ; pobranie znaku
		
		mov message, eax	; znak do zmiennej message
		
		invoke POT_MOD, message, 7,35459   ; kodowanie
		
		mov dword ptr[ebx+edx], eax
		add edx, 4
		inc ecx
	.ENDW
	
	
	mov eax, bytes_readed
	mul temp
	mov bytes_to_write, eax	
	
	; zapisanie zakodowanej wiadomości do pliku
	;--------------------------------------------------
	invoke WriteToFile, ADDR output_file, ADDR buffer_read, bytes_to_write
	;--------------------------------------------------
	; napisać dopisywanie do pliku a nie nadpisywanie
	;--------------------------------------------------
	
	
	mov EncodeMessage, 0				; wyzerowanie zmiennej przechowującej wynik kodowania / dekodowania
	
	ret
EncodingFile ENDP


; DESZYFROWNIE

TEST_ASCII PROC

	;testowe kodowanie danych
	LOCAL encoding:DWORD	; zaszyfrowana wiadomość
	LOCAL decoding:DWORD	; odszyfrowana wiadomość
	LOCAL counter:DWORD		; licznik

	mov encoding, 0		; zerowanie zmiennej
	mov decoding, 0		; zerowanie zmiannej
	
	; odczy zawartości pliku wejsciowego do bufora (buffer)
	;--------------------------------------------
	invoke ReadFromFile, ADDR output_file
	;--------------------------------------------

	; obliczenie ile bajtów trzeba zapisać do pliku
    xor eax, eax
    xor ecx, ecx
    xor edx, edx
    mov counter, 0
    	
    mov eax, bytes_readed
    mov ecx, 4
    div ecx
    mov bytes_to_write, eax	
    
    mov esi, offset buffer
	mov edi, offset buffer_read
	xor ecx, ecx
	xor ebx, ebx
	xor edx, edx
	
	.WHILE ecx != bytes_to_write
		mov eax, dword ptr [esi+edx]		; pobranie z bufora zakodowanego znaku ASCII
		
		mov encoding, eax					; zakodowany kod ASCII do zmiennej encding
		invoke POT_MOD, encoding,9943,35459	; dekodowanie danych
		mov eax, EncodeMessage				; przesłanie do eax odkodowanej wiadomości
		mov byte ptr [edi+ebx], al			; przesłanie do bufora wyjściowego 8bitowego kodu ascii
		
		add edx, 4							; zakodowany kod typu DWORD
		add ebx, 1							; kod ASCII typu BYTE
		
		inc ecx
	.ENDW
	
	invoke WriteToFile, ADDR new_file, ADDR buffer_read, bytes_to_write
	
	invoke MessageBox,0,ADDR buffer_read,ADDR msgbox_title,0
	

	ret
TEST_ASCII ENDP

Z góry dziękuję za pomoc.

Pozdrawiam.

0

ojj Bracie a ty nadal swoje-w poprzednim twoim wątku na ten sam temat mówiliśmy ci już na co zwrócić uwagę

0

Witam.

Zastosowałem się do uwag.

Jeśli chodzi o operacje na 8bitowych kodach ASCII to robię to w podany sposób :

LOCAL temp:DWORD
       
;...
       
movsx eax, byte ptr [esi+ecx] ;<--- lub movzx
mov temp, eax

Zastosowałem się również do Twojej uwagi dotyczącej zawartości rej. edx przed operacją mnożenia, zeruje ten rejestr przed każdym mnożeniem.

Wszystko działa, gdy plik jest zwykłym plikiem zawierającym tekst, sypie się gdy chce zaszyfrować jakiś plik wykonywalny. Program się nie wysypuje, jednak wynik działania jest niepoprawny, zmienia nagłówki pliku itd.

Pozdrawiam.

0

taakie buty...

coś pamiętam,iż w poprzednim wątku kodując ASCII mówiłeś,iż program źle koduje bajty o wartości >190(170?).
I to jest przyczyną błędów,kiedy próbujesz szyfrować plik wykonywalny

HA!już mam pomysł czemu to może się fikać
movsx eax, byte ptr [esi+ecx]

ta instrukcja powoduje rozszerzanie liczby z zachowaniem znaku.Dokonuje się tego stawiając duużo jedynek z przodu,co powoduje iż liczba jaką otrzymujesz w rejestrze,potraktowana jako bez znaku(a tak się dzieje w przypadku twoich mnożeń) staje się nagle bardzo dużą liczbą.
A w pliku wykonywalnym to Bracie poszczególne bajty mają przecież przedział 0/255,a nie -128/+127
dlatego weź zamień movsx movzx

0

Jeśli chodzi o operacje na 8bitowych kodach ASCII to robię to w podany sposób :

LOCAL temp:DWORD
       
;...
       
movsx eax, byte ptr [esi+ecx] ;<--- lub movzx

Ech, robisz, ale bez zastanowienia :/ Kody ASCII to kody 7 bitowe, więc są to wartości od 0 do 127. Kodując pliki binarne (lub tekst z kodami >127) dopuszczasz wartości 0-255 i wszystko było by ok, gdyby nie to, że movsx będzie traktować wartości >127 jako wartości ujemne, czyli przypisując 128 (0x80) otrzymasz -128 (0xFFFFFF80), a nie 128. W komentarzu podałem movzx jako alternatywę dla movsx jeśli coś by nie poszło.

0

Jeszcze raz dziękuję. Wszystko działa.

I przepraszam za zamieszanie :)

Pozdrawiam.

0

Bracie Herk,można skorzystać z twojego kodu?Może mi się kiedyś przyda...

0

Siostro, Ty księdzem jesteś czy anarchistą?

1 użytkowników online, w tym zalogowanych: 0, gości: 1