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.