Millaisella algoritmilla saisi merkkijonon muunnettua kryptattuun muotoon mahdollisimman tehokkaasti. Tarkoitan nimenomaan merkkijonoa en tiedostoa.
Salausalgoritmi merkkijonolle?
22
1291
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
Mies kateissa Lapualla
Voi ei taas! Toivottavasti tällä on onnellinen loppu. https://poliisi.fi/-/mies-kateissa-lapualla1166010Poliisi tutkii murhaa Paltamossa
Poliisi tutkii Kainuussa sijaitsevassa Paltamon kunnassa epäiltyä henkirikosta, joka on tapahtunut viime viikon perjanta324107- 823362
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ä182996Jenna meni seksilakkoon
"Olen oppinut ja elän itse siinä uskossa, että feministiset arvot omaava mies on tosi marginaali. Todennäköisyys, että t2522064Joo nyt mä sen tajuan
Kaipaan sua, ei sitä mikään muuta ja olet oikea❤️ miksi tämän pitää olla niin vaikeaa?882004Jere, 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 aikui431817- 1431795
Olipa ihana rakas
❤️🤗😚 Toivottavasti jatkat samalla linjalla ja höpsöttelykin on sallittua, kunhan ei oo loukkaavaa 😉 suloisia unia kau81696Vain yksi elämä
Jonka haluaisin jakaa sinun kanssasi. Universumi heitti noppaa ja teki huonon pilan, antoi minun tavata sinut ja rakastu881569