Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Turbo PASCAL] Program do zabezpieczania danych

15 May 2010 20:26 2936 22
  • Level 12  
    Witam!
    Od jakiegoś czasu próbuję napisać program, który w plikach binarnych będzie przechowywał dane tekstowe. Mianowicie program ma działać tak:
    -żąda hasło
    -po podaniu w pliku binarnym sprawdza czy hasło jest poprawne (myślę, że to można zrobić poleceniem read(f, v); przy czym f to hasło w pliku, a v jako zmienna pobrana)
    -teraz program wyświetli nam dane, które również są zapisane w plikach binarnych

    Dodatkowo ma istnieć możliwość zmiany hasło (np. po przez rewrite(f);)
    oraz dodawania i kasowania ukrytych danych - i z tym mam największy problem

    W miarę możliwości poproszę o kawałki kodu

    Dodano po 10 [minuty]:

    Napisałem już kod, który zapisuje hasło do pliku pass.dat
    Code:
    USES CRT;
    

    VAR
    f : file of string;
    pass:string;

    BEGIN
    writeln('Haslo:');
    readln(pass);
    assign(f, pass.dta);
    rewrite(pass);
    close(f);
    end.


    Ale w
    Code:
    assign(f, pass.dta);

    dokładnie po 'pass' wyskakuje mi: ERROR121: Invalid qualifier
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Level 12  
    to jest nazwa pliku, w którym ma być zapisany hasło
    rozszerzenie znalazłem w necie, a pass to nazwa
  • Level 34  
    Nazwę pliku (ścieżkę do pliku) podaje się w apostrofach. Naucz się korzystać z help'u. Ustaw kursor pod np assign i naciśnij CTRL + F1
  • Level 20  
    Twój program zadziała po takich zmianach:
    Code:
    USES CRT; 
    

    VAR
    f : file of string;
    pass:string;

    BEGIN
    writeln('Haslo:');
    readln(pass);
    assign(f, 'pass.dta');
    rewrite(f); {otwarcie pliku do zapisu, każde wywołanie programu nadpisze plik!!!}
    write(f, pass);
    close(f);
    end.

    ale "tajne" hasło będzie możliwe do oczytania po otworzeniu pliku "pass.dta" w notatniku... i tajemnicę "diabli wzięli".
    Do pliku zatem musisz zapisywać hasło wcześniej zakodowane.
  • Level 12  
    A podpowiecie jak zakodować?
  • Level 32  
    Jakkolwiek. Poszperaj w google, a w szczególności na Wiki, pełno jest prostych algorytmów szyfrujących. Nie mam oczywiście na myśli niczego w rodzaju szyfrowania asynchronicznego z kluczem publicznym, raczej prymitywne, proste w "ręcznej" implementacji algorytmy, np. szyfr Cezara, ROT13 itp.

    Raczej nie piszesz nowego oprogramowania dla ZUSu, więc niskie bezpieczeństwo takich szyfrów nie powinno chyba być problemem. :P
  • Level 12  
    A znacie może komendę zmieniającą nazwe plików (wraz z rozszerzeniem). Odpowiednik ren w batch

    Dodano po 2 [minuty]:

    I jeszcze jedno, jak sprawdzić czy podane hasło jest identyczne z tym zapisanym w pliku binarnym.
    Próbowałem zapomocą komendy read(f, v);, ale nie umiem jej dokońca ustawić i mam błedy przy zamianie na zmienną v

    Dodano po 42 [minuty]:

    Poszperałem w google, i nieczaje nic z tego kodowania.
    Możecie mnie oświecić...
    Ja chciałbym aby kodowało do znaków specjalnych typu: «Ÿµ¾җم۝╡⌂∆, czy tak się wogłule da??
  • Moderator of Programming
    soulhudson wrote:
    A znacie może komendę zmieniającą nazwe plików (wraz z rozszerzeniem). Odpowiednik ren w batch

    Np. Rename - jedna wada - plik musisz najpierw otworzyć.

    soulhudson wrote:
    Poszperałem w google, i nie czaje nic z tego kodowania.
    Możecie mnie oświecić...
    Ja chciałbym aby kodowało do znaków specjalnych typu: «�#181;¾җم۝�#9569;⌂∆, czy tak się w ogłule da??

    Oczywiście, że jest to możliwe. Wystarczy zakodować tekst dowolną metodą, a potem podnieść kod ASCII zakodowanego znaku/znaków o odpowiednią liczbę.
    Może ten wątek Ci pomoże : Kodowanie metodą zamiany znaków.
  • Level 12  
    Niestety, ale nie pomogło. Wszyscy używają kilku zmiennych i jakieś obliczenia. Czy mógłbym prosić o gotowy kod z jakimś sensownym objaśnieniem. Powiedzmy że chcę przesuwać o 7 znaków do przodu.
    Proszę, jak najprościej!
  • Helpful post
    Moderator of Programming
    Masz, na szybko w TP :
    Code:
    program kodowanie;
    
    var
     ciag_znakow : string;
     x : word;
    begin
     write('Podaj ciag znakow, do zakodowania : ');
     readln(ciag_znakow);
     for x:=1 to length(ciag_znakow) do
      ciag_znakow[x]:=chr(ord(ciag_znakow[x])+ 7 );
     writeln('Zakodowany ciag znakow : ',ciag_znakow);
    end.
  • Level 12  
    Dzięki, wielki + dla ciebie, a teraz jak to odkodować??
    Tego też szukałem w necie i ten sam efekt.
    I co oznacza, a raczej do czego służy ta zmienna x??
  • Helpful post
    Moderator of Programming
    Odkodowuje się dokładnie tak samo, tylko zamiast +7 dajesz -7 :).
    Code:
    write('Podaj ciag znakow, do zakodowania : ');
    
     readln(ciag_znakow);
     for x:=1 to length(ciag_znakow) do
      ciag_znakow[x]:=chr(ord(ciag_znakow[x])  + 7 ); {!!!!!!!!!!!!!!!}
     writeln('Zakodowany ciag znakow : ',ciag_znakow);
    for x:=1 to length(ciag_znakow) do
      ciag_znakow[x]:=chr(ord(ciag_znakow[x])  - 7 ); {!!!!!!!!!!!!!!!}
     writeln('Zdekodowany ciag znakow : ',ciag_znakow);

    X to tylko zmienna do odliczania w pętli wszystkich znaków, można to równie dobrze zrobić na while i liczniku.
  • Level 12  
    Ok, narazie wszystko gra. Teraz chcę zrobić, aby podane hasło zostało sprawdzone z hasłem zapisanym w pliku dta. Szukałem w necie, i tam piszą że trzeba pobrać z pliku i ustawić jako zminną, próbołałem read(f, v) ale nie moge mam ciągle błedy
  • Moderator of Programming
    Wszystko zależy od tego, co ukryłeś pod zmienną V :)
    Zapisuj zakodowany tekst bajt po bajcie a nie jako ciąg znaków i sprawa załatwiona.
    Jako pierwszy bajt zapisz (tak jak w string), długość zapisywanego ciągu i możesz zapisywać hasła o różnej długości.
  • Level 12  
    Yyy nie dokońca rozumiem. W Pascalu jestem totalnym żółtodziobem.
    Napisałem już prawie cały kod (bez hasła) i zatrzymałem się na tym:
    w pliku mam 3 zdania:
    Ala ma kota
    Kot ma Ala
    Ala to kot

    I teraz chcę wykasować tylko jedno np. Kot ma Ale. Da się tak zrobić? Próbowałem zapisywać w tabeli i kasować wiersze, ale nic nie wyszło
  • Moderator of Programming
    1. Czytasz linie jedna po drugiej do zmiennej tekstowej.
    2. Sprawdzasz czy tekst zawiera ciąg znaków który chcesz wyeliminować.
    3. Nie zawiera - zapisujesz odczytaną linię do nowego pliku. Zawiera - nic nie zapisujesz.
    4. Powtarzasz p.1 - p.3 do końca pliku.
    5. Kasujesz plik oryginalny, zmieniasz nazwę nowego pliku na nazwę właśnie wykasowanego.
  • Level 12  
    A teraz tak:
    jak można sprawdzić czy istnieje plik (może jakoś za pomocą powlcenie IF THEN), do aplikacji chcę dołączyć opcję która sprawdza czy istnieją wszystkie wymagane pliki np. ten z hasłem

    Dodano po 2 [minuty]:

    Ale kodu, który sprawdza hasło z tym co jest zapisane w pliku, nadal nie czaje
  • Moderator of Programming
    Niestety w TP nie ma gotowych narządzi do sprawdzania obecności plików.
    Można jednak zastosować pewne "tricki" i napisać własną funkcję :
    Code:
    Uses Dos;
    
      function FILEXIST (name : PathStr) : boolean;
      begin
        filexist := FSearch (name, '') <> '';
      end;

    albo, prościej, używając FindFirst, np. :
    Code:
    Uses Dos;
    
      function FILEXIST (name : string) : boolean;
      var f : SearchRec;
      begin
        filexist := false;
        FindFirst (name, AnyFile, f);
        if DosError = 0 then
          if (f.attr <> Directory) and (f.attr <> VolumeId) then
            filexist := true;
      end;


    Co do dostępu do pliku z hasłem, to daj kawałek kodu nad którym pracujesz. Zobaczymy jak Ci pomóc.
  • Level 12  
    Ogólnie chcę zrobić tak:
    1. Aplikacja sprawdza czy istnieje plik pass.dta
    - jeśli nie, tworzy go i wstawia do niego podane przez nas hasło i współczynnik kodowania (liczba, o którą przesunięte są litery w szyfsze)
    - jeśli istnieje idziemy dalej
    2. Żąda hasła i sprawdza czy jest zgodne z tym zawartym w pliku pass.dta
    3. Wyświetla nam odkodowane dane z pliku data.dta
    4. Wyświetla inne dostępne opcje (wybieramy je poprzez podanie przyporządkowanej im literki)
    a dodaj kolejny wpis
    b skasuj wpis
    c zmień hasło lub współczynnik kodowania

    Punkty 3, 4 i 4a już mam na blachę opanowane, w miare rozumiem pkt. 4b, ale punktu 1, a co za nim idzie pkt. 4c nie rozumiem wcale (a w Pascalu jestem żółtodziobem), więc najpierw muszę mieć pkt. 1 aby ułożyć kod

    Dodano po 2 [minuty]:

    Tyle że do pkt. 3. muszę jeszcze dowiedzieć się, jak wyciągnąć dane z pliku data.dta i ustawić je jako zmienną, aby możliwe było ich odkodowanie, bo w kodach, które podajecie tekst trzeba ręcznie podać

    Dodano po 1 [godziny] 41 [minuty]:

    Mam też taki pomysł:
    Dane do zakodowanie będę zapisywał w tabeli, to ułatwi kasowanie (o ile jest możliwość kasowanie poszczegółnych wierszy lub komórek) i będzie działało to tak:
    Code:

    REPEAT
    writeln(numer,':');
    odczytywanie komórki 'numer' z tablicy
    numer+1
    UNTIL aż do końca tablicy

    I otrzymujemy takie coś:
    1:
    Ala ma Kota
    2:
    Kot ma Ale

    I jeżeli chcemy skasować jeden zapis podajemy jego numer i kasujemy cały wiersz

    Dodano po 18 [minuty]:

    A czy dało by się zapisywać te wszystkie informacje do tabeli w tym samym pliku co reszta kodu i zrobić np. tak:
    pierwszy wiersz - hasło
    drugi - współczynnik kodowania
    reszta - zakodowane dane?