Salausalgoritmi merkkijonolle?

kysyvä ei tieltä eksy

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

22

1291

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Xoraaja

      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.

    • ***************

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

    • -_A_-

      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.

      • mutta, mutta

        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
        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


      • TRRY
        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.


      • -_A_-
        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;


      • mutta jatkokehittelyni ei...
        -_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"


      • aaaaaaaaaaaaaaaaa
        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)


      • TRRY
        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ä.


      • ...
        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


      • ...
        ... kirjoitti:

        TForm1.DCP_blowfish1

        ilman teetä Form1.DCP_blowfish1


      • leijaleija
        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 !


      • -_A_-
        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.


      • poijuya
        ... 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.


      • Huomauttelija
        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


      • Huomauttelija
        -_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


      • kysyvä ei tieltä eksy
        -_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.


    • ja pätevä algoritmi
      • ROT13

        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;


      • zvaäcä inna

        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...


      • EBG13 fnynnwn
        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.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Mies kateissa Lapualla

      Voi ei taas! Toivottavasti tällä on onnellinen loppu. https://poliisi.fi/-/mies-kateissa-lapualla
      Lapua
      116
      6010
    2. Poliisi tutkii murhaa Paltamossa

      Poliisi tutkii Kainuussa sijaitsevassa Paltamon kunnassa epäiltyä henkirikosta, joka on tapahtunut viime viikon perjanta
      Paltamo
      32
      4107
    3. Olenko joka hetki

      Ajatuksissasi?
      Ikävä
      82
      3362
    4. Jos me voitais puhua

      Jos me voitais puhua tästä, mä sanoisin, että se on vaan tunne ja se menee ohi. Sun ei tarvitse jännittää mua. Mä kyllä
      Ihastuminen
      18
      2996
    5. Jenna meni seksilakkoon

      "Olen oppinut ja elän itse siinä uskossa, että feministiset arvot omaava mies on tosi marginaali. Todennäköisyys, että t
      Maailman menoa
      252
      2064
    6. Joo nyt mä sen tajuan

      Kaipaan sua, ei sitä mikään muuta ja olet oikea❤️ miksi tämän pitää olla niin vaikeaa?
      Ikävä
      88
      2004
    7. Jere, 23, ja Aliisa, 20, aloittavat aamunsa Subutexilla tai rauhoittavilla: "Vaikka mä käytän..."

      Jere, 23, ja Aliisa, 20, ovat pariskunta, joka aloittaa aamunsa Subutexilla tai rauhoittavilla. Jere on ollut koko aikui
      Maailman menoa
      43
      1817
    8. Mikä sinua ja

      kaivattuasi yhdistää ?
      Ikävä
      143
      1795
    9. Olipa ihana rakas

      ❤️🤗😚 Toivottavasti jatkat samalla linjalla ja höpsöttelykin on sallittua, kunhan ei oo loukkaavaa 😉 suloisia unia kau
      Ikävä
      8
      1696
    10. Vain yksi elämä

      Jonka haluaisin jakaa sinun kanssasi. Universumi heitti noppaa ja teki huonon pilan, antoi minun tavata sinut ja rakastu
      Ikävä
      88
      1569
    Aihe