Salausalgoritmi merkkijonolle?

Millaisella algoritmilla saisi merkkijonon muunnettua kryptattuun muotoon mahdollisimman tehokkaasti. Tarkoitan nimenomaan merkkijonoa en tiedostoa.
221397
Äänestä

Muut lukivat myös

Vastaukset 22

Vanhimmat

Käytät exclusive or eli xor-operaatiota sen jokaiseen merkkiin. Avaimeksi valitset jonkin helposti tuotettavan pseudosatunnaisen sarjan tai esim. jonkin salasanan, jota toistamalla saat jokaista merkkiä vastaavan avaimen.

Purku tapahtuu täsmälleen samalla xor-operaatiolla.

Salaus on helppo murtaa jos vähän yrittää, mutta yksinkertaisissa tapauksissa se riittää. Jos sinulla on monimutkaisempia tarpeita salaukselle, voit varmasti kertoa niistä jollekin kryptografian asiantuntijalle, niin sitten saat kunnon ratkaisun.

Äänestä

Luettavien merkkien piilotus onnistuu kun laittaa Edit -komponentin
PasswordChar merkiksi esim '*' tähden tai jonku muu kuin #0

Äänestä

Aika helppo tapa saada salaus on asentaa (esim.) DCPcrypt-komponentti.
http://fi.wikipedia.org/wiki/DCPcrypt

(Se on saatavissa Delphiin ja Lazarukseen)

Sen käyttö on aika yksinkertaista:
1. luodaan valitun salausalgoritmin (esim. RC4) mukainen olio
2. alustetaan kyseinen olio salaussanalla ja valitulla tiivistealgoritmillä (esim. SHA-1)
3. salataan/puretaan haluttu merkkijono.

Äänestä
  • Kiitos vastauksista

    XOR näyttää liian helposti purettavalta jopa merkki kerrallaan kokeillen.

    DCPcrypt näyttää hyvältä, mutta sen demo esitteli tiedostokryptausta (filestreaming), siinä ei ollut merkkijonon kryptausesimerkkiä, joten sitä täytynee jotenkin modifioida merkkijonorutiiniksi...

    Muuten, toimiikohan esim Blowfish, MD5 ym täsmälleen samalla tavalla eri prosessori- ja käyttöjärjestelmäympäristöissä eli avautuuko kryptattu sisältö _aina_ siitä huolimatta, että se on tehty samalla koodilla, mutta eri ympäristössä?

    Äänestä

  • mutta, mutta kirjoitti:

    Kiitos vastauksista

    XOR näyttää liian helposti purettavalta jopa merkki kerrallaan kokeillen.

    DCPcrypt näyttää hyvältä, mutta sen demo esitteli tiedostokryptausta (filestreaming), siinä ei ollut merkkijonon kryptausesimerkkiä, joten sitä täytynee jotenkin modifioida merkkijonorutiiniksi...

    Muuten, toimiikohan esim Blowfish, MD5 ym täsmälleen samalla tavalla eri prosessori- ja käyttöjärjestelmäympäristöissä eli avautuuko kryptattu sisältö _aina_ siitä huolimatta, että se on tehty samalla koodilla, mutta eri ympäristössä?

    Ei pitäisi riippua sillä laskutapa on sama.
    Ongelmia voi aiheuttaa se että eri järjestelmissä on erilaiset
    - rivinloppumerkinnät http://wiki.lazarus.freepascal.org/End_of_Line ,
    - tiedontalletustavat (bigendian, littleendian)
    http://wiki.lazarus.freepascal.org/Writing_portable_code_regarding_the_processor_architecture ,
    - merkkijärjestelmät (utf-8, iso8859-x ...) http://fi.wikipedia.org/wiki/Luokka:Merkistöt

    Äänestä

  • mutta, mutta kirjoitti:

    Kiitos vastauksista

    XOR näyttää liian helposti purettavalta jopa merkki kerrallaan kokeillen.

    DCPcrypt näyttää hyvältä, mutta sen demo esitteli tiedostokryptausta (filestreaming), siinä ei ollut merkkijonon kryptausesimerkkiä, joten sitä täytynee jotenkin modifioida merkkijonorutiiniksi...

    Muuten, toimiikohan esim Blowfish, MD5 ym täsmälleen samalla tavalla eri prosessori- ja käyttöjärjestelmäympäristöissä eli avautuuko kryptattu sisältö _aina_ siitä huolimatta, että se on tehty samalla koodilla, mutta eri ympäristössä?

    Jos salausalgoritmikirjastoa ei ole kaikkialla saatavilla, mutta käytössä on kuitenkin sama (pseudo)satunnaislukugeneraattori, saat tavallisen pulliaisen kestävän salauksen XORillakin.

    Käytä avainta suoraan satunnaislukugeneraattorin alustukseen. Voit salata esimerkiksi 8-bittisiä merkkejä yksi kerrallaan siten, että käytät satunnaislukugeneraattoria saadaksesi kokonaisluvun suljetulta väliltä 0:sta 255:een ja XORraat sillä merkin. Purkaminen tapahtuu luonnollisesti täsmälleen samalla tavalla.

    Kovin vakavaan käyttöön tällaista salausta ei kannata ottaa, sillä ohjelmointikielten kirjastojen ensimmäiseksi tarjoamat satunnaislukugeneraattorit eivät ole kryptografisesti kovin vahvoja. Jos saat käsiisi vähän yli 600 peräkkäistä Mersenne Twisterin tuottamaa satunnaislukua, sitä seuraavat voitkin laskea itse.

    Salausta voi vahvistaa esim. laskemalla satunnaislukugeneraattorilta saaduista luvuista tiiviste jollakin yksisuuntaisella funktiolla (esim. MD5 tai SHA1) ja käyttämällä tiivistettä XORissa, mutta tällaisen virittelyn sijaan voi kyllä miettiä, olisiko parempi käyttää suoraan jotain hyväksi tunnettua salausalgoritmia.

    Äänestä

  • mutta, mutta kirjoitti:

    Kiitos vastauksista

    XOR näyttää liian helposti purettavalta jopa merkki kerrallaan kokeillen.

    DCPcrypt näyttää hyvältä, mutta sen demo esitteli tiedostokryptausta (filestreaming), siinä ei ollut merkkijonon kryptausesimerkkiä, joten sitä täytynee jotenkin modifioida merkkijonorutiiniksi...

    Muuten, toimiikohan esim Blowfish, MD5 ym täsmälleen samalla tavalla eri prosessori- ja käyttöjärjestelmäympäristöissä eli avautuuko kryptattu sisältö _aina_ siitä huolimatta, että se on tehty samalla koodilla, mutta eri ympäristössä?

    Tässä pieni koodipätkä
    Alustavat toimenpiteet:
    1) Asenna DCPCrypt -komponenttipaketti komponenttipaletille (jos sitä ei ole vielä asennettu. Sitä ei ole vakiona)
    2)Tee uusi projekti.
    3)Tuo Form:lle
    - kaksi kpl Edit-komponenttia
    - kaksi kpl Button-komponenttia
    - yksi Label-komponentti
    - yksi Blowfish -komponentti(TDCP_blowfish)
    - yksi MD5 -komponentti (TDCP_md51)
    4) Kun teet vielä Button-komponentille alla esitetyt tapahtumat niin ohjelma on valmis ajattavaksi:



    procedure TForm1.Button1Click(Sender: TObject);
    var salasana, merkkijono, salattuviesti:string;
    begin
       merkkijono := Edit1.Text;
       salasana := Edit2.Text;
       DCP_blowfish1.InitStr(salasana,TDCP_md5);
       salattuviesti := DCP_blowfish1.EncryptString(merkkijono);
       DCP_blowfish1.Burn;
       Label1.Caption := salattuviesti;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var salasana, salattuviesti, avattuviesti:string;
    begin
       salattuviesti := Label1.Caption;
       salasana := Edit2.Text;
       DCP_blowfish1.InitStr(salasana,TDCP_md5);
       avattuviesti := DCP_blowfish1.DecryptString(salattuviesti);
       DCP_blowfish1.Burn;
       Edit1.Text := avattuviesti;
    end;

    Äänestä

  • -_A_- kirjoitti:

    Tässä pieni koodipätkä
    Alustavat toimenpiteet:
    1) Asenna DCPCrypt -komponenttipaketti komponenttipaletille (jos sitä ei ole vielä asennettu. Sitä ei ole vakiona)
    2)Tee uusi projekti.
    3)Tuo Form:lle
    - kaksi kpl Edit-komponenttia
    - kaksi kpl Button-komponenttia
    - yksi Label-komponentti
    - yksi Blowfish -komponentti(TDCP_blowfish)
    - yksi MD5 -komponentti (TDCP_md51)
    4) Kun teet vielä Button-komponentille alla esitetyt tapahtumat niin ohjelma on valmis ajattavaksi:



    procedure TForm1.Button1Click(Sender: TObject);
    var salasana, merkkijono, salattuviesti:string;
    begin
       merkkijono := Edit1.Text;
       salasana := Edit2.Text;
       DCP_blowfish1.InitStr(salasana,TDCP_md5);
       salattuviesti := DCP_blowfish1.EncryptString(merkkijono);
       DCP_blowfish1.Burn;
       Label1.Caption := salattuviesti;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var salasana, salattuviesti, avattuviesti:string;
    begin
       salattuviesti := Label1.Caption;
       salasana := Edit2.Text;
       DCP_blowfish1.InitStr(salasana,TDCP_md5);
       avattuviesti := DCP_blowfish1.DecryptString(salattuviesti);
       DCP_blowfish1.Burn;
       Edit1.Text := avattuviesti;
    end;

    Tattis, tuo näyttää todella toimivan!!

    Yritin sitten mennä pikkaisen pitemmälle ja tehdä tuon pohjalta itsenäisen aliohjelman ( eli sellaisen ratkaisun mitä varsinaisestii olen etsinyt), mutta nyt ei toiminutkaan, kääntäjä ei näytä tunnistavan DCP_blowfish1:ä proceduurin sisällä. Mikähän tässä nyt mättää..


    procedure viestinsalaus(var salasana, salattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.EncryptString(salattavamerkkijono);
    DCP_blowfish1.Burn;
    salattavamerkkijono := tilapaismuuttuja;
    end:

    procedure viestinavaus(var salasana, avattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.DecryptString(avattavamerkkijono);
    DCP_blowfish1.Burn;
    avattavamerkkijono := tilapaismuuttuja;
    end:

    Kääntäjä herjaa näiden aliohjelmien kohdalla:
    "Undeclared identifier DCP_blowfish1"

    Äänestä

  • TRRY kirjoitti:

    Jos salausalgoritmikirjastoa ei ole kaikkialla saatavilla, mutta käytössä on kuitenkin sama (pseudo)satunnaislukugeneraattori, saat tavallisen pulliaisen kestävän salauksen XORillakin.

    Käytä avainta suoraan satunnaislukugeneraattorin alustukseen. Voit salata esimerkiksi 8-bittisiä merkkejä yksi kerrallaan siten, että käytät satunnaislukugeneraattoria saadaksesi kokonaisluvun suljetulta väliltä 0:sta 255:een ja XORraat sillä merkin. Purkaminen tapahtuu luonnollisesti täsmälleen samalla tavalla.

    Kovin vakavaan käyttöön tällaista salausta ei kannata ottaa, sillä ohjelmointikielten kirjastojen ensimmäiseksi tarjoamat satunnaislukugeneraattorit eivät ole kryptografisesti kovin vahvoja. Jos saat käsiisi vähän yli 600 peräkkäistä Mersenne Twisterin tuottamaa satunnaislukua, sitä seuraavat voitkin laskea itse.

    Salausta voi vahvistaa esim. laskemalla satunnaislukugeneraattorilta saaduista luvuista tiiviste jollakin yksisuuntaisella funktiolla (esim. MD5 tai SHA1) ja käyttämällä tiivistettä XORissa, mutta tällaisen virittelyn sijaan voi kyllä miettiä, olisiko parempi käyttää suoraan jotain hyväksi tunnettua salausalgoritmia.

    Huomaa että kun kieli on Pascal niin käytännössä oletusarvoisesti kirjastot linkitetään suoraan ajettavaan koodiin. Tyypillisesti Pascal-komponenttikirjastot on laadittu niin että jos käytetään osaa kirjastoa niin linkitetään vain osa. Näin tehdään myös esim. DCPcrypt:n kanssa.
    Eli jos koodissa on käytetään DCPcrypt:n ICE2 salausalgoritmiä eikä esim. DES:ä, IDEA:a tmv niin
    niitä ei oletusarvoisesti linkitetä mukaan.

    Tällä saavutetaan pienempi riippuvuuksien määrä jolloin ohjelmat ovat helpommin siirrettävissä toiseen koneeseen (pienempi haaste harrastajalle).

    (Monen muun kielen käytännön toteutukset käyttävät enemmän ajonaikaisia kirjastoja)

    Äänestä

  • aaaaaaaaaaaaaaaaa kirjoitti:

    Huomaa että kun kieli on Pascal niin käytännössä oletusarvoisesti kirjastot linkitetään suoraan ajettavaan koodiin. Tyypillisesti Pascal-komponenttikirjastot on laadittu niin että jos käytetään osaa kirjastoa niin linkitetään vain osa. Näin tehdään myös esim. DCPcrypt:n kanssa.
    Eli jos koodissa on käytetään DCPcrypt:n ICE2 salausalgoritmiä eikä esim. DES:ä, IDEA:a tmv niin
    niitä ei oletusarvoisesti linkitetä mukaan.

    Tällä saavutetaan pienempi riippuvuuksien määrä jolloin ohjelmat ovat helpommin siirrettävissä toiseen koneeseen (pienempi haaste harrastajalle).

    (Monen muun kielen käytännön toteutukset käyttävät enemmän ajonaikaisia kirjastoja)

    > Tällä saavutetaan pienempi riippuvuuksien määrä
    > jolloin ohjelmat ovat helpommin siirrettävissä
    > toiseen koneeseen (pienempi haaste harrastajalle).

    Pitää paikkansa. Mutta kai tässä yhteydessä on hyvä (rehellisyyden nimissä) tuoda esiin myös Delphin oletuksena tekemän staattisen linkkauksen huonot puolet.

    Niitä ovat:

    - Tuhlataan levytilaa, koska kirjastosta löytyvä ohjelmakoodi on sisällytetty erikseen jokaiseen sitä käyttävään ohjelmaan. Eli ohjelmatiedostot ovat suurempia kuin mitä niiden tarvitsisi olla. Satojen gigojen kovalevyillä tämä ei tietenkään tunnu missään, mutta on myös ympäristöjä, joissa se tuntuu.

    - Tuhlataan muistia. Jos moni ajossa oleva ohjelma käyttää samaa kirjastoa, käyttöjärjestelmä lataa dynaamisesti linkitetyn kirjastokoodin muistiin vain yhteen paikkaan. Staattisesti linkattu kirjastokoodi ladataan muistiin jokaiselle ohjelmalle erikseen.

    - Vaikeutetaan ylläpitoa. Jos kirjastosta löytyy esimerkiksi tietoturva-aukko, kaikki kirjastoa dynaamisesti käyttävät ohjelmat olisi paikattu sillä, että kirjastotiedosto vaihdetaan. Sen sijaan kaikki ohjelmat, joihin kirjasto on staattisesti linkattu, joudutaan kääntämään uudelleen päivitetyn kirjaston kanssa. Päivitettävää voi tulla paljonkin. Erityinen ongelmahan tämä on suljetun koodin (kukaan ei voi kääntää itse) ja huonosti ylläpidettyjen (ohjelman tekijä viivyttelee päivityksen tarjoamisessa) ohjelmien kanssa.

    Järkeviä kääntäjiä käyttäessä ohjelmoija voi valita, mitä linkataan staattisesti ja mitä dynaamisesti. Käsittääkseni näin on myös Delphissä.

    Äänestä

  • mutta jatkokehittelyni ei... kirjoitti:

    Tattis, tuo näyttää todella toimivan!!

    Yritin sitten mennä pikkaisen pitemmälle ja tehdä tuon pohjalta itsenäisen aliohjelman ( eli sellaisen ratkaisun mitä varsinaisestii olen etsinyt), mutta nyt ei toiminutkaan, kääntäjä ei näytä tunnistavan DCP_blowfish1:ä proceduurin sisällä. Mikähän tässä nyt mättää..


    procedure viestinsalaus(var salasana, salattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.EncryptString(salattavamerkkijono);
    DCP_blowfish1.Burn;
    salattavamerkkijono := tilapaismuuttuja;
    end:

    procedure viestinavaus(var salasana, avattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.DecryptString(avattavamerkkijono);
    DCP_blowfish1.Burn;
    avattavamerkkijono := tilapaismuuttuja;
    end:

    Kääntäjä herjaa näiden aliohjelmien kohdalla:
    "Undeclared identifier DCP_blowfish1"

    TForm1.DCP_blowfish1

    Äänestä

  • ... kirjoitti:

    TForm1.DCP_blowfish1

    ilman teetä Form1.DCP_blowfish1

    Äänestä

  • TRRY kirjoitti:

    > Tällä saavutetaan pienempi riippuvuuksien määrä
    > jolloin ohjelmat ovat helpommin siirrettävissä
    > toiseen koneeseen (pienempi haaste harrastajalle).

    Pitää paikkansa. Mutta kai tässä yhteydessä on hyvä (rehellisyyden nimissä) tuoda esiin myös Delphin oletuksena tekemän staattisen linkkauksen huonot puolet.

    Niitä ovat:

    - Tuhlataan levytilaa, koska kirjastosta löytyvä ohjelmakoodi on sisällytetty erikseen jokaiseen sitä käyttävään ohjelmaan. Eli ohjelmatiedostot ovat suurempia kuin mitä niiden tarvitsisi olla. Satojen gigojen kovalevyillä tämä ei tietenkään tunnu missään, mutta on myös ympäristöjä, joissa se tuntuu.

    - Tuhlataan muistia. Jos moni ajossa oleva ohjelma käyttää samaa kirjastoa, käyttöjärjestelmä lataa dynaamisesti linkitetyn kirjastokoodin muistiin vain yhteen paikkaan. Staattisesti linkattu kirjastokoodi ladataan muistiin jokaiselle ohjelmalle erikseen.

    - Vaikeutetaan ylläpitoa. Jos kirjastosta löytyy esimerkiksi tietoturva-aukko, kaikki kirjastoa dynaamisesti käyttävät ohjelmat olisi paikattu sillä, että kirjastotiedosto vaihdetaan. Sen sijaan kaikki ohjelmat, joihin kirjasto on staattisesti linkattu, joudutaan kääntämään uudelleen päivitetyn kirjaston kanssa. Päivitettävää voi tulla paljonkin. Erityinen ongelmahan tämä on suljetun koodin (kukaan ei voi kääntää itse) ja huonosti ylläpidettyjen (ohjelman tekijä viivyttelee päivityksen tarjoamisessa) ohjelmien kanssa.

    Järkeviä kääntäjiä käyttäessä ohjelmoija voi valita, mitä linkataan staattisesti ja mitä dynaamisesti. Käsittääkseni näin on myös Delphissä.

    Valittavissa on molemmat tavat !

    Äänestä

  • mutta jatkokehittelyni ei... kirjoitti:

    Tattis, tuo näyttää todella toimivan!!

    Yritin sitten mennä pikkaisen pitemmälle ja tehdä tuon pohjalta itsenäisen aliohjelman ( eli sellaisen ratkaisun mitä varsinaisestii olen etsinyt), mutta nyt ei toiminutkaan, kääntäjä ei näytä tunnistavan DCP_blowfish1:ä proceduurin sisällä. Mikähän tässä nyt mättää..


    procedure viestinsalaus(var salasana, salattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.EncryptString(salattavamerkkijono);
    DCP_blowfish1.Burn;
    salattavamerkkijono := tilapaismuuttuja;
    end:

    procedure viestinavaus(var salasana, avattavamerkkijono :string);
    var tilapaismuuttuja : string
    begin
    DCP_blowfish1.InitStr(salasana,TDCP_md5);
    tilapaismuuttuja := DCP_blowfish1.DecryptString(avattavamerkkijono);
    DCP_blowfish1.Burn;
    avattavamerkkijono := tilapaismuuttuja;
    end:

    Kääntäjä herjaa näiden aliohjelmien kohdalla:
    "Undeclared identifier DCP_blowfish1"

    Eli tuosta koodista puuttuu perustoimenpiteet jotka Pascal-sovelluskehitin tekee "piilossa":
    muuttujan alustus ja "roskien" keräys. Pascalissa ei ole automaattista roskien keräystä (mikä on alkuvaiheessa haitta mutta lopulta hyvä asia). Tosin roskien keräys ei tule niin nopeasti vastaan (jos käytetään sovelluskehitintä) kuin muissa kielissä joissa ei ole automaattista roskien keräystä. Käyttämällä FreeAndNil aliohjelmaa roskienkeräys on myös turvallisempaa kuin perinteisesti.

    Poimintoja koodista:
    DCP_blowfish1 := TDCP_blowfish.Create(nil);
    Luo DCP_blowfish1-osoittimelle TDCP_blowfish luokan olion jota kutsutaan nimellä DCP_blowfish1.

    FreeAndNil(DCP_blowfish1);
    Vapauttaa "turvallisesti" DCP_blowfish1 olion eli kerää roskat pois (just siinä kohdassa).

    Huomaa myös aliohjelman kutsussa oleva tarpeettoman var sanalla esitetyn muuttujan vaihto const sanalla
    esitetyksi (eli muuttuja pysyy aliohjelman suorituksen aikana vakiona). Tällöin voidaan aliohjelman kutsuun sijoittaa esim. Edit2.Text-arvo. Se ei onnistu jos muuttuja olisi var-sanalla esitetty.

    Muista lisätä koodin alussa olevaan Uses-lauseeseen myös DCPblowfish, DCPmd5;

    .....

    procedure viestinsalaus(const salasana:string; var salattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1 : TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.EncryptString( salattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       salattavamerkkijono := tilapaismuuttuja;
    end;

    procedure viestinavaus(const salasana :string; var avattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1: TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.DecryptString( avattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       avattavamerkkijono := tilapaismuuttuja;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var s1,s2:string;
    begin
       s1 := Edit2.Text;
       s2 := Edit1.Text;
       viestinsalaus( s1, s2 );
       Label1.Caption := s2;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var s:string;
    begin
       s := Label1.Caption;
       viestinavaus(Edit2.Text,s);
       Edit1.Text := s
    end;

    ......

    Seuraava vaihe olisi luoda noista aliohjelmista viestinavaus ja viestinsalaus funktiot.
    Jolloin sen kutsu tulisi muotoon salattu_viesti := viestinsalaus( salasana, salattava_viesti);
    Tämän jälkeen nuo funktiot olisi hyvä laittaa omaan unit:tiin.

    Äänestä

  • ... kirjoitti:

    ilman teetä Form1.DCP_blowfish1

    Virhe "Undeclared identifier DCP_blowfish1" johtuu siitä että se oli alunperin Luokan TForm1 ominaisuus property (tai yksityinen jäsenmuuttuja (private)). Näät sen kun katsot alkuperäistä koodia luokan esittelyn kohdasta. Luokkaesitellään Pascal:ssa Type osassa. Tekemäsi aliohjelma ei "nää" luokan ominaisuuksia ellei niitä esitellä sille.

    Luokan aliohjelma procedure TForm1.Button1Click(Sender: TObject); toki "näkee" mitä ominaisuuksia on kyseissä luokassa esitelty. Huomaa näiden kahden aliohjelman ero. Toinen on luokan aliohjelma ja toinen normaali aliohjelma. Luokan aliohjelma erottaa siitä että sen esittelyssä on ennen aliohjelman nimeä luokan nimi (tässä tapauksessa TForm1).

    Eräs mahdollisuus on korjata nuo aliohjelmasi luokan aliohjelmiksi. Eli esittelet ne luokan esittelyssä
    ja toteuksen esittelyssä vaihdat nimeksi procedure TForm1.viestinsalaus jne
    Helpoiten tuo onnistuu kun kirjoitat vain noiden aliojelmiin TForm1. ja käytät koodin täydennystä jolloin se menee luokan esittelyyn.

    PS Tämä ratkaisu on vähän erilainen kuin mitä jäljempänä on esitetty.

    Äänestä

  • poijuya kirjoitti:

    Virhe "Undeclared identifier DCP_blowfish1" johtuu siitä että se oli alunperin Luokan TForm1 ominaisuus property (tai yksityinen jäsenmuuttuja (private)). Näät sen kun katsot alkuperäistä koodia luokan esittelyn kohdasta. Luokkaesitellään Pascal:ssa Type osassa. Tekemäsi aliohjelma ei "nää" luokan ominaisuuksia ellei niitä esitellä sille.

    Luokan aliohjelma procedure TForm1.Button1Click(Sender: TObject); toki "näkee" mitä ominaisuuksia on kyseissä luokassa esitelty. Huomaa näiden kahden aliohjelman ero. Toinen on luokan aliohjelma ja toinen normaali aliohjelma. Luokan aliohjelma erottaa siitä että sen esittelyssä on ennen aliohjelman nimeä luokan nimi (tässä tapauksessa TForm1).

    Eräs mahdollisuus on korjata nuo aliohjelmasi luokan aliohjelmiksi. Eli esittelet ne luokan esittelyssä
    ja toteuksen esittelyssä vaihdat nimeksi procedure TForm1.viestinsalaus jne
    Helpoiten tuo onnistuu kun kirjoitat vain noiden aliojelmiin TForm1. ja käytät koodin täydennystä jolloin se menee luokan esittelyyn.

    PS Tämä ratkaisu on vähän erilainen kuin mitä jäljempänä on esitetty.

    Luokan aliohjelmaa kutsutaan usein nimellä metodi

    Äänestä

  • -_A_- kirjoitti:

    Eli tuosta koodista puuttuu perustoimenpiteet jotka Pascal-sovelluskehitin tekee "piilossa":
    muuttujan alustus ja "roskien" keräys. Pascalissa ei ole automaattista roskien keräystä (mikä on alkuvaiheessa haitta mutta lopulta hyvä asia). Tosin roskien keräys ei tule niin nopeasti vastaan (jos käytetään sovelluskehitintä) kuin muissa kielissä joissa ei ole automaattista roskien keräystä. Käyttämällä FreeAndNil aliohjelmaa roskienkeräys on myös turvallisempaa kuin perinteisesti.

    Poimintoja koodista:
    DCP_blowfish1 := TDCP_blowfish.Create(nil);
    Luo DCP_blowfish1-osoittimelle TDCP_blowfish luokan olion jota kutsutaan nimellä DCP_blowfish1.

    FreeAndNil(DCP_blowfish1);
    Vapauttaa "turvallisesti" DCP_blowfish1 olion eli kerää roskat pois (just siinä kohdassa).

    Huomaa myös aliohjelman kutsussa oleva tarpeettoman var sanalla esitetyn muuttujan vaihto const sanalla
    esitetyksi (eli muuttuja pysyy aliohjelman suorituksen aikana vakiona). Tällöin voidaan aliohjelman kutsuun sijoittaa esim. Edit2.Text-arvo. Se ei onnistu jos muuttuja olisi var-sanalla esitetty.

    Muista lisätä koodin alussa olevaan Uses-lauseeseen myös DCPblowfish, DCPmd5;

    .....

    procedure viestinsalaus(const salasana:string; var salattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1 : TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.EncryptString( salattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       salattavamerkkijono := tilapaismuuttuja;
    end;

    procedure viestinavaus(const salasana :string; var avattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1: TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.DecryptString( avattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       avattavamerkkijono := tilapaismuuttuja;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var s1,s2:string;
    begin
       s1 := Edit2.Text;
       s2 := Edit1.Text;
       viestinsalaus( s1, s2 );
       Label1.Caption := s2;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var s:string;
    begin
       s := Label1.Caption;
       viestinavaus(Edit2.Text,s);
       Edit1.Text := s
    end;

    ......

    Seuraava vaihe olisi luoda noista aliohjelmista viestinavaus ja viestinsalaus funktiot.
    Jolloin sen kutsu tulisi muotoon salattu_viesti := viestinsalaus( salasana, salattava_viesti);
    Tämän jälkeen nuo funktiot olisi hyvä laittaa omaan unit:tiin.

    Uses lauseessa pitää (olisi hyvä) mainita myös:
    DCPlazarus

    Äänestä

  • -_A_- kirjoitti:

    Eli tuosta koodista puuttuu perustoimenpiteet jotka Pascal-sovelluskehitin tekee "piilossa":
    muuttujan alustus ja "roskien" keräys. Pascalissa ei ole automaattista roskien keräystä (mikä on alkuvaiheessa haitta mutta lopulta hyvä asia). Tosin roskien keräys ei tule niin nopeasti vastaan (jos käytetään sovelluskehitintä) kuin muissa kielissä joissa ei ole automaattista roskien keräystä. Käyttämällä FreeAndNil aliohjelmaa roskienkeräys on myös turvallisempaa kuin perinteisesti.

    Poimintoja koodista:
    DCP_blowfish1 := TDCP_blowfish.Create(nil);
    Luo DCP_blowfish1-osoittimelle TDCP_blowfish luokan olion jota kutsutaan nimellä DCP_blowfish1.

    FreeAndNil(DCP_blowfish1);
    Vapauttaa "turvallisesti" DCP_blowfish1 olion eli kerää roskat pois (just siinä kohdassa).

    Huomaa myös aliohjelman kutsussa oleva tarpeettoman var sanalla esitetyn muuttujan vaihto const sanalla
    esitetyksi (eli muuttuja pysyy aliohjelman suorituksen aikana vakiona). Tällöin voidaan aliohjelman kutsuun sijoittaa esim. Edit2.Text-arvo. Se ei onnistu jos muuttuja olisi var-sanalla esitetty.

    Muista lisätä koodin alussa olevaan Uses-lauseeseen myös DCPblowfish, DCPmd5;

    .....

    procedure viestinsalaus(const salasana:string; var salattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1 : TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.EncryptString( salattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       salattavamerkkijono := tilapaismuuttuja;
    end;

    procedure viestinavaus(const salasana :string; var avattavamerkkijono :string);
    var tilapaismuuttuja : string ;
       DCP_blowfish1: TDCP_blowfish;
    begin
       DCP_blowfish1 := TDCP_blowfish.Create( nil );
       DCP_blowfish1.InitStr( salasana, TDCP_md5 );
       tilapaismuuttuja := DCP_blowfish1.DecryptString( avattavamerkkijono );
       DCP_blowfish1.Burn;
       FreeAndNil( DCP_blowfish1 );
       avattavamerkkijono := tilapaismuuttuja;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var s1,s2:string;
    begin
       s1 := Edit2.Text;
       s2 := Edit1.Text;
       viestinsalaus( s1, s2 );
       Label1.Caption := s2;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var s:string;
    begin
       s := Label1.Caption;
       viestinavaus(Edit2.Text,s);
       Edit1.Text := s
    end;

    ......

    Seuraava vaihe olisi luoda noista aliohjelmista viestinavaus ja viestinsalaus funktiot.
    Jolloin sen kutsu tulisi muotoon salattu_viesti := viestinsalaus( salasana, salattava_viesti);
    Tämän jälkeen nuo funktiot olisi hyvä laittaa omaan unit:tiin.

    No nyt alkoi lyyti kirjoittamaan. Kiitos, opin tosi paljon.

    Äänestä

  • ROT13 salauksen joutuu tekemään itse mutta sen on aika helppo.


    function Rot13(s:string):string;
    const
    a ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    b ='NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm';
    var i,p:integer;
    begin
    for i := 1 to length(s) do
    begin
    p:= ansipos(s[i],a);
    if p>0 then s[i]:=b[p];
    end;
    result := s;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Edit2.Text := Rot13(Edit1.Text);
    end;

    Äänestä

  • Siis ymmärsinkö oikein että joku suosittelee salauksesksi ROT13 algoritmia, siis tuonhan osaa lapsikin purkaa puhumattakaan alan ammattilaisista? Nykypäivänä ei tuota voi salaukseksi kutsua lähinnä lukemisen vaikeuttamis tavaksi, jopa loogista XOR operaatiota voi tuon rinnalla kutsua "tehokkaaksi salaukseksi"

    AES, Twofish, BlowFish, IDEA siinä esimerkiksi tehokkaita ja nopeita salaus algoritmeja, kuten jo edellä mainittiinkin...

    Äänestä

  • zvaäcä inna kirjoitti:

    Siis ymmärsinkö oikein että joku suosittelee salauksesksi ROT13 algoritmia, siis tuonhan osaa lapsikin purkaa puhumattakaan alan ammattilaisista? Nykypäivänä ei tuota voi salaukseksi kutsua lähinnä lukemisen vaikeuttamis tavaksi, jopa loogista XOR operaatiota voi tuon rinnalla kutsua "tehokkaaksi salaukseksi"

    AES, Twofish, BlowFish, IDEA siinä esimerkiksi tehokkaita ja nopeita salaus algoritmeja, kuten jo edellä mainittiinkin...

    ROT13 salauksella voidaan piilottaa sanat joita ei halua sanoa suoraan (rfvz. xvebfnang). Eli asiasta kinnostuneet saavat ne pienellä vaivannäollä selväksi.

    Äänestä

Kommentoi aloitusta


kysyvä ei tieltä eksy kirjoitti:

Millaisella algoritmilla saisi merkkijonon muunnettua kryptattuun muotoon mahdollisimman tehokkaasti. Tarkoitan nimenomaan merkkijonoa en tiedostoa.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu