Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Turbo Pascal]Szyfrowanie RSA i program się wywala ? pomocy

Vizzle 13 Cze 2005 21:53 3351 8
  • #1 13 Cze 2005 21:53
    Vizzle
    Poziom 21  

    Oto kod, który napisałem. Niestety jeszcze ani razu nie wykonał się prawidłowo :(.

    Może ktoś go przeanalizować i powiedzieć co i jak aby działało.
    Jeszcze jedno pytanko jeśli wygeneruję plik txt w postaci ...liczba liczba...
    czyli ...2341254 5423 332 123312 543543... jak wczytać kolejno te liczy do zmiennych ? będzie mi to potrzebne do odszyrowania inforamcji ?

    Będę bardzo wdzięczny za wszelką pomoc.


    Program Algorytm_RSA; {Algorytm jest uproszczonĄ wersjĄ (liczby pierwsze sĄ wzgl©dnie maˆe)}
    {Zostaˆ zaczerpni©ty z ksiĄľki "C++ Ksi©ga Eksperta"}
    Uses CRT; {Przykˆad wedˆug ksiĄľki Bruce'a Schneidera "Applied Cryptography}

    const c:comp=1;

    var
    test,sd:string;
    pubkey,zakodowany,plik:text;
    tymczasowa,E,i:byte;
    znak,odp:char;

    M,N,D,Q,Z:longint;
    zakod,wielka,h:comp;

    Begin
    textbackground(blue);
    randomize;
    i:=1;
    repeat
    ClrScr;
    writeln('Program kodujĄcy za pomocĄ algorytmu RSA');
    writeln;
    writeln('Podaj peˆnĄ scieľk© dost©pu do pliku, kt˘ry chesz kodowa†:');
    writeln('(np. c:\test\pliki\test.txt)');
    write('wprowad« nazw©:');
    readln(sd);
    assign(plik,sd);
    reset(plik);

    while not (eof(plik)) or (i=13) do
    begin
    readln(plik,test);
    writeln(test);
    i:=i+1;
    end;

    reset(plik);

    writeln('(..........C.D.........)');writeln;
    while keypressed do readkey; {czyszczenie buf. klaw.}
    repeat
    writeln('Czy chcesz kodowa† ten plik ?(t/n):');
    odp:=readkey;
    until (odp='t') or (odp='T') or (odp='n') or (odp='N');
    if (odp='t') or (odp='T') then

    Begin {cz©˜† wˆa˜ciwa algorytmu: kodowanie}

    writeln('Generuj© klucze sesji');writeln;
    {1.} i:=random(1)+40; {max 79}
    M:=((i*i)-(79*i)+1601);{obliczanie pseudo losowe liczb pierwszysch}
    i:=random(1)+40; {aby wyliczenia byˆy proste i szybkie "zastosowane"}
    N:=((i*i)-(79*i)+1601);{liczby pierwsze sĄ wzgl©dnie maˆe, normalnie stosowane}
    {2.} Z:=M*N; {posiadajĄ kilkaset miejsc po przecinku}




    Q:=(M-1)*(N-1);
    {obliczenie liczby wzgl©dnie pierwszej z Q #(M-1)*(N-1)#}
    {3.} repeat

    E:=random(200)+1;tymczasowa:=E;
    while E<>Q do if E>Q then E:=E-Q else Q:=Q-E;

    until E=1;

    E:=tymczasowa;
    {4.} {Otrzymano klucze publiczne Z i E, zapisujemy klucze do pliku pubkey.txt}

    writeln('Otrzymano klucze publiczne sesji pomy˜lnie');
    writeln('ZostanĄ zapisane do pliku c:\pubkey.txt');
    assign(pubkey,'c:\pubkey.txt');
    rewrite(pubkey);
    write(pubkey,'Z ',Z,' E ',E );
    close(pubkey);writeln('Zapisano');
    {5.}
    Q:=(M-1)*(N-1);
    D:=0;
    i:=0;
    repeat

    inc(i);
    D:=D+1;
    if (i mod 2)=0 then textcolor(yellow);
    write('.');
    textcolor(white);

    until ((D*E) mod Q)=1;

    clrscr;

    {----------------------------------------Wykonuj© szyfrowanie--------------------------------}

    writeln('Rozpoczynam kodowanie pliku ',sd,'. Plik wyj˜ciowy to c:\rsa.txt');writeln;
    assign(zakodowany,'c:\rsa.txt');
    rewrite(zakodowany);

    repeat


    read(plik,znak);
    write(znak);

    if wielka<>ord(znak) then wielka:=ord(znak);

    for i:=1 to E do wielka:=c*wielka*ord(znak);

    {zakod:=(zakod mod Z);}
    i:=0;
    repeat

    inc(i);
    if (i mod 100)=0 then write('-');
    wielka:=wielka-Z;

    until wielka<0;

    wielka:=wielka+Z;

    write('.');
    write(zakodowany,wielka,' ');


    until EOF(plik);
    close(plik);close(zakodowany);
    writeln;
    writeln('Plik zakodowany pomy˜lnie');
    writeln;
    End;

    while keypressed do readkey;
    writeln('Czy zakoäczy† dziaˆanie programu ?(t/n)');
    odp:=readkey;

    until (odp='t') or (odp='T');

    writeln;
    writeln('Program zostanie zakoäczony za 3sek.');writeln;
    writeln('Autor: Daniel Markowski ver.nie zoptymalizowana;testowa');
    delay(3000);
    textbackground(black);
    End.


    Jeszcze załącznik z tym samym ale może będzie łatwiej cokolwiek z wcięciami.

    0 8
  • #2 14 Cze 2005 00:55
    wddf
    Poziom 18  

    u mnie po zmianie rodzaju zmiennych i stałej comp, na inny typ, działa, do połowy tzn. zaczyna wykonywać szyfrowanie i sie wiesza, może uprość szyfr? Pozatym przenieść wypada do działu programowanie ogólne

    0
  • #3 14 Cze 2005 01:32
    Vizzle
    Poziom 21  

    Co do działu nie zorientowałem się że takowy występuje, zaraz sięto naprawi.

    Nie można zmieniać typów zmiennych bo 1 muszą to być całkowite czyli mniejsza od COMP jest LongInt, niestety jest za mała i zaraz jej zakres jest przekroczony :(.

    Co do uproszczenia to ten RSA jest już maxmalnie porosty, bardzej sięchyba nie da.

    0
  • #4 14 Cze 2005 01:50
    wddf
    Poziom 18  

    u mnie na comp nie chodziło wcale... to dlatego zmienilem

    0
  • #5 14 Cze 2005 04:51
    Romek^2
    Poziom 2  

    Niestety wybrane liczby pseudolosowe są zbyt duże. Podany kod ma prawo zadziałac w jakims języku gdy wyłączone jest sprawdzanie zakresu liczb - być może jest tak w C++, z którego to było skopiowane.
    Radzę, na czas testowania zacząć od małych liczb pierwszych i wyłączyć Randomizacje i doprowadzić kod do działania, a potem dopiero bawić się w wielkie liczby. (testowałem w Turbo55)

    0
  • #6 15 Cze 2005 00:13
    Vizzle
    Poziom 21  

    W zasadzie w kodzie widać żę to:
    " {1.} i:=random(1)+40; {max 79}
    M:=((i*i)-(79*i)+1601);{obliczanie pseudo losowe liczb pierwszysch}"
    da zawrotną liczbę pierwszą = 41 a to chyba nie jest za wielka liczba piwerwsza do działań. To coś innego :(

    0
  • #7 15 Cze 2005 01:29
    Romek^2
    Poziom 2  

    Sam problem z wysypywaniem sie programu (przynajmniej pod turbo 55) jest gdzie indziej - zmodyfikowałem program przez doanie kilku wydruków posrednich :
    repeat
    read(plik,znak);
    write(znak);
    ordznak := ord(znak);
    if wielka<>ordznak
    then wielka:=ordznak;
    for i:=1 to E do
    begin
    { wielka:=c*wielka*ord(znak);}
    wielka:=wielka*ordznak;
    write( wielka:20:0 ); { <=== tutaj sie zatrzymuje }
    end;
    {zakod:=(zakod mod Z);}
    i:=0;
    repeat
    inc(i);
    if (i mod 100)=0
    then write('-');
    wielka:=wielka-Z;
    until wielka<0;
    wielka:=wielka+Z;
    write('.'); write(zakodowany,wielka,' ');
    until EOF(plik);
    program sie zatrzymuje z powodu przekroczenia zakresy liczb. Tak sobie myslę, że warto by jeszcze raz obejrzeć czy program został poprawnie przeniesiony z C++

    0
  • #8 03 Lip 2005 18:40
    Darom
    Specjalista elektryk

    Panowie. Ja wczesniej pisałem program szyfrowania RSA. Tam zawsze występuje problem wielkich liczb. Mnie w Delphi i C++ udało sie uruchomić algorytm 32bitowy (daleko do szyfrowania 512 bitowego, czy 2048). Można wykożystać Java. jest tam taka zmienna o programowanej precyzyjności. nazywa sie BigInteger. Z wykorzystaniem tej liczy napisane są przeróżne biblioteki szyfrujce (np. BouncyCastle)


    Pzdr
    Darek

    0
  • #9 03 Lip 2005 21:21
    Vizzle
    Poziom 21  

    Cytat:
    że warto by jeszcze raz obejrzeć czy program został poprawnie przeniesiony z C++

    Jeszcze raz mówię to jest algorytm opisowy, a nie kalka kodu z C++.

    Błąd 207 to się pojawia przy wykonywaniu a nie przekroczenie zakresu zmiennej (po delikatnym fejsingu).

    0
  Szukaj w 5mln produktów