Nie chce zaśmiecać forum, więc zapytam w tym wątku.
Nowy problem :-)
Problem pojawił się w momencie deszyfrowania wiadomości. Szyfrowanie działa jak należy.
Wszystko działa tak. Odczytuje dane z pliku i zapisuje je w buforze.
Następnie pobieram kolejno kody ASCII z bufora i przekazuje je do procedury szyfrującej :
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
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
ret
POT_MOD ENDP
Wszystko ładnie. Daje poprawną wartość, ale...
Procedura generuje poprawne wyniki tylko dla liczb (kodów ASCII) w zakresie od 0 do 190 - a kody ASCII mają zakres 0 - 255. Szyfrowanie / deszyfrowanie wygląda tak :
;testowe kodowanie danych
LOCAL message:DWORD
LOCAL encoding:DWORD
LOCAL decoding:DWORD
mov message, 190
mov EncodeMessage, 0
; kodowanie
invoke POT_MOD, message, 3, 187
mov eax, EncodeMessage
mov encoding, eax
xor eax, eax
mov EncodeMessage, 0
;TUTAJ DLA LICZB WIĘKSZYCH NIŻ 190 POJAWIAJĄ SIĘ PROBLEMY TJ. WIADOMOŚĆ JEST
;NIEPOPRAWNIE DESZYFROWANA
;dekodowanie
invoke POT_MOD, encoding, 107, 187
mov eax, EncodeMessage
mov decoding, eax
Chodzi chyba o to, że dla liczb powyżej 190 wartości są zbyt duże i coś gubi się w rejestrach.
Jeśli dobrze myślę, to jak to obejść ?
A może problemem jest coś innego.
Na tej stronie w tabelce Rozszyfrowywanie kluczem prywatnym RSA :
http://www.i-lo.tarnow.pl/edu/inf/alg/primes/pages/020.php
Jest opisane (chyba) jak sobie z tym poradzić, ale za bardzo nie potrafię tego zaimplementować w asemblerze.
Myślałem jeszcze nad takim rozwiązaniem :
Pobieram znak ASCII.
Sprawdzam czy jest mniejszy od 180.
Jeśli nie, odejmuje od niego różnicę (kod ASCII - 75).
Taką wartość zapisuje w rejestrze i zmieniam znak ( najstarszy bit na 1) - żeby przy deszyfrowaniu wiedzieć, że do odszyfrowanego kodu muszę dodać 75.
Przy deszyfrowaniu pobieram liczbę, sprawdzam znak, jeśli najstarszy bit = 1 to zmieniam znak, deszyfruje, do kodu ASCII dodaje 75.
Co o tym myślicie ?
Z góry dziękuję za pomoc.
Pozdrawiam.