Millaisella algoritmilla saisi merkkijonon muunnettua kryptattuun muotoon mahdollisimman tehokkaasti. Tarkoitan nimenomaan merkkijonoa en tiedostoa.
Salausalgoritmi merkkijonolle?
22
1281
Vastaukset
- 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
Kela valvoo lasten tilejä.
Tämä isoveli Kela kyttää jopa lasten yli 200,- euron rahat jotka on melko varmasti lahjaksi saatu. Se vaikuttaa perheen2893153Nainen, tervetuloa
Tule luokseni eka vaikka viikoks tai pariksi. Saisin helliä, kannustaa ja tukea sua ja kokata lempi herkkujasi. Pääsisit232794TTK-tähti Saana Akiola paljasti tv-ohjelmassa tapahtuneen ahdistelun
Olisko pitänyt suunnitella ulostulo paremmin? Nyt lehdet soittelevat kaikki 8 läpi ja kuusi sanoo ettei koskenut häntä.201883- 1301871
Olisit ollut varovaisempi
Nyt jos minut hylkäät ja et meidän asiasta minulle mitään ilmoita niin ettet edes anteeksi pyydä, niin tiedä että minä e351634Elisa laskuttaa jo sähköpostilaskusta erikseen euron
Paperilaskuista on otettu lisämaksua jo ajat sitten, mutta nyt Elisa ottaa euron siitä että lähettävät sähköisen laskun1151616Oho! Susanna Laine kohtasi epäonnea lomareissulla Italiassa - Avaa tilannetta: "Vähän sahaavaa..."
Ou nou! Tsemppiä kuitenkin loppulomaan Italiassa, Susanna Laine ja mahdollinen seuralainen! Lue lisää ja katso kuvat:71380Ensitreffit alttarilla Jyrki paljastaa hääyön intiimiasioista kameroiden sammuttua: "Fyysinen..."
Ooo-la-laa… Ensitreffit alttarilla -sarjassa alkaa hääparien välillä ns. tunteet kuumenemaan. Lue lisää: https://www.s21163Väliämme on noin 6 km
Niin lähellä ja niin kaukana. Sinä olet kotona, minä olen kotona. Olet jo unessa. Mutta kun herään, olet jo töissä ja vä91123- 621073