Zmiany :) 2009-09-24 20:14:10

Witam :]

Rezygnuje z bloga :) Postawilem swoja www i zapraszam :)
http://polak17.republika.pl/

skomentuj (0)

[c++][bcb]Powiekszenie obrazka czesc 1 2009-09-06 13:22:31

Witam :]

Tym razem czysty gotowiec ... coz... nie bardzo bylo co zmieniac

przykladowy obrazek :

1


Ok nie bede sie bardzo zaglebial w szczegoly :]
ten arcik jest w sumie 100% taki sam jak ten tu : http://www.algorytm.org/index.php?option...&Itemid=28

nie zmieniam nic w kodzie a algorytm ten jest staly wiec nie bardzo jest tu co robic :]
poprostu daje tutaj to bo byc moze komus sie przyda Smile

(w innych czesciach kody juz beda wygladac inaczej niz na stronie algorytm :] )

Ok a wiec przyklad powiekszenia tego obrazka do 800x600


float X,Y;
Image2->Width = 800;
Image2->Height = 600;
Image2->Picture->Bitmap->Width = Image2->Width;
Image2->Picture->Bitmap->Height = Image2->Height;
X = (Image1->Width * 1.0) / (Image2->Width * 1.0);
Y = (Image1->Height * 1.0) / (Image2->Height * 1.0);
for (int i=0; i<=Image2->Width; i++)
{
      for (int j=0; j<=Image2->Height; j++)
      {
        int x = i*X;
        int y = j*Y;
        Image2->Canvas->Pixels[i][j] = Image1->Canvas->Pixels[x][y];
      }   // do 2
} // do 1

2

I to na tyle :]

zrodlo http://www.algorytm.org/index.php?option...&Itemid=28













Tagi: algorytmy, c++

skomentuj (0)

[c++][bcb]Obrazki 3D - anaglify 2009-09-05 23:03:35

Witam :P
Dzis pokaze taki maly bajeerek ktory robi wrazenie :] Chodzi o to jak zrobic z obrazka 2D obrazek 3D :) ?
Taki efekt mozna uzyskac poprzez dwa PRAWIE takie same obrazki.
Obrazek 1 i obrazek 2.
obrazek 1 to widok obiektu takiego jakim widzi go LEWE oko
obrazek 2 to widok obiektu widzianego przez oko PRAWE
jak wiec latwo sie domyslec obrazek 1 jest przesuniety w stosunku do obrazka 2 nieco w lewo.
Poniewaz nie mam jak zrobic tak ladnego obrazka przykladowego uzyje tu gotowego obrazu znalezionego na googlach.

UWAGA :
1.) Obrazki musza byc takie same JEDYNA roznica to przesuniecie w POZIOMIE.
2.) Obrazek bedzie widoczny w trojwymiarze przez specialne okulary takie jakie napewno juz mieliscie kiedys :] Mam na mysli okulary czerwono - turkusowe takie jak te :

okulary


Ok. Jakich algorytmow uzyjemy ?
1.) anaglif monochromatyczny
2.) algorytm Photoshop
3.) zmodyfikowany algorytm Photoshop
4.) algorytm Dubois-a

Do przykladu uzyjemy gotowych fotek
lewe oko :

lewe oko
prawe oko :
prawe oko

Ok co nalezy zrobic najpierw :] ? Nalezy rozdzielic obraz na kolejne dwa obrazki. Podobne efekty juz robilismy wczesniej :]
obrazek nr 1 bedzie zawieral jedynie skladowa R ( RGB ) lekko zmodyfikowana.
Obrazek nr 2 natomiast bedzie mial usunieta czerwien a zmodyfikowana zielen i odcien niebieski.

kod wyglada wiec tak :


void __fastcall TForm1::Button1Click(TObject *Sender)
{
int lewyR,lewyG,lewyB;
int prawyR,prawyG,prawyB;


for ( int i = 0 ; i < 400 ; i++ )
{
 for ( int j = 0 ; j < 400 ; j++ )
 {
  lewyR = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]);
  lewyG = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]);
  lewyB = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]);
  prawyR = GetRValue(Image2->Picture->Bitmap->Canvas->Pixels[j][i]);
  prawyG = GetGValue(Image2->Picture->Bitmap->Canvas->Pixels[j][i]);
  prawyB = GetBValue(Image2->Picture->Bitmap->Canvas->Pixels[j][i]);
  Image3->Canvas->Pixels[j][i] = RGB((0.299 * lewyR) + (0.587 * lewyG) + (0.114 * lewyB) , 0 ,0);
  Image4->Canvas->Pixels[j][i] = RGB( 0 , (0.299 * prawyR) + (0.587 * prawyG) + (0.114 * prawyB) , (0.299 * prawyR) + (0.587 * prawyG) + (0.114 * prawyB));



Teraz nasze dwa obrazki wygladaja tak :
oko lewe

lewe
oko prawe
prawe

Ok w sumie to pozostaje nam juz ostatnia linijka kodu :] Pozostaje nam jedynie dodac oba obrazki do siebie i zlaczyc w jeden

anaglif monochromatyczny :

Image5->Canvas->Pixels[j][i] = RGB((0.299 * lewyR) + (0.587 * lewyG) + (0.114 * lewyB) , (0.299 * prawyR) + (0.587 * prawyG) + (0.114 * prawyB) , (0.299 * prawyR) + (0.587 * prawyG) + (0.114 * prawyB));
obrazek :
1


algorytm Photoshop :
[code]Image6->Canvas->Pixels[j][i] = RGB( lewyR , prawyG , prawyB );[/code]
obrazek :
2


zmodyfikowany algorytm Photoshop: :
Image7->Canvas->Pixels[j][i] = RGB((0.299 * lewyR) + (0.587 * lewyG) + (0.114 * lewyB) , prawyG , prawyB );
obrazek :
3


algorytm Dubois-a :
int anaR ,anaG, anaB;
anaR = (0.4561 * lewyR) + (0.500484 * lewyG) + (0.176381 * lewyB) - (0.0434706 * prawyR) - (0.0879388 * prawyG) - (0.00155529 * prawyB);
anaG = (-0.0400822 * lewyR) - (0.0378246 * lewyG) - (0.0157589 * lewyB) + (0.378476 * prawyR) + (0.73364 * prawyG) - (0.0184503 * prawyB);
anaB = (-0.0152161 * lewyR) - (0.0205971 * lewyG) - (0.00546856 * lewyB) - (0.0721527 * prawyR) - (0.112961 * prawyG) + (1.2264 * prawyB);

if (anaR < 0)
anaR = 0;
if (anaG < 0)
anaG = 0;
if (anaB < 0)
anaB = 0;

if (anaR > 255)
anaR = 255;
if (anaG > 255)
anaG = 255;
if (anaB > 255)
anaB = 255;

Image8->Canvas->Pixels[j][i] = RGB( anaR , anaG , anaB );


obrazek :
4



Ok to by bylo na tyle :] Moje kody nie korzystaja z funkcji scanline bo niechcialem robic plagiatu :]
jesli kogos interesuja kody z obsluga scanline ( szybsze ) to naprawde POLECAM kody pana Tomasza Lubinskiego :)

implementacja algorytmow z uzyciem scanline mozecie pobrac tu :

http://www.algorytm.org/downloads/po/anaglif_c.zip
 

Mam nadzieje ze efekty sie podobaja :P pozdrawiam :]

Tagi: algorytmy, c++

skomentuj (0)

socjotechnika praktyka - teoria badania itd 2009-09-03 15:22:53

Witam :] dzis zajmiemy sie socjotechnika nieco glebiej :] Opisze dlaczego i jak ludzmi latwo manipulowac. Dlaczego wogole istnieje mozliwosc manipuacji i dlaczego ludzie daja sie na to wszystko nabrac ?
Tyle pytan a tak malo odpowiedzi...

1.) Okreslona cecha
Tego odkrycia dokonali etologowie, ludzie badajacy zwierzeta i ich zachowania. Zalozmy taki zwyklt Byk Smile Byk zwierze normalne zwierzak jak zwierzak do czasu az nie zobaczy... czerwonej płachty. Czemu ? Co w nim wzbudza nagla agresje ? Przeciesz czerwona plachta nie atakuje go. Czesto wisi sobie i trzepocze na wietrze byk jednak rzuca sie na nia jak na kogos kto stanowi jakies zagrozenie.
Odkrycie to dotyczy nie tylko zwierzat i tu caly sęk :] Badanie to ujawnilo ze ludzie takze dokonuja pewnych decyzji tylko na podstawie okreslonej cechy ( czerwona plachta ). Dlaczego ? Jak ludzie moga okazac tak malo rozsadku ?
To bardzo proste. Zyjemy w czasach gdzie informacje nauka i stres uniemozliwiaja nam dokladna analize sytuacji. Dlatego czlowiek moze zareagowac "automatycznie" na jakas sytuacje. Glos milej sprzedawczyni ? I odrazu rozmowa toczy sie inaczej prawda :] ? Gdybysmy mieli analizowac wszystkie dane za kazdym razem najpewniej nie bylibysmy w stanie robic nic innego Smile Stad "skracanie" sobie drogi i automatyczne reakcje.
Socjotechnikami sa bardzo czesto sklepikarze Smile
Czytajac rozne wiadomosci od ludzi i ksiazki czesto zauwazalem sytuacje w ktorej ludzie ulegaja stereotypom Smile
Znany chyba kazdemu "drogi = dobry , tani = slaby". I ku moze zdziwieniu niektorych osob obnizenie ceny nie wplywa pozytywnie na sprzedaz towarow. natomiast gdy obnizymy a nastepniee podwyzszymy cene towar sprzeda sie byc moze nawet 2 , 3 krotnie razy szybciej Smile

2.) Wzajemnosc
Wedlug socjologow jest to najczestsze zjawisko. Zasada jest prosta. Czlowiek za otrzymane dobro od kogos powinien w jakis sposob sie odwdzieczyc. Pamietacie przyslowie : "Temu kto daje temu pan Bog dwa razy daje" ? Smile
Pozwala nam to pomoc komus dajac nawet sporo gdyz spoleczenstwo wychowalo w sobie zasade odwzajemniania przyslug :]
Bardzo czesto za brak odwdzieczenia sie dana osoba jest uznawana za egoiste i snoba. Takie piętno powoduje "zaglebianie" sie w regule wzajemnosci :]
Dzialanie to czesto polega na wysiwadczeniu malej przyslugi jeszcze PRZED podaniem o jakas prosbe nam NAPRAWDE chodzi :]
przyklad ?
Wyobrazmy sobie ze chodzimy po miescie "z puszka" i zbieramy pieniadze dla chorych dzieci w afryce. Na "wydobycie" pieniedzy w takiej sytuacji jest masa sposobow ale zajmijmy sie regula wzajemnosci...
Wybieramy potencialnie schludnie ubranego czlowieka podchodzimy i... dajemy cukierka. ( obojetnie jakiego moze byc nawet o ochydnym smaku jakis najtanszy ze sklepu Smile ) dajemy i mowimy ze to prezent. Nawet gdy nasza "ofiara" odmawia wrecz WPYCHAMY w rece jej ten cukierek Big Grin
Wspominamy chwile pozniej o tym ze ci dobrzi ludzie zbieraja rowniez pieniadze dla chorych dzieci w afryce... Czy bylby pan tak mily i podarowal pare groszy ??
Mysle ze rozumiecie o co chodzi Smile Niewiele osob po daniu "prezentu" ( nawet niechcianego ) odwroci sie od nas plecami Smile ( szczegolnie tam gdzie wielu ludzi widzialo nasz "dobry" gest ). "Ofiara" bala by sie "co pomysli spoleczenstwo jesli sie nie odwdziecze" Smile ?
W ten sposob paczka cukieirkow za pare groszy potrafi dodac zysku wynoszacego nawet paredziesiat zlotych :]

Innym przykladem jest tzw taktyka "odmowa i wycfanie". Czesto w salonach samochodowych stosowana Smile Polega to na tym ze samochod w cenie 60 tysiecy zlotych jest potencialnemu nabywcy pokazywany w cenie 70 tysiecy :] Oczywiscie klient zaprostestuje cena jest za wysoka. W tym przypadku zmniejszamy cene do 60 tysiecy ( czyli normalnej ). Klient widzi roznice az 10 tysiecy zlotych co "namawia" go do niezlej okazji kupna samochodu oraz przedewszystkim na zachowaniu "uleglosci". Czemu ? To proste Smile

3.) Zaangazowanie w dana sprawe oraz darzenie do jej konca
KAZDY czlowiek gdy sobie cos postanowi darzy do celu :] Problem w tym ze nie zawsze konsekwentnie. Nalezy zrobic tak by jego konsekwencja byla ogromna.
Na ten cel skladaja sie czynniki takie jak :
- Slowa ofiary ( najlepiej wymawiane publicznie )
- przekonanie o slusznosci
- postawa
- czyny

Konsekwencja - Cecha ktora przez spoleczenstwo jest uznawana za cnote Smile Dlatego gdy cos powiemy publicznie to nasza konsekwencja czesto idzie naprzod. Przyklad ktory znacie to ... RON !!! Big Grin Pamietacie jak wmawial nam ze to nie jego IP itd :] ?
Byly tu slowa pisane w SB ( publicznie )
Byla konsekwencja w darzeniu do celu Smile
Byla twarda postawa ( nawet gdy "mleko sie rozlalo" RoN nadal stal przy swoim )
I jego czyny ( pamietacie dawal screena z innego kompa znalezionego na google grafika Smile )
Typowy przyklad zaangazowania i konsekwencji nawet wtedy gdy to glupie Smile

No wlasnie ale CZEMU on tak robil skoro to glupie ???
heheh no wlasnie Smile Odpowiedz jest bardzo prosta. Darzenie do celu konsekwentnie i niezlomna postawa daje czesto korzystne wyniki ( RoN nas nie znal myslal zapewne ze jesli bedzie twwardo stal przy swoim my sie zlamiemy ).
Poza tym to bardzo wygodne isc konsekwentnie w to co "uwierzylismy" Smile W koncu przyznac sie do bledu jest trudniej szczegolnie ze musimy to zrobic publicznie.

Zaangazowanie - Przedewszystkim musi byc NIEwymuszone ( w oczach "ofiary" ). Ofiara powinna publicznie i aktywnie darzyc do celu. Ok ale jaki mamy z tego pozytek ?? Oczywiscie to zalezy od sytuacji ale jesli sklepikarz nakloni ofiare by ta koniecznie zechciala kupic zestaw porcelany ktory bedzie za kilka dni to "ofiara" bedzie odwiedzac co dwa dni sklep ( zaangazowanie i konsekwencja ) az kupi porcelane ktora tak zachwalal sklepikarz.
zaangazowanie ma rowniez wplyw podczas klotni z kims. Badz zerwania z chlopakiem / dziewczyna.
Postanawiamy zerwac kntakt z dana osoba i nawet gdy wiemy ze nie do konca jest to sluszna decyzja zaczynamy AUTOMATYCZNIE wymyslac powodu dla ktorych nasze zaangazowanie i cel maja sens. Dlatego socjotechnik tylko powoduje zaangazowanie ofiary a dalej to ona sama wpada w SWOJA WLASNA pulapke :]
Rozpoznanie niechcianej konsekwencji jest banalne i napewno kiedys je przezyliscie :] Amianowicie jest to takie dziwne uczucie w żoł±dku :] DOSLOWNIE. Slyszymy pewna informacje ktora na nas wplywa tak ze nie mamy wyboru tylko isc konsekwentnie mimo nawet ze tego niechcemy. nagle poczujemy "skurcz" badz cos podobnego w żoł±dku.


4.) Spoleczenstwo i jego czyny
To nic innego jak papugowanie od innych :] Przedewszystkim dlatego ze skoro ONI wszyscy tak robia to i JA powinienem / powinnam.
Jest to lęk przed pewnego rodzaju nieznanym. Dlaczego to ja mam sie wyroznic z tlumu ?

Swietnie obrazuje to ten filmik Smile
http://www.youtube.com/watch?v=42zYPIsJX...re=related

Wynika jasno z tego ze ludzie robia to co robi wiekszasc. Tylko nieliczni sie wylamia.
Innym przykladem moga byc tanie wyprzedaze gdzie spotykamy szalone tlumy :] Skoro tyle ludzi tam kupuje to musza byc tam naprawde niskie ceny i dobre towary prawda ? niekoniecznie Tongue To poprostu myslenie o dowodzie slusznosci.

Ok jakies inne przyklady prezentujace ten czynnik ?
Napady, rabunki, pobicia.
Dresy z nieco wieksza iloscia rozumu nie zaatakuja ofiary bezposrednio Smile Dres podejdzie i zrobi tak by swiadkowie ( im ich wiecej tym lepiej - pozniej wytlumacze dlaczego ) nie byly pewni czy to napad czy zwykla rozmowa dwoch kolegow.
Przyklad ktory sam przezylem jako obserwator Smile ?
Stalem kilka lat temu na przystanku autobusowym i siedzial tam tez zwykly chlopak. Podeszlo do nieg dwoch przypakowanych gosci i oznajmilo przy nas ( swiadkach ) cytuje : "No Paweł! Weż pozycz kase wiemy ze masz. Nie badz zyla idziemy sobie kupic szlugi".
Ten "Pawel" naprawde nie mial na imie Pawel a po drugie tych dresow nie znal Big Grin
Czemu wiec oni do niego podeszli zaczeli gadac jak do kolegi o to by "pozyczyl" kase ?
Odpowiedz oczywista. Chciano by swiadkowie NIE BYLI PEWNI czy to napad czy kolezenska rozmowa. A skoro nikt tego nie byl pewien to nikt nie zareagowal. Czemu ? Ja osobiscie bylem za maly xD ale inni ? dorosli ludzie - mężczyzni ? Bali sie ? Nie Smile
Poprostu swiadek nr 1 pomyslal "hmm moze to nie napad ? zobacze co inni zrobia np swiadek nr 2" natomiast swiadek nr 2 pomyslal to samo o swiadku nr 1 :] Tworzy sie lancuszek niepewnosci w ktorym nie wiadomo jak sie zachowac. Ludzie boja sie osmieszyc ( a moze to tylko koledzy ) A skoro nikt nie reaguje to "ja" tez nie bede widocznie nic sie nie dzieje zlego.
Ludzie wylaczaja mysleie i zaczynaja dzialac na zasadzie tzw "spolecznego dowodu slusznosci".
Co by bylo gdyby "ofiara" napadu zaczela krzyczec o pomoc ? Pomogl by ktos mu / jej ? Otoz TEZ NIE Smile czemu ? czy tym razem chodzi o lęk ?
Nie tym razem tez nie to Smile
Krzyk "Ludzie ratujcie okradaja mnie!!!" nic nie da czemu ? Znow w gre wchodzi dowod slusznosci. Jesli ofiara zacznie krzyczec i stawiac opor dresy jeszcze bardziej beda chcieli pokazac ze "przyjaznia" sie z ofiara i to sa tylko "wyglupy". zaczna sie smiac i gadac od rzeczy.
W tym momencie ludzie znow zaczna czekac na 1 krok ktoregos z obserwatorow. DODATKOWO wchodzi w gre NIEPEWNOSC dotyczaca tego czy "A moze ktos juz wezwal policje?". W ten sposob znow nikt nie pomoze. ( wydaje sie nieprawdopodobne niemniej robiono testy wlasnie podobne takie jak tu opisalem i wyniki okazaly sie takie jak tu opisuje Smile ).
A wiec co ofiara POWINNA ZROBIC ? NIC ? no oczywiscie nie :] cos zrobic musi Smile ale co ? walczyc ?
tez nie Tongue Pomysl z proszeniem o pomoc byl dobry ale ... nie udoskonalony :] Nalezy go udoskonalic. Amianowicie ofiara powinna krzyknac :
"Heeeej!!! Pan w czerwonej bluzie ! Tak Pan !! Prosze mi pomc zadzwonic na policje te dresy mnie probuja okrasc!!!".
W tym pan w czerwonej bluzie nie mysli "Ciekawe co zrobi swiadek nr 1" tylko "Aha cos sie dzieje zlego a ofiara wybrala mnie bym jej pomogl". Pan w czerwonej bluzie pomoze na 95% w takiej sytuacji gdyz po 1.) Boi sie odpowiedzialnosci po 2.) Wie ze cos jest nie tak Po 3.) Ofiara wskazala BEZPOSREDNIO go.

Anegdotka : W 1964 roku w Nowym Jorku zamordowano kobiete na oczach ... 38 swiadkow ( jej sasiadow ) nikt nie zadzwonil po policje dopiero gdy jasne bylo ze ofiara nie zyje.

Dzis mozemy zreszta zaobserwowac brak reakcji na bicie , molestowanie itd dzieci w domach. Sasiedzi nic nie mowia bo nie sa niczego pewni.


5.) Lubienie Smile
Oczywiste ze jesli kogos lubimy latwiej ulegamy jego prosba. Nie jest jednak konieczne zaprzyjaznianie sie z dana osoba przez wiele czasu. Wystarczy nawet kilka minut :] Jak i czemu ?
Przyklad znow sklepikarza.
Przychodzi klient do sklepu wedkarskiego i prosi o zylke wedke i przynete.
Sklepikarz natomiast "okazuje sie" bardzo milym facetem nie dosc ze odradza kupno drozszej wedki to dodatkowo mowi nam jaka przyneta jest dobra na duze ryby. Sklepikarz pyta ofiare : "A gdzie Pan lowi ryby?" ofiara podaje jakies miejsce na co sklepikarz uradowany i zaskoczony zarazem mowi :"Naprawde!? Ja tez ! Smile" i zaczyna sie krotko dyskusja. Po takiej rozmowie klient mysli ze sklepikarz zrobil wszystko z wlasnej dobrej woli dla swojego klienta natomiast w rzeczywistosci sprzedal mu sredni sprzet ktory nie schodzil Smile Czemu ofiara "nagle" polubila sprzedawce ?
Poniewaz sklepikarz byl mily mial podobne poglady znal sie na rzeczyi probowal doradzic ( nawet paradoksalnie odradzil drozszy sprzet czyli tak jakby na tym stracil ).

Ok co decyduje o tym czy kogos lubimy czy nie ? heh niestety albo i stety jego... atrakcyjnosc fizyczna Smile Badania dowodza ze ludzie czesciej ulegaja osobom ładnym niz brzydkim. Co wiecej osoby ladne fizycznie uznawane sa czesciej za osoby inteligentniejsze i majace wiecej pieniedzy oraz wyzszy poziom spoleczny Smile

Drugim powodem dla ktorego kogos lubimy jest ... podobienstwo jego do nas samych :] Tak jak opisalem to w moim malym przykladzie klient i sklepikarz lubili lowic ryby dodatkowo jezdzili do tego samego miejsca Smile Dobrze jest takze jakby byli ubrani podobnie ( w podobnym stylu ).

Oczywiscie przydatne sa takze... komplementy :] A jakze Smile Uwaga jednak zbyt nachalne komplementowanie danej osoby moze odwrocic skutek i dana osoba bedzie miala nas dosc Smile Dodatkowo bedziemy mieli opinie klamcy i lizusa...
Badania kolejne jednak dowodza tego iz ludzie lubia innych szczegolnie gdy ci mowia im komplementy. Nie jest to dziwne DZIWNE jednak jest to ze... komplementy te moga byc falszywe :] Przykladowo osobie rozczochranej powiemy ze ladne ma dzis wlosy :] Ofiara wcale nie zareaguje zle. Bedzie zadowolona. Te same badania swiadcza o tym ze ludzie nawet gdy wiedza ze komplementy sa falszywe i tak im ulegaja :]

Kolejny przyklad to ... skojarzenia. Lubimy ludzi ktorzy nam sie dobrze kojarza. ( ale ie tylko ludzi ) moze sie zdarzyc ze bedziemy w miejscu ktore dobrze nam sie kojarzy z jakas osoba. Latwiej wtedy ulegamy,
Zasada ta stosowana jest doslownie nagminnie przez politykow.


6.) Autorytet
Byl sobie kiedys taki uczony o nazwisku Milgram. Prowadzil on badania nad zachowaniem ludzi. Konkretnie chodzilo o to JAK udalo sie Hitlerowi tak ladnie manipulowac ludzmi nawet jesli jawnie czynili zlo ( przeciesz niemozliwe by wszyscy Niemcy byli zli ).
Milgram wymyslil badania ktore OFICIALNIE mialy dotyczyc zapamietywania pod wplywem kar.
"Uczen" mial zapamietac pary slow np "oko - słoń kot - dupa" itd itp a "nauczyciel" mial podac jedno ze slow z pary po czym uczen musial podac drugie slowo.
Sęk w tym ze za kazdy blad uczen dostawal kare. Kara polegala na elektrowstrzasach Smile Zaczynano od 15 V za kazdy blad podnoszono stawke o 15V az do 450V Smile
Kary wynoszace ponad 150V powodowaly juz odczuwalny bol i ludzie zaczeli jeczec z bolu. "Nauczyciel" niechcial dalej dawac kar "uczniowi" jednak Milgram mowil aby prace kontynuowac wszystko bierze na siebie i nic nikomu sie nie stanie.
Znakomita wiekszosc ( o ile dobrze pamietam 85% ) ludzi doszlo do zadawania kar wynoszacych 450V. Najbardziej zabawne jest to ze ci sami ludzie kilka dni wczesniej mowili ze nie byliby w stanie zadac komus bolu. Nie zrobiliby krzywdy nikomu bez powodu.

Ale tu byl autorytet ( Milgram ) ktory kazal kontynuowac prace ( nawet gdy ofiara udawala zemdlala badz mowila ze ma slabe serce ) "nauczyciele" sluchali tylko Milgrama czyli swojego autorytetu. Tak wlasnie bylo z Hitlerem. Byl wielkim autorytetem dla Niemcow a autorytetom ciezko sie sprzeciwic. Chociazby w obawie o kare. ( przypomnijcie sobie gdy mieliscie 4 latka i kim wtedy byli dla was Wasi rodzicie ? ) Smile

Przeprowadzano rowniez inne badania. O wiele mniej kontrowersyjne. Amianowicie przebrano sie za policjanta i... osoby stojace po prawej stronie przystanku autobusowego poproszono o to by przeszli na lewa strone ( bez podania jakiejkolwiek przyczyny ). 95% ludzi posluchalo tej prosby. natomiast gdy o to samo poprosil zwykly obywatel prosbe te spelnilo tylko 30% ludzi :]
Oznacza to nie tylko to ze latwo ulegamy autorytetom ale takze ich symbolom.


7.) Niedostepnosc
To cos bardzo czesto uzywanego przez sprzedawcow :]
Amianowicie prosty tekst : "Wersja limitowana" badz "kto pierwszy ten lepszy" Smile
W ten sposob ludzie wpadaja w pewnego rodzaju szal zakupow i obawiaja sie ze tego nigdy wiecej nie dostana ( tego towaru ).
Kupuja to bo... jak badania wykazuja uwazaja to za lepsze od innych.
przykladowe badania nad czekoladkami.
Dano do posmakowania czekoladki w dwoch slojach w jednym bylo 10 czekoladek w drugim tylko 2 :] w obu slojach byly te same czekoladki mimo to jednak ludzie wyzej ocenili jakos czekoladek w sloju wktorym byly tylko dwie czekoladki niz w tym gdzie bylo ich 10 :]

Pozadanie ludzi rzeczy "niedostepnych" jest duze gdyz... rzeczy tajne badz niedostepne sa zazwyczaj bardzo cenne :]
drugim powodem jest... odzyskanie wolnosci.
Przyklad to milosc dwoch mlodych ludzi. Ich rodzice jednak nie uznaja tego zwiazku.
Powstaje wtedy tzw "zasada Romea i Julii". Mlodzi zaczynaja sie buntowac gdyz ich "wolnosc" jest zagrozona ( cos sie im zakazuje ) i mimo wszystko zaczynaja sie buntowac. W tym przypadku powstaje cos jeszcze. Amianowicie ZAANGAZOWANIE. Im bardziej cos zakazujemy badz ukrywamy tym bardziej ludzie chca sie czegos o tym dowiedziec.

Trzeba jednak pamietac ze ludzie pragna rzeczy niedostepnych stosunkowo niedawno :] tzn rzeczy ktore sa zakazane od stuleci nie pragniemy jednak rzeczy zakazanych stosunkowo niedawno ( zaleznie od sytuacji ) pragniemy.


Ok powiedzmy ze to na tyle :] mam nadzieje ze art nieco bardziej praktyczny niz wczesniej sie podoba :]
"Kochany" sprzedawca opuscil cene az do 10 tysiecy pokazuje mi samochod opisuje wady i zalety wyglada na to ze jest po mojej stronie skoro on ulegl i zmniejszyl cene ( co jak sie okazuje nie jest prawda ) to i ja powinienem ulec.

Tagi: inne, socjotechnika

skomentuj (0)

[c++] dodawanie i odejmowanie na stringach 2009-08-10 20:42:27

Witam Big Grin

Tak mnie jakos naszlo Tongue z nudow zaczalem pisac takie male cos ;]
Juz podobny programik dawalem w delphi no ale delphi to nie to samo co c++ :]

Wiadomo kazdy typ ma swoje granice czy to byte czy long itd :]
Jak dodawac i odejmowac liczby bez tych "problemow" Smile ?

Ano znana metoda dzialania w slupku Smile ( moj kodzik nie radzi sobie z liczbami ujemnymi ale da sie to naprawic Smile )

A wiec dodawanie i odejmowanie w jednym Smile :


#include <clx.h>
#pragma hdrstop
#include <iostream.h>
#pragma argsused
//---------------------------------------------------------------------------
void dodaj(string liczba , string liczba2)
{
if ( liczba.length() > liczba2.length() )
{
int ciag = liczba.length() - liczba2.length();
for (register int i = 0 ; i < ciag ; i++ )
{
  liczba2 = "0"+ liczba2;
} // koniec petli i
}
else
{
int ciag = liczba2.length() - liczba.length();
  for (register int j = 0 ; j < ciag ; j++ )
  {
  liczba = "0"+ liczba;
  } // koniec petli j
} // koniec if
// teraz bedziemy doddawac :)

bool pamiec = 0;
AnsiString l1 = liczba.c_str();
AnsiString l2 = liczba2.c_str();
short int licz;
AnsiString pomoc;
string wynik;
for (register int a = liczba.length(); a > 0  ; a-- )
{
licz = StrToInt(l1[a]) + StrToInt(l2[a]) + pamiec;
  if ( licz > 9 )
  {
   pamiec = 1;
   pomoc = IntToStr(licz);
   wynik = pomoc[2] + wynik;
  }
  else
  {
   pamiec = 0;
   wynik = IntToStr(licz).c_str() + wynik;
  } // do if > 9
} // koniec petli a

// ostatni if uffff...

if ( pamiec == 1 )
wynik = "1" + wynik;

cout << l1.c_str() << " + " << l2.c_str() << " = " << wynik << endl;
} // koniec funkcji dodaj
//---------------------------------------------------------------------------
void odejmij(string liczba , string liczba2)
{
if ( liczba.length() > liczba2.length() )
{
int ciag = liczba.length() - liczba2.length();
for (register int i = 0 ; i < ciag ; i++ )
{
  liczba2 = "0"+ liczba2;
} // koniec petli i
}
else
{
int ciag = liczba2.length() - liczba.length();
  for (register int j = 0 ; j < ciag ; j++ )
  {
  liczba = "0"+ liczba;
  } // koniec petli j
} // koniec if
// teraz bedziemy odejmowac :)

bool pamiec = 0;
AnsiString l1 = liczba.c_str();
AnsiString l2 = liczba2.c_str();
short int licz;
AnsiString pomoc;
string wynik;

for (register int a = liczba.length(); a > 0  ; a-- )
{
licz = StrToInt(l1[a]) - StrToInt(l2[a]) - pamiec;
  if ( licz < 0 )
  {
   pamiec = 1;
   pomoc = IntToStr(licz);
   wynik = IntToStr(10+licz).c_str() + wynik;
  }
  else
  {
   pamiec = 0;
   wynik = IntToStr(licz).c_str() + wynik;
  } // do if > 9
} // koniec petli a

cout << l1.c_str() << " - " << l2.c_str() << " = " << wynik << endl;
} // do konca odejmij
//---------------------------------------------------------------------------
void main(int argc, char* argv[])
{
short int wybor;
string a;
string b;
do
{ // poczatek petli
cout << "MENU" << endl << "0.) Zamknij" << endl << "1.) Dodawaj" << endl << "2.) Odejmij" << endl ;
cin >> wybor;
  switch(wybor)
  {
   case 1 : cout << "Podaj liczbe nr 1 : ";
            cin >> a;
            cout << "Podaj liczbe nr 2 : ";
            cin >> b;
            dodaj(a,b);
            break;
   case 2 : cout << "Podaj liczbe nr 1 : ";
            cin >> a;
            cout << "Podaj liczbe nr 2 : ";
            cin >> b;
            odejmij(a,b);
            break;

  } // do case
} while(wybor!=0); // koniec petli
}  // koniec funkcji main


jak bedzie mi sie chcialo to pobawie sie moze w mnozenie i rozne rodzaju dzielenie xD ale zobaczymy :]

Pozdro Polaczek17



Tagi: algorytmy, c++

skomentuj (0)

[c++] Proste gry - totolotek 2009-08-09 14:49:44

Witam :]

Taaaaa... znana kazdemu gra :) Prosta i banalna do napisania ale... postanowilem napisac pare artow o pisaniu grach w c++ zajmiemy sie takimi grami jak wlasnie totolotek czy statki :] Byc moze pozniej gry karciane no i napewno cos z gier RPG :)

Ale to pozniej teraz kod gry totolotek. Podzielilem go ladnie na funkcje dzieki czemu kod jest ladny i przejrzysty :)


#include <clx.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
//---------------------------------------------------------------------------
int tab[6];
int wylosowane[6];
//---------------------------------------------------------------------------
void wybierz_liczby(void)
{
 for ( int i = 0 ; i < 6 ; )
 {
  bool zmienic = true;
  cout << "Podaj liczbe nr : " << i+1 << endl;
  cin >> tab[i];
    for ( int j = 0 ; j < i ; j++ )
    {
     if ( tab[i] == tab[j] )
     zmienic = false;
    }
  if ( zmienic == true && tab[i] < 50 && tab[i] > 0)
  i++;
 }
}
//---------------------------------------------------------------------------
void losuj(void)
{
 srand(time(NULL));
 for ( int i = 0 ; i < 6 ; )
 {
  bool zmienic = true;
  int liczba = (rand()%49)+1;
  wylosowane[i] = liczba;
    for ( int j = 0 ; j < i ; j++ )
    {
     if (wylosowane[i] == wylosowane[j])
     zmienic = false;
    }
  if ( zmienic == true)
  i++;
 }
}
//---------------------------------------------------------------------------
void pokaz(void)
{
 cout << "Twoje liczby to : " << endl;
 for ( int i = 0 ; i < 6 ; i++)
 {
  cout << tab[i] << ", ";
 }

 cout << endl << "Liczby wylosowane to : " << endl;

 for ( int j = 0 ; j < 6 ; j++)
 {
  cout << wylosowane[j] << ", ";
 }
}
//---------------------------------------------------------------------------
void sprawdz(void)
{
int licznik = 0;
 for ( int i = 0 ; i < 6 ; i++ )
 {
  for ( int j = 0 ; j < 6 ; j++ )
  {
   if ( tab[i] == wylosowane[j])
   licznik++;
  }
 }
cout << endl << "Trafiles " << licznik << " liczb.";
}
//---------------------------------------------------------------------------
void main(int argc, char* argv[])
{
char znak;
do
{
wybierz_liczby();
losuj();
pokaz();
sprawdz();
cout <<  endl << "Jesli chcesz kontynuowac wpisz t jesli chcesz zakonczyc program wpisz n:"<< endl;
cin >> znak;
} while ( znak !='n');
}

Tagi: gry, c++

skomentuj (0)

[bcb][c++] kodowanie przy 1 znaku 2009-08-01 13:35:57

Witam :]

Dzis cos co napewno znacie :] Amianowicie kodowanie na podstawie tylko pierwszych znakow.
Np tekst kod zamieniony zostanie na kodso osdsa dofgof

Czyli banalne ogolnie :]
kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
srand(time(NULL));
String znaki ("qwertyuiop[]-=asdfghjkl;'zxcvbnm,.0123456789QWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+{}:|?<>");
int dlugosc;

for ( int i = 1 ; i < Edit1->Text.Length() + 1 ; i++ )
{
dlugosc = rand() % znaki.Length();
Memo1->Text = Memo1->Text + Edit1->Text[i];
 for ( int j = 0 ; j < dlugosc ; j++ )
 {
  Memo1->Text = Memo1->Text + znaki[rand() % znaki.Length()+1];
 } // do 2
Memo1->Text = Memo1->Text + " ";
} // do 1
}


Przykladowo :
tekst : kodowanie
zaszyfrowane : kxoF5C1INcGo(ZO?q;sq)^|$N;z6dV]N9JRIW}7?at{sj#S&u7KpJGX>#I+u:oM oM5Oj'0b+q2H dXY87$OWb]BC&K15@,MKq8=_-n_QEmv-26Cja:4iSCES6pK9w|O@U$YNwVO.L{5E5VlXX4WsPzM3s%$ oZy_v%NABjsd@1q$haBDe?d{h1vq{u>Kboy4R##W?JLXs)Ug,'Ji}*i[[H9c:C( w=RZDVuO||0Lel?VUa=ZyG7pi5.t+ytQ31ux=(;ql|SJt3X3V' acFPssfXatGP@CG@ul,1<OfHP)VlvN nz%mj90-Y9f$hCJz$+O'es*VFo(R-2vZ&eBmfWV<FINp0}bXOCw93STS*+ i6B65b e3]kHszj7Wk6Y,#mN8k^1!%cG[tmiHiBIuLO->GQPiovS5O6N]%a.tfssW{?VpA!


Ok jak widzicie tutaj sa przypadkowe znaki ale gdybysmy chcieli moglibysmy wczytywac baze slow np slownik i wtedy slowa bylyby logiczne ( jedynie zdania nie bardzo :) )
Mozemy takze kodowac i przesuwac dodatkowo nasze znaki :] calkowita dowolnosc

Tagi: c++, szyfrowanie

skomentuj (0)

[C++] Dzielenie wielomianow 2009-07-27 16:57:17

Witam :]
Dzis zajmiemy sie wielomianami a konkretnie ich dzieleniem :] Uzyjemy do tego celu metody Hornera :)
Na czym ta metoda polega ?
Pokaze na przykladzie zalozmy ze mamy wielomian : x^3 - 4x^2 + x + 6 : ( x - 2 )

A wieic metoda Hornera nakazuje nam zrobic tabelke na takiej zasadzie

| |1|-4|1|6|
|2| |  | | |

iczba 2 bez znaku "-" gdyz znak sie odwraca.
Teraz algorytm pierwsza liczbe z tabeli spisac na dol a nastepnie wymnozyc przez 2 ( w tym przypadku ) i dodac do wyniku kolejny element wielomianu czyli :

| |1|-4|1|6|
|2|1|  | | |

2*1 + (-4) = -2

| |1|-4|1|6|
|2|1|-2| | |

2* (-2) + 1 = -3

| |1|-4|1 |6|
|2|1|-2|-3| |

2* (-3) + 6 = 0

| |1|-4|1 |6|
|2|1|-2|-3|0|

Gdzie 0 to reszta z dzielenia a skoro reszta = 0 to wielomian dzieli sie przez dwumian ;]

Teraz na tej zasadzie napiszemy nasz program :]

kod:


#include <clx.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>

//---------------------------------------------------------------------------
void zamien (int *liczba)
{
 *liczba = *liczba * -1;
}
//---------------------------------------------------------------------------
void oblicz ( int *tab, int potega , int liczba )
{
int wynik;
wynik = tab[potega] * liczba + tab[potega-1];
cout <<  tab[potega] << "x^"<< potega - 1 << "+" << wynik << "x^" << potega - 2 << "+";
for ( int a = potega-2 ; a > 0 ; a-- )
{
 wynik = liczba * wynik + tab[a];
 cout << wynik << "x^" << a ;
} // do 1
wynik = liczba * wynik + tab[0];
cout << endl << "Reszty : " << wynik;

}
//---------------------------------------------------------------------------
#pragma argsused
void main(int argc, char* argv[])
{
cout << "Podaj najwyzsza potege wielomianu : ";
int potega;
cin >> potega;
int *wielomian = new int [potega + 1];
  for ( int i = 0 ; i < potega + 1 ; i++ )
  {
   cout << "Podaj liczbe przy potedze : " << i << " : ";
   cin >> wielomian[i];
  }
cout << "Postac wielomiana : " << endl;
  for ( int a = potega ; a > 0 ; a-- )
  {
     cout << wielomian[a] << "x^" << a ;
     cout << "+";
  }
cout << wielomian[0] << "="<< endl;
cout << "Podaj dwumian do dzielenia : ";
int liczba;
cin >> liczba;
cout << "(x + " << liczba << ")"<<endl;
zamien(&liczba);
cout << "Wynik : " << endl;
oblicz(wielomian,potega,liczba);



getch();
}



Program wyglada tak :
1


2

Tagi: algorytmy, c++

skomentuj (0)

[delphi] Radio 2009-07-26 20:53:57

Witam :]
W zamierzeniu mial to byc malware ale ostatecznie napisalem poprostu uzytkowy program Smile

Programik umozliwia nam sciagniecie stacji radiowych na dysk :] konkretnie to malych plikow ktore nalezy otworzyc w winampie SmileSmile ( oczywiscie internet musi byc podlaczony )

oto lista dostepnych stacji radiowych z 38 miast w tym 3 zagranicznych ( nowy jork, chicago, londyn)
Dzieki temu bedziemy mieli radio we wlasnym komputerze

Zet
Chilli Zet
Akademickie Radio Kampus
Kolor 103 FM
PiN 102 FM
Planeta FM
RDC - Radio Dla Ciebie
TOK FM
VOX FM Warszawa
Warszawa
WAWA 89,8
Antyradio 94
Eska Warszawa
Eska Rock
RMF FM
Alfa
Eska Kraków
Polskie Radio Kraków
Antyradio 101,3 FM
RMF Classic
Gra Toruń
Plus Toruń
Bartoszyce
Akadera
Polskie Radio Białystok
Jard
Jard 2
Bielsko
Planeta FM
Eska Bydgoszcz
Gra Bydgoszcz
PiK
Plus Bydgoszcz
Bon Ton
Wietrzne Radio
1080 AM
Weekend
Katolickie Radio Ciechanów
Jasna Góra
FIAT
Sudety
El
5 Ełk
Polskie Radio Gdańsk
Eska Trójmiasto
CCM
Elka Głogów
RMG FM
Bogoria
Gra Inowrocław
Muzyczne Radio
Centrum Kalisz
Rodzina Kalisz
eM
Antyradio 106.4
Eska ¦l±sk
Polskie Radio Katowice
Planeta FM
Sud
Fama
Planeta FM
Polskie Radio Kielce
Eska Szczecin
Polskie Radio Szczecin
Szczecin FM
Planeta FM
Polskie Radio Koszalin
Aplauz
Eska Wrocław
Akademickie Radio Luz
R.A.M.
Rodzina
Traffic FM
Polskie Radio Wrocław
HeyNow
Polskie Radio Londyn
Centrum
Polskie Radio Lublin
eR
Eska ŁódĽ
Planeta FM
Polskie Radio ŁódĽ
Parada
Studenckie Radio Żak
Rytm
Polskie Radio Olsztyn
UWM FM
Planeta FM
Planeta FM
Polskie Radio Opole
Plus Opole
Afera
Emaus
Eska Poznań
Złote Przeboje 88.4 FM
Blue 103,4 FM
MC Radio 102.7 FM
Merkury
PlayNet
Planeta FM
105,4 Roxy FM
Akademickie Radio Centrum
Polskie Radio Rzeszów


UWAGA! - Pliki zapisujemy na dysku pod jakakolwieknazwa ale rozszerzenie musi byc "*.pls". Plik ten otwieramy winampem bedac w sieci.

UWAGA - Po wybraniu stacji i nacisnieciu "Pobierz" program chwilke pmysli ( w tym momencie sciaga ) zajmie mu to okolo 2-3 sekundy i wyswietli informacje o sukcesie lub porazce pobierania pliku.

UWAGA - Jesli sciagamy cos z sieci p2p lub rapidshare i tym podobne radio najprawdopodobniej nie bedzie gralo plynnie lub wogole ( poprostu zbyt obciazona siec )

UWAGA - Radio to moze byc nieco spoznione z radiem podpietym do kontaktu :] Np mja stacja ktorej slucham jest spozniona u mnie cos okolo 5-10 sekund dlatego mozemy slyszec ze np spiker cos mowi a u nas jeszcze leci koncowka piosenki Smile

No i tyle :] Powiem tylko ze z programiku korzystam :] I wlasnie teraz w moim kompie leci moja ulubiona stacja xDD

Z technicznych praw to praktycznie jedna funkcja :]
Funkcja : URLDownloadToFile
Budowa:


HRESULT URLDownloadToFile( LPUNKNOWN pCaller,  LPCTSTR szURL, LPCTSTR szFileName, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB);

Aby skorzystac z tej funkcji trzeba uzyc biblioteki URLMon
No i tyle jesli ktos chce glebszego wyjasnienia tej funkcji to prosze napisac :]

A jak nie to milego sluchania :]
download:


http://rapidshare.com/files/216123627/Project1.exe.html

Tagi: download, delphi

skomentuj (1)

[delphi] skaner stron webowych 2009-07-26 20:50:00

Witam :]
Oto moje nowe dziecko xD Obiecalem kiedys ze cos takiego wykodze :] dzis sie wzialem od poludnia i troche wykodzilem Tongue

Ale po kolei...
Program ma na celu wyodrębnienie stron na ktorych znajduje sie podane przez nas slowo / slowa.
Po co ??
No wlasnie przejdzmi najpierw do funkcji programu:

menu wyglada tak:

pierwsze

Mamy dwa systemy skanowania do wyboru.
Zajmijmy sie najpierw 1
wyglada on tak:

drugi


Ma on na celu przeszukania tresci na podanych przez nas linkow.
( link MUSI wygladac tak: "http://www.hackinq.pl/"
NIE MOZE wygladac np tak : "www.hackinq.pl/" )
Ok po co takie cos :] ??
Mi to np sie przydaje do wiedzy czy np moj nick gdzies zostal wymieniony ( mozna wtedy odrazu na dana strone przejsc ) lub czy jest dyskusja na jakis interesujacy mnie aktualnie temat.

Drugi sposob skanowania jest nieco klopotliwy...
Wyglada on tak:


trzeci

Problemem jest to ze gdy natrafimy na IP ktore nie dotyczy strony internetowej badz aktualnie strona jest iedoostepna program lapie zwieche :] chwile pomuli i znow bedzie dzialal itd problemem jest pozniej jego zatrzymanie i trzeba chwilke poczekac Tongue
( jak bedzie mi sie chcialo to naprawie to ale to troche czas zajmie )

Niemniej skanowanie to przydaje sie :]

I to w sumie wszystko :] download:


http://rapidshare.com/files/227426000/Project1.exe.html
















































Tagi: download, delphi

skomentuj (0)

[delphi] Moj AntyVirus 2009-07-26 20:44:09

Witam :]
oto jedna z tych moich zapor o ktorych mowilem kiedys :]
Program poprostu skanuje wszystko co laczy sie z naszym komputerem.
Jesli port ktory w tym uczestniczy moze byc zarazony program podaje nam go.
Wtedy wystarczy zaznaczyc go i nacisnac "Pokaz informacje o zagrozeniu".
Uruchomi nam sie specialna stronka z informacjami Smile

UWAGA!
Program jest bardzo czuly i czesto wykrywa aplikacje nieszkodliwe ( np: emule ) jako zagrozenie :]
Dlatego najpierw warto poczytac o "zagrozeniu" nim podejmie sie srodki :]

Pozatym z tego co wiem programik potrafi wykryc confickera Big Grin ale nie sa to pewne informacje poniewaz nie zarazalem sie specialnie tym malware :]

Program wyglada tak:



screen



Aplikacja skanuje komputer okolo 11 godzin wiec jest to strasznie dluuuugo ale bez obaw komputera wogole nie zamula mozna nawet grac w gry skanujac tym programem :]
a co wazniejsze mozna poprostu nacisnac "Zakonczc i zachowaj" nastepnie wybieramy sicezke gdzie ma sie zapisac nasz ostatni skan i od nastepnego razu bedzie skanowalo nie od poczatku a od poprzedniego zakonczenia :]

Skanowanie wiec mozna podzielic sobie na kilka czesci :]

Ok mysle ze to all :]
Aha bardzo wazne!!!!
Aplikacja wykryje malware ale tylko takie ktore laczy sie w jakis sposob z siecia :] ( najczesciej wykryje trojany oraz keyloggery )
Programy "zabawki" raczej nie chyba ze dziala na zasadzie trojana.
Skutecznosc to okolo : 65% :]

No wiec to na tyle :] ja osobiscie co jakis czas sobie tym skanuje kompa bo ostroznosci nigdy za wiele :] a polaczenie normalnego AV ze swoimi wynalazkami zawsze jakos zabezpieczenie zwieksza xD

download:


http://rapidshare.com/files/226448384/Project1.exe.html

mam nadzieje ze sie przyda :]

Tagi: download, delphi

skomentuj (0)

[c++][BCB] Rozmycie ( efekt blur ) 2009-07-26 20:38:21

Witam Big Grin

Dzis znow program graficzny :] Tym razem jeden z ladniejszych efektow to jest efekt blur ( rozmycie ) Smile
Na czym polega to ?
najprosciej mowiac rozmycie polega na pobraniu macierzy 3x3 pikseli na mapie bitowej a nastepnei wyliczanie sredniej skladowych RGB.
Oczywiscie najlepiej posluzyc sie tu funkcja scanline ale chodzi tu tylko o przyklad wiec wyknalem poprostu proste obliczenia w biegu co oczywiscie wplywa na bardzo dlugi okres wykonywania obliczen no ale wystarczzy lekko kod zmodyfikowac na np taki :
RGBQUAD *wskaznik = (RGBQUAD *) Image1->Picture->Bitmap->ScanLine[wiersz];

Ale jak widzicie tu potrzebna jest obsluga funkjci scanline ktora jak obiecalem zajmiemy sie kiedy indziej i zrobimy wszystkie filtry za pomoca wlasnie scanline.

ok a teraz kod rozmycia Smile

{
for ( int a = 0 ; a < ScrollBar1->Position ; a++ )
{
for ( int i = 0 ; i < 800 ; i++)
{
  for ( int j = 0 ; j < 800 ; j++)
  {
   int czerwone = (GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+1]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+1]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+1]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+2]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+2]) +
                  GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+2])) / 9;
   int zielony = (GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+1]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+1]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+1]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+2]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+2]) +
                 GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+2])) / 9;
   int niebieski = (GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+1]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+1]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+1]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j][i+2]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+2]) +
                   GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+2])) / 9;

// przypisanie klorow :)
Image1->Picture->Bitmap->Canvas->Pixels[j][i] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+1][i] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+2][i] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j][i+1] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+1] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+1] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j][i+2] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+1][i+2] = RGB(czerwone,zielony,niebieski);
Image1->Picture->Bitmap->Canvas->Pixels[j+2][i+2] = RGB(czerwone,zielony,niebieski);

  } // do 2
} // do 1

}




Wlasnie dlatego przyda sie tu obsluga scanline gdyz robiac to "recznie" wszystko obslugujemy kazdy piksel po kolei co wplywa negatywnie na dlugosc wykonywania algorytmu...
Ale to w nastepnych artach :]

Aha efekt przed i po zabiegu z moca = 3

przed :


przed

I Po

po

Tagi: algorytmy, c++

skomentuj (2)

[C++][BCB] Efekty graficzne mini phtoshop :) 2009-07-26 20:27:37

Hej witam wszystkich :] Dzis pobawimy sie grafika i zrobimy dosc duzo w niej Big Grin Konkretnie to bedziemy programowac ale napiszemy kilka filtrow do obrazkow. Bedziemy operowac na mapach bitowych wiec oczywiscie format pliku powinien byc BMP najlepiej 24 badz 32 bitowy. Aby pracowac na formacie np JPG musimy najpierw zrobic konwersje. Gdyby ktos nie wiedzial jak to zrobic to niech napisze tu to wytlumacze ale w wiekszosci FAQ jest opisana konwersja na rozne formaty plikow graficznych Tongue

Ok co jeszcze ? Otoz jak widzicie jest to 1 czesc atykulu wiec jak sie mozna latwo domyslec sa w planach inne czesci Smile To zalezy tylko od was czy nastepne czesci sie pojawia czy nie. Chce tylko tu nadmienic ze dzis pokaze jak robic rozne filtry graficzne BEZ wnikania w algorytmike i przyspieszania operacji matematycznych. Tym wlasnie zamierzam sie zajac w czesci 2 gdzie bedziemy doslownie maglowac przedewszystkim funkcje ScanLine :]

Musicie mi wybaczyc kolejnosc w ktorej bede prezentowal kolejne filtry gdyz nie robilem tego wszystkiego w jeden dzien i nieraz bedzie temat latwiejszy nieraz nieco trudniejszy NIEZALEZNIE w ktorej kolejnosci od poczatku jest Smile

Za kazdym razem bedziemy pracowac na jednym i tym samym obrazku. Jest nim :


startowy


No to chyba na tyle jesli chodzi o wstep Smile Bierzmy sie wiec do pracy. Na rozgrzewke wezmy Rozjasnianie obrazka. ( za pomoca funkcji rozjasniania mozna uzyskac ladny efekt FadeIn. Ale nie bede tego tu pokazywal z jednego prostego powodu :] Przyklad kodu tego efektu juz jest w niejednym FAQ Smile Nawet z uzyciem ScanLine.
Ok wiec aby rozjasnic obrazek nalezy zwiekszyc kazda wartosc zmiennych skladowych RGB. Nalezy jednak pamietac ze kazdy piksel na mapie bitowej moze mieec maksymalna wartosc 255 wiec nalezy sie zabezpieczyc przed przekroczeniem limitu. Czemu wartosci dodac ? bo wartosc RGB(255,255,255) to idelna biel natomiast RGB(0,0,0) to idealna czern.
Ok a wiec kod zrodlowy : ( w wiekszosc przykladow korzystam ze ScrollBara w ktorym ustalam wartosc / moc danego efektu

kod:


for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  r+=ScrollBar1->Position;
  g+=ScrollBar1->Position;
  b+=ScrollBar1->Position;
  if (r > 255)
  r=255;
  if (g > 255)
  g=255;
  if (b > 255)
  b=255;

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}



jak widzicie do pobrania skladowych RGB uzywam funkcji GetRValue i tak pozostanie do konca tego artykulu :] Opis tej funkjci juz kiedys dawalem wiec nie bede sie powtarzal Smile efekt przy wartosc 77 :

jasnosc


No dobra skoro rozjasnianie jest to i niech bedzie przyciemnianie Smile Ale chyba juz sami sie domyslacie ze wystarczy jedynie zmienic znaki operatora "+" na "-" kod:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  r-=ScrollBar1->Position;
  g-=ScrollBar1->Position;
  b-=ScrollBar1->Position;
  if (r < 0 )
  r=0;
  if (g < 0)
  g=0;
  if (b < 0)
  b=0;

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


No i jak widac nalezy pamietac o tym by nie wyjechac poza zasieg a skoro odejmujemy to naszym dolnym zasiegiem jest oczywiscie 0 a nie 255. Za pomoca przyciemniania mozna zrobic efekt FadeOut ktory tak jak FadeIn jest juz na googlach wiec nie bede sie na ten temat rozpisywal Smile
efekt przy wartosci 77 :


ciemny


No dobra wiec teraz zajmijmy sie trudniejszym aspektem :] Chodz gwarantuje wam ze tu nie ma w sumie nic trudnego Smile Tak jak kiedys napisal V3rt w SB "patrzac na obrazek widzisz cyfry" tak idac ta zasada poprostu wykonujemy najprostsze obliczenia matematyczne Tongue Nic ponad to Smile
Zajmijmy sie teraz czyms co jest podobne do jasnosci. Amianowicie KONTRASTEM.
Tak naprawde kontrast ma jedynie dosc rozbudowany algorytm ale nic trudnego w nim nie ma. Spojrzcie na kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);

if (ScrollBar1->Position > 0)
{
  if (r < ScrollBar1->Position)
  r = 0;
  else if (r > 255 - ScrollBar1->Position)
       r = 255;
       else
       r = 255 / (255 - 2 * ScrollBar1->Position) * (r - ScrollBar1->Position);

  if (g < ScrollBar1->Position)
  g = 0;
  else if (g > 255 - ScrollBar1->Position)
       g = 255;
       else
       g = 255 / (255 - 2 * ScrollBar1->Position) * (g - ScrollBar1->Position);

   if (b < ScrollBar1->Position)
  b = 0;
  else if (b > 255 - ScrollBar1->Position)
       b = 255;
       else
       b = 255 / (255 - 2 * ScrollBar1->Position) * (b - ScrollBar1->Position);
}
if (ScrollBar1->Position < 0) //zmniejszanie kontrastu
{
r = ScrollBar1->Position + (255 + 2 * ScrollBar1->Position) /255 * r;
g = ScrollBar1->Position + (255 + 2 * ScrollBar1->Position) /255 * g;
b = ScrollBar1->Position + (255 + 2 * ScrollBar1->Position) /255 * b;

}

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}



Wiec jedynym trudnym wyliczeniem jest algorytm:
zmienna_skladowa_RGB = 255 / (255 - 2 * nasza_wartosc) * (zmienna_skladowa_RGB - nasza_wartosc);
efekt przy 73 :


kontrast


Swietnie :] jak widac bylo to nieco trudniejsze od rozsjasniania ale tylko pozornie ( nieco funkcje warunkowe groznie wygladaja ) ale tak naprawde wszystko w normie Smile
No ale by pokazac teraz nieco cos latwiejszego a baaaardzo czesto uzywanego zrobimy filtr ktory zamienia obrazek kolorowy na czarno bialy :]
Do tego celu tak naprawde bedzie nam potrzebny tylko jeden wzor :
szara_wartosc = (czerwony + zielony + niebieski) / 3;

A wiec kod :



void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int szarosc = (r + g + b) / 3;



  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(szarosc,szarosc,szarosc);
}
}


efekt

szary



No to moze znwo bardzo prostu przyklad :] a bardzo znany amianowicie NEGATYW.
jak go zrobic ? Poprostu skladowa RGB odejmujemy od maksymalnej wartosci jednego bajta.
Negatyw ladnie wyglada na portretach postaci. tu mamy jednak krajobraz no ale coz Smile
kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i=0; i<1000; i++)
{
   for (int j=0; j<1000; j++)
   {
   int r = 255 - GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
   int g = 255 - GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
   int b = 255 - GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
   Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
   }
}


negatyw


Idzmy dalej kolejnym efektem bedzie usuniecie z obrazka jednej skladowej RGB. W naszym przykladzie usuniemy barwe czerwona.
kod:



void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i=0; i<1000; i++)
{
   for (int j=0; j<1000; j++)
   {
   int r = 0;
   int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
   int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
   Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
   }
}


dwa kolory


No to lecimy dalej :] tym razem cos co potrafi upiekszyc niejedno zdiecie :] NASYCENIE KOLOROW Smile

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);

  int szarosc = (r + g + b) / 3;

  r = szarosc+(((r-szarosc)*ScrollBar1->Position)/ 255);
  g = szarosc+(((g-szarosc)*ScrollBar1->Position)/ 255);
  b = szarosc+(((b-szarosc)*ScrollBar1->Position)/ 255);

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


nasycenie


A teraz mniej znany efekt ktory nazywa sie pasteryzacja :] Na czym polega sami zobaczcie :

kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);


  r = (r/ScrollBar1->Position)*ScrollBar1->Position ;
  g = (g/ScrollBar1->Position)*ScrollBar1->Position ;
  b = (b/ScrollBar1->Position)*ScrollBar1->Position ;

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


ciekawy efekt


Kolejnym mniej znanym filtrem jest progowanie
kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);


  r = (r/ScrollBar1->Position)*ScrollBar1->Position ;
  g = (g/ScrollBar1->Position)*ScrollBar1->Position ;
  b = (b/ScrollBar1->Position)*ScrollBar1->Position ;

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


Polega jak widac na zamianie wszystkich kolorow na tylko dwa. Tu koloru dobralem przypadkowo wiec nie wyglada to fajnie ale chodzi tylko o przyklad
efekt przy 100:


progowanie


Kolejnym efektem jest sepia Smile znana chyba kazdemu.
kod:


for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);

  b = r;
  g = r;


  r += ScrollBar1->Position;


   if (r  > 255)
  r=255;


  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


sepia


Przedostatnim filtrem ktory pokaze jest szum kolorowy :] Podobny do tego co widac nieraz w TV i nazywamy to kaszk± Smile Dodam tylko z za pomoca szumu i xorowania mozna latwo szyfrowac obrazki i zawarta w nich tresc :] gdyby ktos chcial moge pokazac jak to robic Smile

void __fastcall TForm1::Button1Click(TObject *Sender)
{
srand ((int) time(NULL));
for ( int i = 0 ; i < 500000 ; i++ ) // 500000 pikseli szumu
{
Image1->Picture->Bitmap->Canvas->Pixels[rand()%800][rand()%800] = RGB(rand()%255,rand()%255,rand()%255);
}


szum

No i ostatni efekt na dzis to Wyplowienie :]


kod:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int i = 0; i < 1000 ; i++)
{
for ( int j = 0 ; j < 1000 ; j++)
{
  int r = GetRValue(Image1->Picture->Bitmap->Canvas->Pixels[i][j]);
  int g = GetGValue(Image1->Picture->Bitmap->Canvas->Pixels[i+1][j]);
  int b = GetBValue(Image1->Picture->Bitmap->Canvas->Pixels[i+2][j]);


  r = (r + g + b) / 3;
  g = (g + g + b) / 3;
  b = (b + g + b) / 3;

  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = RGB(r,g,b);
}
}


wyplowienie


No to na tyle jesli chodzi o czesc 1 :]

mam nadzije ze art sie podoba Smile Tak w sumie to podaje tu sasme gotowce duzo nie opisuje bo ... nie ma w sumie czego opisuac :] Sma matematyka i zabawa z liczbami Smile Polecam eksperymentowac bo naprawde fajne efekty moga wyjsc nieraz :]


Tagi: algorytmy, c++

skomentuj (0)

[delphi] kodowanie obrazka (zmiana kolrow) 2009-07-26 20:09:49

Witam :]

Dzis pokaze wam jak kodowac obrazek za pomoca samej zmiany kolorow.
Jest to najbardziej prymitywne kodowanie ale na poczatek trzeba od tego zaczac a w nastepnym artykule pokaze jak kodowac obraz za pomoca szumu.

ok to lecmy dalej.
dzialamy na obrazku :

obrazek niezakodowany


Ok jak bedziemy szyfrowac ?
Kazdy obrazek dziala na 3 strumieniach kolorow czerwony, zielony , niebieski.
Sa to kolory RGB.
Ale nim dojdzie do zmian bedziemy musieli jakos pobrac dane strumienie.
Jest na to kilka sposobow ja jednak uzywam najczesciej 3 funkcji :
getrvalue - czerwony
getgvalue - zielony
getbvalue - niebieski

Samo kodowanie bedzie dzialac na 3 kluczach.
I bedzie dzialac na zasadzie szyfru Cezara czyli zwykle przestawianie liczb :]
Czyli ma to pokazac jedynie wykorzystanie funkcji ktore podalem wyzej. Lepszym szyfrowaniem zajmiemy sie za jakis czas.

kod:


procedure TForm1.Button1Click(Sender: TObject);
var
i,i2,i3,i4,i5 : integer;
x,y,z : integer;
begin
for i := 0 to 650 do begin
   for i2 := 0 to 500 do begin
   x := getrvalue(image1.Canvas.Pixels[i,i2]);
   y := getgvalue(image1.Canvas.Pixels[i,i2]);
   z := getbvalue(image1.Canvas.Pixels[i,i2]);
      for i3 := 1 to strtoint(edit1.Text) do begin
      x := x + 1;
      if x > 255 then x := 0;
      end; // do 1 kodowania
      for i4 := 1 to strtoint(edit2.Text) do begin
      y := y + 1;
      if y > 255 then y := 0;
      end; // do 2 kodowania
      for i5 := 1 to strtoint(edit3.Text) do begin
      z := z + 1;
      if z > 255 then z := 0;
      end; // do 3 kodowania

   image1.Canvas.Pixels[i,i2] := rgb(x,y,z);
   end; // do 2
end; // do 1
image1.Picture.SaveToFile('miejsce do zapisu');
end;


Czyli wszystko ladnie zmienia kolory :]
przykladowo :
klucz 1 : 200
klucz 2 : 138
klucz 3 : 189

Daje nam to taki efekt :


zakodowany


A wiec samo kodowanie jak widzicie jest bardzo proste jednak powoduje jedynie zmiane kolorow wiec widac wszystko tylko ze zmienionymi barwami :) W ten sposob nierazw grach komputerowych mozna napisac algorytm powodujacy efekt gogli termowizyjnych :]

ok opiszmy wiec krotko funkcje :
RGB
Jest to nic innego jak wspomniane juz kolory czerwony . zielony , niebieski.
Zakres kazdej z barw to 0-255.
Praktycznie to wszystko b to naprawde prosta funkcja

nastepnie sa trzy podobne funkcje.
getrvalue - czerwony
getgvalue - zielony
getbvalue - niebieski

Kazda z funkcji pobiera wartosc danego koloru z danego piksela.
A wiec kolor RGB(255,0,0) to maksymalnie czerwony.
Wykorzystujac ta funkcje mozemy otrzymac :
getrvalue(clred) otrzymamy wlaasnie = 255.

Pozostale dwie funkcje dziala tak samo tylko ze kolejno dla barwy zielonej i niebieskiej.

budowa:

BYTE GetRValue( DWORD rgb);

parametr rgb okre¶la warto¶ć koloru RGB.

I analogicznie dla pozostalych dwoch funkcji.

Aby "odszyfrowac" to dzialamy analogicznie do szyfratora. Dzialanie podobne jak w szyfrze polegajacym na przesunieciu.

Tagi: delphi, steganografia

skomentuj (0)

łamanie szyfrow czesc 3 2009-07-26 20:06:43

Witam :]

Dzis czesc 3 artykulow lamania szyfrow Smile
Tym razem szyfr bedzie zdecydowanie bardziej ciekawy chodz jak sie okaze latwo go zlamac.


Przejdzmy najpierw do toku myslenia programisty.
Wczesniej pisalismy kodery operujace na 1 liczbie kodujacej i zlamanie tego to kwestia czasu.
A gdyby tak kluczze bylyby rozne ?? hmmm jak to zrobic ?

A no bardzo prosto :]
Kazdy nasz znak slowa kodowanego podejmujemy algorytmowi wraz z kazdym znakiem naszego hasla a wiec haslem jest ... slowo :]

przyklad:

slowo : dupa
haslo : laseczka
szyfr : ĐÖăĆ


slowo : kluska
haslo : kaczka
szyfr : ÖÍŘíÖÂ


slowo : paktofonika
haslo : hip-hop
szyfr : ŘĘŰ·×ŐßÖŇŰ®


kod programu szyfrujacego :


procedure TForm1.Button1Click(Sender: TObject);
var
i,licz : integer;
s,s2,wynik : integer;
zdanie : string;
begin
licz := 0;
for i := 1 to length(edit1.Text) do begin
s := ord(edit1.Text[i]);
licz := licz + 1;
if licz > length(edit2.Text) then
licz := 1;
s2 := ord(edit2.Text[licz]);

wynik := s + s2;
zdanie := zdanie + chr(wynik);

end;   // do 1
memo1.Text := zdanie;



end;



Ok jak zwykle analiza :]
Jak widzimy znow slowo = szyfr pod wzgledem dlugosci lancucha.
Co wazne dzieje sie tak niezaleznie od dlugosci hasla.

Ale jak widzimy przesuniecie tak jak wczesniej odpada. xorowanie tez...
Ogolnie jak to ugryzc ????
Po 1.) To moze byc przesuniecie oraz xorowanie :] To moze byc wszystko :]
Po 2 ) Widzimy tu znaki z tablic ASCII co swiadczy o braku najprawdopodobniej marginesow.
Po 3 ) Najlepiej sami pozakladajmy swoje slowa ze swoimi haslami :] ( w koncu jako user mozemy zakladac konta albo szyfrowac do woli ) a naszym celem teraz bedzie sprawdzic jakiekolwiek prawidlowosci.

No to lecimy
Cytat:slowo : hackinq
haslo : a
szyfr : ÉÂÄĚĘĎŇ

Cytat:slowo : hackinq
haslo : aaaaaaaaaaaaaaaa
szyfr : ÉÂÄĚĘĎŇ

No i mamy 1 krok milowy :]
Widizmy ze ILOSC i DLUGOSC hasla nie ma znaczenia. Znaczenie ma jedynie znak / znaki.
Ok zobaczmy z jakich znakow ASCII sklada sie slowo "hackinq" i z jakich sklada sie szyfr
hackinq = 104 - 97 - 99 - 107 - 105 - 110 - 113
ÉÂÄĚĘĎŇ = 201 - 194 - 196 - 204 - 202 - 207 - 210

Zobaczcie na "gole" oko widac juz algorytm :] Otoz jest to przesuniecie :]
kod:



procedure TForm1.Button2Click(Sender: TObject);
var
i,i2 : integer;
liczba : integer;
s : string;
begin
for i := 1 to length(edit1.Text) do begin
liczba := ord(edit1.text[i]);
s := s + inttostr(liczba) + ' - ';
end;
edit3.Text := s;
s := '';
for i2 := 1 to length(memo1.Text) do begin
liczba := ord(memo1.text[i2]);
s := s + inttostr(liczba) + ' - ';
end;
edit4.Text := s;
end;


ok dzieki temu wiemy jak wygladaja ascii i znamy algorytm Smile skad ??
patrzcie :
97 - 99 = roznica = 2
194 - 196 = roznica = 2
2 = 2
A wiec przesuniecie wynosi 2 :] Oczywiscie konkretnie w tym przypadku.
Bo sam algorytm nie :] teraz trzeba porownac to:
194 - 97 = 97
196 - 99 = 97

A wiec nasze haslo to : "a" bo "a" = 97 w ASCII. :]

Ok wszystko ladnie pieknie :]
Ale co jesli haslo wyglada nieco inaczej ? :]

sprawdzmy.
slowo : hackinq
haslo : ab
szyfr : ÉĂÄÍĘĐŇ

hackinq = 104 - 97 - 99 - 107 - 105 - 110 - 113
ÉĂÄÍĘĐŇ = 201 - 195 - 196 - 205 - 202 - 208 - 210

I co teraz widzimy :] ?
201 - 104 = 97 = "a"
195 - 97 = 98 = "b"
196 - 99 = 97 = "a"
205 - 107 = 98 = "b"

A wiec algorytm juz jest 100% widoczny :]

Problemem najczesciej jednak bedzie to ze nie znamy nic procz... zaszyfrowanej wiadomosci :] co wtedy ??

np:
slowo : ?
haslo : ?
szyfr : ŃĐÍÂÄŰĆĚ’˜

W takim przypadku na pierwszym planie powinno sie pojawic "pojechanie" tego przesunieciem xorowaniem czy przesuneiciem bitow o stalej wartosci :]
W tym przypadku daje nam to rezultat w postaci:
polaczek17

A skoro znamy slowo znamy tez haslo = "a" w tym przypadku :]

Ok ale co jesli takie pojechanie nic nie da ??
Wtedy trzeba skorzystac z brute force i nastepnie znajac kawalek slowa ( brute force na zasadzie podstawowych algorytmow czyli przesuniec np na 25 pierwzych liczb ) a nastepnie pojechac je slownikiem :] Nie daje tego tutaj ze wzgledow miejsca bo troche to zajmie ale nie duzo :] dzieki temu wlasie ze znamy dlugosc slowa Smile

Taki efekt da nam np z 7 -literowego slowa okolo 3 znane znaki ( okolo ) wtedy korzystamy z slownika i mamy slowo :] ewentualnie slowa ale najczesciej slowa o tym samym znaczeniu :]

Tagi: szyfrowanie

skomentuj (0)

łamanie szyfrów czę¶ć 2 2009-07-26 20:00:55

Witam Big Grin
Dzis druga rozniaca sie tylko nieco od poprzedniego artykulu lekcja :]
Roznica bedzie to ze szyfr bedzie korzystal z dwoch zmiennych kluczy.
Bedzie to xor i przesuneicie w ASCII.
Na pewnym forum zauwazylem wpis pewnej osoby ktora miala podniete xorowaniem i sadzila ze nie da sie tego zlamac :] Nie dosc ze brzmi to absurdalnie to jeszcze nikt tego czlowieka nie wyprowdzil z bledu xD
ech...
Zacznijmy od tego ze sam xor mozna by zlamac w ten sam sposob co w 1 artykule.
ja chcac teraz nieco utrudnic zadanie napisalem szyfr korzystajacy z dwoch metod matematycznych.
I tu UWAGA!
ZADEN szyfr nie jest bezpieczny jesli opiera sie tylko na takich prostych obliczeniach matematycznych.
Zlamanie takiego szyfru to zawsze tylko kwestia czasu.

Ok teraz pokaze jak program szyfruje dane: ( dla ulatwienia i szybkosci lamania klucze nie przekraczaja liczby 20 )
słowo : zaszyfrowane
klucz1 : 12
klucz2 : 8
wiadomosc zaszyfrowana : ~u‡~}r†kƒujq


słowo : princeofdoom
klucz1 : 19
klucz2 : 18
wiadomosc zaszyfrowana : us¦¬‚ˆ®‡‰®®�


słowo : forum hackinq
klucz1 : 1
klucz2 : 1
wiadomosc zaszyfrowana : hotum"jackipq


Jak widac duza roznica miedyz zaszyfrowanymi slowami :]
Ok najpierw tak jak myslal programista a wiec kod programu szyfrujacego:


procedure TForm1.Button1Click(Sender: TObject);
var
i,i2,liczba : integer;
znak : string;
begin
for i := 1 to length(edit1.Text) do begin
znak := edit1.Text[i]; // wyciagamy znak
liczba := ord(znak[1]); // wyciagamy liczbe
liczba := liczba xor strtoint(edit2.Text); // xorujemy
liczba := liczba + strtoint(edit3.Text); // przesuwamy
memo1.Text := memo1.Text + chr(liczba); // zapisujemy
end;
end;


Proste prawda :] ?
Kod duzo nie rozni sie od tego z 1 artykulu :]
Jednak kod lamiacy ten szyfr wyglada juz znacznie inaczej :]

Ale znow zauwazmy co widzimy:
princeofdoom : us¦¬‚ˆ®‡‰®®�

Nie widzimy nic Big Grin ?
No to znow zapiszmy to inaczej:
p r i n c e o f d o o m
u s ¦ ¬ ‚ ˆ ® ‡ ‰ ® ® �

Teraz widac golym okiem ze dlugosci obu wyrazow sa takie same.
Jest to wazna informacja.

Po przyjzeniu sie widzimy tez cos innego :] BARDZO BARDZO waznego Smile
pogrubie to:
p r i n c e o f d o o m
u s ¦ ¬ ‚ ˆ ® ‡ ‰ ® ®

Tak oto to :] Kazdy znak ma swoj odpowiadajcy mu odpowiednik.
Co to nam daje ??

Ano sprobujmy odszyfrowac takie cos :

nhv}hqnh
Nie znamy klucza ani hasla.
Znamy dlugosc slowa ( 8 znakow )
i teraz pytanie czy znamy litery ??
teoretycznie nie ale to i tak nieszkodzi bo mozemy zauwazyc kolejna zaleznosc:
nhv}hqnh
Jak widzicie w hasle sa az 3 takie same znaki.
Mozna by to wykorzystac do ataku slownikowego gdzie kod wygladalby tak:


if (i2 = i5) and (i2 = i8) then zapisz slowo

W zaszyfrowaej wiadomosci pojawia sie rowniez dwa razy znak "n" co znaczy ze sa rowniez dwa takie same znaki.
A wiec kod w ataku slownikowym :


if (i2 = i5) and (i2 = i8) and (i1 = i7) then zapisz slowo



Gdybysmy nie potrafili zlamac szyfru to nic innego by nam ni pozostalo :]

My jednak sprobujemy szyfr zlamac. ( w normalnych warunkach taki szyfr zlamany by zostal ale troche czasu by to zajelo )
My dla ulatwienia wiemy ze klucze nie sa wieksze niz 20 Smile
A wiec kod lamiacy szyfr


var
i,i2,i3,i4,i5 : integer;
znak,slowo : string;
liczba : integer;
begin
for i := 1 to 20 do begin // kazdy klucz po kolei
   for i2 := 1 to length(memo1.Text) do begin
   znak := memo1.Text[i2]; // wyciagamy znak z zaszyfrowanej wiadomosci
   liczba := ord(znak[1]); // wyciagamy liczbe
   liczba := liczba - i; // przesuwamy w ascii
   memo2.Text := memo2.Text + chr(liczba); // zapisujemy
   end; // do 2
memo2.Lines.Add('');
end; // do 1



STOP!
Zauwazcie ze podczas lamania szyfru nasz program dziala "wstecz" tak jakbysmy przewijali film na plycie DVD.
W koderze pierwsze bylo xorowanie a w lamaczu pierwsza metoda jest ostatnia w koderze. ( chodz nie zawsze )

Ok jak to wyglada teraz?
Czy program zlamal haslo ?
nie jeszcze nie :]
na podstawie naszego slowa "nhv}hqnh" program wybral nastepujace mozliwosci na podstawie 20 mozliwych kluczy.

mgu|gpmg
lft{folf
keszenke
jdrydmjd
icqxclic
hbpwbkhb
gaovajga
f`nu`if`
e_mt_he_
d^ls^gd^
c]kr]fc]
bjqeb
a[ip[da[
`ZhoZc`Z
_YgnYb_Y
^XfmXa^X
]WelW`]W
VdkV_V
[UcjU^[U
ZTbiT]ZT

Ok w sumie nie widac tu zadnego logicznego slowa.
Ale to naturlanie przeciesz jeszcze musimy odwrocic xororwanie.

a wiec ciag dalszy kodu:



for i3 := 0 to memo2.Lines.Count - 1 do begin
slowo := memo2.Lines.Strings[i3];
   for i4 := 1 to 20 do begin
      for i5 := 1 to length(slowo) do begin
      znak := slowo[i5];
      liczba := ord(znak[1]);
      liczba := i4 xor liczba;
      memo3.Text := memo3.Text + chr(liczba);
      end;
   memo3.Lines.Add('');
   end; //do 2
end; // do 1
end;


I teraz jak widzicie mamy juz odwrocone xorowanie :]
jaki jest minus tej metody ??
Ano taki ze kazde slowo ktore bylo wyzej odkodowane przechodzi jeszcze raz 20 odkodowan :]
dlatego ostatecznych kombinaacji jest duzo ale wynik widac juz golym okiem :]

zobaczcie sami:
lft}fqlf
oew~eroe
ndvdsnd
icqxctic
hbpybuhb
kaszavka
j`r{`wj`
eo}toxeo
dn|unydn
gmvmzgm
fl~wl{fl
akypk|ak
`jxqj}`j
ci{ri~ci
bhzshbh
}welw`}w
|vdmva|v
ugnubu
~tfotc~t
ysahsdys
mguzgnmg
ndvydmnd
oewxeloe
hbpbkhb
icq~cjic
j`r}`ij`
kas|ahka
dn|sngdn
eo}rofeo
fl~qlefl
gmpmdgm
`jxwjc`j
akyvkbak
bhzuhabh
ci{ti`ci
|vdkv|v
}wejw~}w
~tfit}~t
ughu|u
xr`or{xr
jdr{dojd
igqxglig
hfpyfmhf
oaw~ajoa
n`v`kn`
mcu|chmc
lbt}bilb
cm{rmfcm
blzslgbl
aoypodao
`nxqne`n
givibgi
fh~whcfh
ek}tk`ek
dj|ujadj
{ucju~{u
ztbktzt
ywahw|yw
xv`iv}xv
qgnqzq
kesxelke
hfp{fohf
igqzgnig
n`v}`in`
oaw|ahoa
lbtbklb
mcu~cjmc
blzqlebl
cm{pmdcm
`nxsng`n
aoyrofao
fh~uhafh
giti`gi
dj|wjcdj
ek}vkbek
ztbit}zt
{uchu|{u
xv`kvxv
ywajw~yw
~pfmpy~p
hbpybmhb
kaszanka
j`r{`oj`
mgu|ghmg
lft}filf
oew~ejoe
ndvdknd
akypkdak
`jxqje`j
ci{rifci
bhzshgbh
eo}to`eo
dn|unadn
gmvmbgm
fl~wlcfl
ysahs|ys
xr`ir}xr
{qcjq~{q
zpbkpzp
}welwx}w
icqvcjic
j`ru`ij`
kastahka
lftsfolf
mgurgnmg
ndvqdmnd
oewpeloe
`jxjc`j
aky~kbak
bhz}habh
ci{|i`ci
dn|{ngdn
eo}zofeo
fl~ylefl
gmxmdgm
xr`gr{xr
ysafszys
zpbepyzp
{qcdqx{q
|vdcv|v
f`nw`kf`
ecmtchec
dblubidb
cekrence
bdjsdobd
agipglag
`fhqfm`f
oig~iboi
nhfhcnh
mke|k`mk
ljd}jalj
kmczmfkm
jlb{lgjl
ioaxodio
hn`ynehn
wqfqzwq
vp~gp{vp
us}dsxus
tr|erytr
su{bu~su
gaotahga
dblwbkdb
ecmvcjec
bdjqdmbd
cekpelce
`fhsfo`f
agirgnag
nhf}hanh
oig|i`oi
ljdjclj
mke~kbmk
jlbylejl
kmcxmdkm
hn`{nghn
ioazofio
vp~epyvp
wqdqxwq
tr|gr{tr
us}fszus
rtzat}rt
d^lu^id^
g]ov]jg]
fnwkf
a[ip[la[
`ZhqZm`Z
cYkrYncY
bXjsXobX
mWe|W`mW
lVd}ValV
oUg~UboU
nTfTcnT
iSaxSdiS
hR`yRehR
kQczQfkQ
jPb{PgjP
uO}dOxuO
tN|eNytN
wMfMzwM
vL~gL{vL
qKy`K|qK
e_mr_fe_
fnqef
g]op]dg]
`ZhwZc`Z
a[iv[ba[
bXjuXabX
cYktY`cY
lVd{VolV
mWezWnmW
nTfyTmnT
oUgxUloU
hR`RkhR
iSa~SjiS
jPb}PijP
kQc|QhkQ
tN|cNwtN
uO}bOvuO
vL~aLuvL
wM`MtwM
pJxgJspJ
bjsgb
a_ip_da_
`^hq^e`^
gYovYbgY
fXnwXcfX
e[mt[`e[
dZluZadZ
kUczUnkU
jTb{TojT
iWaxWliW
hV`yVmhV
oQg~QjoQ
nPfPknP
mSe|ShmS
lRd}RilR
sM{bMvsM
rLzcLwrL
qOy`OtqO
pNxaNupN
wIfIrwI
c]kp]dc]
`^hs^g`^
a_ir_fa_
fXnuXafX
gYotY`gY
dZlwZcdZ
e[mv[be[
jTbyTmjT
kUcxUlkU
hV`{VohV
iWazWniW
nPf}PinP
oQg|QhoQ
lRdRklR
mSe~SjmS
rLzaLurL
sM{`MtsM
pNxcNwpN
qOybOvqO
vH~eHqvH
`ZhqZe`Z
cYkrYfcY
bXjsXgbX
e_mt_`e_
d^lu^ad^
g]ov]bg]
fnwcf
iSaxSliS
hR`yRmhR
kQczQnkQ
jPb{PojP
mWe|WhmW
lVd}VilV
oUg~UjoU
nTfTknT
qKy`KtqK
pJxaJupJ
sI{bIvsI
rHzcHwrH
uO}dOpuO
a[in[ba[
bXjmXabX
cYklY`cY
d^lk^gd^
e_mj_fe_
fnief
g]oh]dg]
hR`gRkhR
iSafSjiS
jPbePijP
kQcdQhkQ
lVdcVolV
mWebWnmW
nTfaTmnT
oUg`UloU
pJxJspJ
qKy~KrqK
rHz}HqrH
sI{|IpsI
tN|{NwtN
^XfoXc^X
][el[`][
ZdmZaZ
[]cj]f[]
ZbkgZ
Y_ah_dY_
X^`i^eX^
WQofQjWQ
VPngPkVP
USmdShUS
TRleRiTR
SUkbUnSU
RTjcToRT
QWi`WlQW
PVhaVmPV
OIw~IrOI
NHvHsNH
MKu|KpMK
LJt}JqLJ
KMszMvKM
_YglY`_Y
ZdoZcZ
][en[b][
ZbieZ
[]ch]d[]
X^`k^gX^
Y_aj_fY_
VPnePiVP
WQodQhWQ
TRlgRkTR
USmfSjUS
RTjaTmRT
SUk`UlSU
PVhcVoPV
QWibWnQW
NHv}HqNH
OIw|IpOI
LJtJsLJ
MKu~KrMK
JLryLuJL
VdmVaV
_UgnUb_U
^TfoTc^T
YSahSdYS
XR`iReXR
[QcjQf[Q
ZPbkPgZP
U_md_hU_
T^le^iT^
W]of]jW]
VngkV
Q[i`[lQ[
PZhaZmPZ
SYkbYnSY
RXjcXoRX
MGu|GpMG
LFt}FqLF
OEw~ErOE
NDvDsND
ICqxCtIC
]WejW^]W
^TfiT]^T
_UghU_U
XR`oR[XR
YSanSZYS
ZPbmPYZP
[QclQX[Q
T^lc^WT^
U_mb_VU_
VnaUV
W]o`]TW]
PZhgZSPZ
Q[if[RQ[
RXjeXQRX
SYkdYPSY
LFt{FOLF
MGuzGNMG
NDvyDMND
OEwxELOE
HBpBKHB
ZTbkT_ZT
YWahWYW
XV`iV]XV
_QgnQZ_Q
^PfoP[^P
]SelSX]S
RdmRYR
S]kb]VS]
RjcWR
Q_i`_TQ_
P^ha^UP^
WYofYRWY
VXngXSVX
U[md[PU[
TZleZQTZ
KEszENKE
JDr{DOJD
IGqxGLIG
HFpyFMHF
OAw~AJOA
[UchU[U
XV`kV_XV
YWajW^YW
^PfmPY^P
_QglQX_Q
RdoR[R
]SenSZ]S
RjaUR
S]k`]TS]
P^hc^WP^
Q_ib_VQ_
VXneXQVX
WYodYPWY
TZlgZSTZ
U[mf[RU[
JDryDMJD
KEsxELKE
HFp{FOHF
IGqzGNIG
N@v}@IN@

Dlaulatwienia wynik pogrubilem :]

Tak wynikiem i haslem jest "kaszanka"
Jak widzicie tutaj utrudnieniem jest liczba kombinacji :]


Ale skoro juz mowilismy o metodzie slownikowej to czemu by jej nie przyblizyc :] ??

Agresor bardzo czesto wie cos o hasle. naprawde zadko jest ze nie wiemy nic :]
Najczesciej znamy dlugosc ( mowie o szyfrach nie mylcie tego z hashami !!! )
nieraz znaki sie powtarzaja
I co najwazniejsze nieraz znamy polozenie niektorych znakow :]
pokaze na przykladzie:



procedure TForm1.Button2Click(Sender: TObject);
var
i,i2: integer;
slowo : string;
begin
ilosc := 0;
for i := 0 to length(memo1.Text) do begin
slowo := memo1.Lines.Strings[i];
if length(slowo) <> 8 then break; // Znamy dlugosc slowa!!!
ilosc := ilosc +1;
form1.Caption:=currtostr(ilosc) + ' z ' + currtostr(licz);
sleep(1);
label1.Caption:='Ostatni wyraz : ' + slowo;
    for i2 := 1 to length(slowo) do begin
    application.ProcessMessages;
        if (slowo[1] ='s') and (slowo[4] ='s') and (slowo[7] ='d') then begin // Znamy polozenie niektorych znakow !!!
        memo2.Lines.Add(slowo);
        end;
    end; // do 2
end;// 1
end;



W kodzie tym jak widzicie znamy dlugosc slowa:
if length(slowo) <> 8 then break;
oraz polozenie niektorych liter:
1 miejsce = s
4 miejsce = s
7 miejsce = d

w ten sposob praktycznie ograniczylismy sobie haslo do kilu slow :]

Ok to na tyle :]
1 i 2 artykulo lamaniach szyfrow i hasel jest najprostszy :]
teraz juz zajmiemy sie znacznie trudniejszymi problemami.

najczesciej sa to problemy z odgadnieciem algorytmu.
No ale o tym w nastepnym arcie :]






Tagi: szyfrowanie

skomentuj (0)

lamanie szyfrow czę¶ć1 2009-07-26 19:47:48

Witam :D
Przedstawiam wam rozne proste metody deszyfrowania zaszyfrowanych hasel ;]
( hashami zajme sie w nastepnym artykule )

Ale zacznijmy od poczatku.
Szyfry dzielimy na 3 czesci
-szyfry asymetryczne
-symetryczne szyfry blokowe
-symetryczne szyfry strumieniowe

Kryptografia asymetryczna - to rodzaj szyfrowania w ktorym uzywa sie co najmniej dwoch kluczy.
W rzeczywistosci klucze te nazywa sie kluczami prywatnymi oraz publicznymi. Wartosci tych kluczy moga byc identyczne badz rozne. Wynik jednak zawsze jest ten sam.
Jak mozna sie domyslec im trudniejsze dzialanie matematyczne tym trudniej zlamac szyfr ( a nawet go odkodowac )


Szyfr/Kod blokowy - Jest nieetypowy ze wzgledu na swoja budowe. Ma on dwie podstawy matematyczne sa nimi zmienna "n" i zmienna "k".
n - Dlugosc slowa kodowanego
k - dlugosc czesci informacyjnej

dziala to tak
szyfrogram = wiadomosc [dzialanie] klucz
dekodowanie
wiadomosc = klucz [dzialanie] szyfrogram


Szyfr strumieniowy - chyba najbardziej zlozony.
Szyfr opiera sie na wytworzeniu strumienia i nastepnie xoruje go z szyfrogramem
Odkodowanie wymaga znajomosci dokladnie tego samego klucza jakim kodowano dane.

Przejdzmy moze do praktyki bardzo prostej na poczatek.

Zwykle przesuniecie w alfabecie. Bede wam pokazywal "¶wiat" z oczu kodera ktory tworzy algorytm oraz z oczu hackera / crackera ( nazwijcie to jak chcecie ) ktory lamie dany szyfr i jak to mozna robic za pomoca jezyka programowania :]

SESJA 1
Naszym celem jest stworzenie algorytmu ktory przesuwa znak w alfabecie łacińskim.
Sa to znaki : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Jest ich 26.
Programista w ten sposob ogranicza sobie pole popisu bo nie moze uzyc znakow innych niz sa w alfabecie. Czyli pomija wiekszosc znakow z tablic ASCII. Ma to jednak swoje zalety gdyz jest to sposob wzmacniajacy niepokoj u agresora gdyz on sam nie wie z ilu liter korzysta programista. ( gdyby szyfrogram zawieral znaki / krzaczki oznaczaloby to ze najprawdopodbniej korzysta sie z calej tablicy ASCII )
A skoro uzywamy alfabetu ( my wiemy jakiego ale agresor nie ) to wlasnie hacker moze miec problem z odgadnieciem alfabetu ( co latwo jednak ustalic bo wystarczy zaszyfrowac ze 100 slow danym algorytmem i odrazu widac jakie znaki sa uzywane a jakie nie ) niemniej wprowadza to jednak kolejne dzialania.
Ok mamy alfabet i wiemy ze chcemy przesuwac znaki.
Poniewaz jest to 1 przyklad uzyjemy tylko jednej metody matematycznej i bedzie nia dodawanie )
a wiec kod zrodlowy programu szyfrujacego



procedure TForm1.Button1Click(Sender: TObject);
var
i,i2,liczba : integer;
znak : string[1]; // string z 1 miejscem mozna go zastapic zmienna char
begin
for i := 1 to length(edit1.Text) do begin
znak := edit1.Text[i];   // pobieranie znaku
liczba := ord(znak[1]);      // zamiana na liczbe
   for i2 := 1 to strtoint(edit2.Text) do begin
   liczba := liczba + 1; // przesuwamy o 1
   if liczba > 122 then liczba := 97 // jesli przekracza alfabet to od nowa leci
   end; // petla szyfrujaca
memo1.Text := memo1.Text + chr(liczba);
end; // petla pobiera kazdy znak z hasla
end;



Aby oszczcedzic miejsca na wyjasnienia w kodzie dalem komentarze ktore chyba wszystko tlumacza :] jesli cos niejasne to pisac :]

przykladowe slowa:
Słowo : Hackerzy
klucz : 5
zaszyfrowane na : Mfhpjwed

słowo : Forum
klucz : 7
zaszyfrowane na : mvybt

słowo : ciekawostka
klucz : 105
zaszyfrowane na : djflbxptulb

Ok jak widac wszystko pieknie dziala :]
Jak to odszyfrowac ????
Zalozmy na przykladzie slowa "ciekawostka".
Klucza nieznamy. Obstawiamy ze na naszym alfabecie to jest bo nie widac tu zadnych krzaczkow.
Czyli juz jedno mamy. Musimy korzystac z tylko 26 znakow.
kolejna sprawa to widzimy ze długo¶ć hasła ( ktore hacker moze sam sobie zalozyc nawet po n razy ) jest taka sama jak długo¶ć zaszyfrowanej wiadomosci :)
A to już baaardzo dużo :]

Odkodowanie tego metoda brute force nie ma za bardzo sensu. Jest kompletnie nie praktyczne poniewaz mozemy to zrobic znacznie prosciej :]
hmmm no tak skoro wiemy ze znakow jest 26 i najprawdopodobniej operujemy na alfabecie to poprostu pojedzmy
to 26 roznymi metodami. Jest to smieszna ilosc.
A wiec kod hackera ktory lamie haslo:


procedure TForm1.Button2Click(Sender: TObject);
var
i,i2,liczba,i3 : integer;
znak : string[1];
odkodowane : string;
begin
for i := 1 to 26 do begin
   for i2 := 1 to length(memo1.Text) do begin
   znak := memo1.Text[i2];
   liczba := ord(znak[1]);
      for i3 := 1 to i do begin
      liczba := liczba + 1;
      if liczba > 122 then liczba := 97;
      end; // petla przesuwajaca
   memo2.Text := memo2.Text + chr(liczba);
   end; // pobieranie znaku w tej petli i proba odszyfrowania
   memo2.Lines.Add('');
end; // petla probujaca 26 kombinacji

end;


jak widzicie budowa nieco inna :] Ale co to nam da ?? hehe oczywiscie daje nam to 26 roznych "odkodowanych" hasel :)
Oczywiscie tylko jedno z nich jest prawidlowe.

Na przykladzie slowa : "ciekawostka" wyglada to tak:

ekgmcyquvmc
flhndzrvwnd

gmioeaswxoe
hnjpfbtxypf
iokqgcuyzqg
jplrhdvzarh
kqmsiewabsi
lrntjfxbctj
msoukgycduk
ntpvlhzdevl
ouqwmiaefwm
pvrxnjbfgxn
qwsyokcghyo
rxtzpldhizp
syuaqmeijaq
tzvbrnfjkbr
uawcsogklcs
vbxdtphlmdt
wcyeuqimneu
xdzfvrjnofv
yeagwskopgw
zfbhxtlpqhx
agciyumqriy
bhdjzvnrsjz
ciekawostka
djflbxptulb

Widzicie :] ?? Na przedostatnim miejscu znajduje sie JEDYNE LOGICZNE slowo :] i jest to nasze haslo.
Przejrzenie reczne nie sprawia tu w sumie zadnego problemu :]
Ale powiedzmy ze jestesmy ambitni i chcemy poznac jeszcze klucz :]

Do naszego kodu dodamy jeszcze jedna linijke.
Zauwazcie
ciekawostka : djflbxptulb

widzicie ??
nie ? :) to jeszcze lepiej wam to pokaze :]
c i e k a w o s t k a
d j f l b x p t u l b

A teraz :D ?
Tak klucz tu widac golym okiem :] przesuniecie = 1
Zauwazcie ze nasz klucz wynosil 105 a tu wychodzi 1 :] Spwoodowane jest to oczywiscie petlami ktore ograniczaja ruch liczba od 97 do 122 :] dlatego do jedengo slowa pasuje nieskonczenie wiele kluczy.

ok widzimy ze "c" = "d" a wiec dodajemy jedna linijke kodu:



if (chr(liczba) = 'd') and (i2 = 1) then showmessage('Klucz to ' + inttostr(i));

I wychodzi nam znow inny klucz ktory jest rowny 26 :] wartosc jednak nie ma znaczenia tylko wynik koncowy a w tym szyfrowaniu tak jak napisalem juz wczesniej kluczy jest nieskonczenie wiele niemniej nie kazdy pasuje :]

W ten sposob mozemy zlamac szyfr ktory operuje na przesunieciach :] ( nie tylko alfabetu ) ale ogolnie na wszelkich przeroznych znakach. I wcale nie musza to byc tablice ASCII, ANSII czy alfabet.

Ok był zdecydowanie NAJPROSTSZY z szyfrow :] Poziom mozna powiedziec lame ale daje go odrazu ( ten artykul ) bo niechce mieszac algorytmow i wszystko dac w jednym :]
bede pisal po kolei jak lamac kolejne szyfry i jak je pisac.
Co art to wyzszy poziom :]
Bedziemy przechodzic od 1 do 3 etapu kodowac tekstu itd.

Mysle ze to bardzo ciekawe i sie moze przydac. Tu widzicie najprostsza metode szyfrowania ktora jak widzicie do zlamania jest w sekunde :P
( nawet gdyby to bylo ascii )

Pozdrawiam w nastepnych artach gotowe algorytmy oraz strumienie xorowanie i przesuniecia bitow :]



Tagi: szyfrowanie

skomentuj (0)

[delphi]Szyfr idealny 2009-07-26 19:41:57

Witam :]
Dzi¶ wam pokaze "szyfr idealany". A przynajmniej bardzo podobny do szyfru Vernama. Jak wiecie szyfr Vernama charakteryzuje sie unikalnym kluczem dla kazdego znaku. Kazdy znak ma JEDEN NIEPOWTARZALNY klucz.
Co nam to daje ??
Zauzmy ze mamy 30 literowy tekst do zakodowania i kodujemy szyfrem Vernama.
Agresor chcac zlamac szyfr i poznac tajna wiadmosci o dlugosci 30 znakow na 30 literowym alfabecie bedzie musial przeanalizowac dokladnie 265252859812191058636308480000000 kombinacji. Zaluzmy ze na domowym komputerze 4 literowe haslo operujace na 30 znakowym alfabecie jest lamane w 1 minute. Wtedy 10 literowe slowo skladajace sie z 30 znakowego alfabetu bedzie lamane na tym samym komputerze w okolo 12 lat i 6 miesiecy. ( mowimy oczywiscie o brute force operujacym na szyfrowaniu Vernama a kombinacji przy 10 literowym slowie jest : 109027350432000)

ja natomiast niechcac korzystac bezposrednio z tego algorytmu uzylem metody nieco innej. Zamiast dla kazdego znaku przypisywac jeden niepowtarzalny klucz napisalem algorytm losujacy z pewnego przedzialu ( przedzial zalezy od dlugosci szyfrowanego tekstu ) dla kazdego znaku taka sama wartosc losujaca co daje nam nieobliczalne wyniki ktore moga wygladac dla slowa 10 literowego tak:
1111111111
albo
1234567890
A wiec szyfr Vernama i losowanie w jednym :) daje nam to dokladnie 590490000000000 kombinacje dla 10 literowego slowa. Zlamanie szyfry wtedy przedluza nam sie 5-krotnie. czyli 10 literowe slowo bedzie lamane normalna metoda brute force w zaokragleniu 60 lat :]

Wszystko zalzy od dlugosci slowa. Dlatego moj szyfr jest "idealny" dla osob chcacych wysylac zdaniowe lancuchy gdyz male slowa beda lamane dosc szybko. Dlaczego ?
Dlatego ze slowo np " polaczek" ma w sobie 8 znakow. Oznacza to ze program bedzie losowal liczby od 0 do 7 dla kazdego znaku ( w szyfrze Vernama wylosowane liczby nie moglyby sie powtorzyc )
Moj programik pisalem od tak na szybko i robilem poprostu dodawanie czyli przesuniecie znakow w alfabecie. Moznaby to xorowac , przesuwac bity w prawo lub lewo , mnozyc i dzielic cokolwiek.
Dodatkowo zrobilem mozliwosci przesuwania kazdego znaku z osobna w prawo i lewo zaleznie od wylosowanej wartosci.
Dlatego gdy agresor zna algorytm wie ze slowo "polaczek" operuje na 7 znakach w lewo i prawo dla kazdego znaku z oosbna. Agreosr wtedy moze znalezc sobie dwa skrajne znaki w tym przypadku to ; 97 i 122 czyli w sumie caly alfabet :) ale bez liczb daje nam to 25 znakow na 8 literowym slowie. Jest to : 152587890625 kombinacji :]
Na oko daje nam to jakies 1.5 roku lamania meotda brute force.
Teraz wyobrazcie sobie normalne zdanie szyfrujace moim algorytmem :P albo np wlasnie ten temat :) Odszyfrowanie go byloby niemozliwe w praktyce chyba ze bysmy przjeli doslowanie machine wojenna komputerow i wszystkie by lamaly szyfr :)

Szyfr jest tak dlugo lamany ze wzgledu na wielkosc alfabetu oraz losowosc klucza dla kazdego znaku. Klucz moze sie powtarzac ( czyli nie tak jak w szyfrze Vernama ) co wplywa na wieksza liczbe kombinacji :)
Ok teraz pokaze wam kod:



procedure TForm1.Button1Click(Sender: TObject);
var
i,i2 : integer;
los,liczba,los2 : integer;
slowo : string;
begin
randomize;
memo1.Text := AnsiLowerCase(memo1.Text);
showmessage(inttostr(length(memo1.Text)));
for i := 1 to length(memo1.Text) do begin
slowo := memo1.Text[i];
los := random(2);
if slowo = ' ' then begin
memo2.Text := memo2.Text + ' ';
end else begin

if los = 0 then begin
los2 := random(length(memo1.Text));
liczba := ord(slowo[1]);
   for i2 := 1 to los2 do begin
   if liczba > 122 then
   liczba := 97;
   liczba := liczba + 1;
   end; // do petli i2
memo3.Lines.Add('Znak ' + inttostr(i) + 'kodowany jest kluczem : +' + inttostr(los2));
memo2.Text := memo2.Text + char(liczba);
end; // do warunku

if los = 1 then begin
los2 := random(length(memo1.Text));
liczba := ord(slowo[1]);
   for i2 := 1 to los2 do begin
   if liczba < 97 then
   liczba := 122;
   liczba := liczba - 1;
   end; // do petli i2
memo3.Lines.Add('Znak ' + inttostr(i) + 'kodowany jest kluczem : -' + inttostr(los2));
memo2.Text := memo2.Text + char(liczba);
end;
end; // do warunku


end;  // do 1





end;


Minusy tego kodu ??
- spacja jest nieszyforwana.
- Nie mozna uzywac znakow specialnych tylko same litery alfabetu

Czyli jesli bym mial troche wiecej czasu wystarczy dopisac troche linijek kodu i wiooo :) mamy prawdziwa kolumbrynke szyfrujaca xD
osoba szyfrujaca tekst wie jaki znak jakim kluczem byl szyfrowany i w ktora strone wtedy tylko trzeba podac wszystkie klucze odbiorcy i zlamie szyfr w niecala sekunde :P Agresor zas jak wczesniej pisalem bedzie musial sie mocno nameczyc :) Oczcywiscie w pelni program musialby byc zabezpieczony przed desammbleracja oraz przejeciem komuniaktow dla pelnego bezpieczenstwa jednak ja tylko chcialem wam pokazac algorytm no i tyle :]

Aha taki maly przyklad :
Zdanie :Wlasnie jestem na forum hackinq i sobie pisze temat
Po zaszyfrowaniu wyglada tak:
jnwexlc xrpbgs em krqnp tegqolm l lhwll lpspz cqbpy

Agresor jedyne co wie odrazu to dlugosc zdania :) co daje mu jedynie pojecie o dlugosci lamania.
klucze to :

Cytat:Znak 1kodowany jest kluczem : +13
Znak 2kodowany jest kluczem : +28
Znak 3kodowany jest kluczem : -4
Znak 4kodowany jest kluczem : +12
Znak 5kodowany jest kluczem : +10
Znak 6kodowany jest kluczem : -23
Znak 7kodowany jest kluczem : +24
Znak 9kodowany jest kluczem : +14
Znak 10kodowany jest kluczem : -39
Znak 11kodowany jest kluczem : -29
Znak 12kodowany jest kluczem : +8
Znak 13kodowany jest kluczem : -50
Znak 14kodowany jest kluczem : +32
Znak 16kodowany jest kluczem : +43
Znak 17kodowany jest kluczem : -40
Znak 19kodowany jest kluczem : -21
Znak 20kodowany jest kluczem : -23
Znak 21kodowany jest kluczem : -27
Znak 22kodowany jest kluczem : -33
Znak 23kodowany jest kluczem : +3
Znak 25kodowany jest kluczem : +12
Znak 26kodowany jest kluczem : -48
Znak 27kodowany jest kluczem : -48
Znak 28kodowany jest kluczem : -46
Znak 29kodowany jest kluczem : -20
Znak 30kodowany jest kluczem : -28
Znak 31kodowany jest kluczem : -4
Znak 33kodowany jest kluczem : -23
Znak 35kodowany jest kluczem : -33
Znak 36kodowany jest kluczem : -33
Znak 37kodowany jest kluczem : -5
Znak 38kodowany jest kluczem : -23
Znak 39kodowany jest kluczem : +7
Znak 41kodowany jest kluczem : +22
Znak 42kodowany jest kluczem : +7
Znak 43kodowany jest kluczem : -26
Znak 44kodowany jest kluczem : -10
Znak 45kodowany jest kluczem : +47
Znak 47kodowany jest kluczem : -17
Znak 48kodowany jest kluczem : -40
Znak 49kodowany jest kluczem : -11
Znak 50kodowany jest kluczem : +15
Znak 51kodowany jest kluczem : +5

Aha gdybysmy chcieli napisac szyfr Vernama dokladnie to wystarczy dodac do mojego kodu tylko jedna etykietke i funkcje goto :) no i petelka i jazda :]


I tyle mam nadzieje ze art sie podoba i sie przyda :)






Tagi: delphi, szyfrowanie

skomentuj (0)

[delphi] brute force MD5 2009-07-26 19:34:10

Witam :]
Dosc dlugo nad tym pracowalem wspomagalem sie googlami itd Tongue
Ale w koncu sie udalo :] Algorytm md5 BEZ dodatkowych komponentow Smile
( na googlach widzialem tylko same gotowe komponenty czyli samo dno ).

Dodatkowo oczywiscie napisalem prosty brute force do md5 dzieki czemu nasze hashe bedzie mozna latwo zlamac Smile
Oczywiscie moznaby tez uzyc slownika Smile

A wiec kod:



var
  Form1: TForm1;
  stopa : boolean = false;
const
    wersja         = 102;
{$Q-}
{$R-}

type
    tmd5rekord = record
        stan: array[0..3] of LongInt;
        liczenie: array[0..1] of LongInt;
        case Integer of
        0: (znakbuf: array[0..63] of Byte);
        1: (dlugoscbuf: array[0..15] of LongInt);
    end;
    tmd5tab = array[0..15] of Char;

procedure md5i(var md5tekst: TMD5rekord);
procedure dodatek(var MD5tekst: TMD5rekord;
                    const Data;
                    Len: Integer);
procedure transformacja(var buftab: array of LongInt;
                       const Data: array of LongInt);
procedure md5buff(var MD5tekst: TMD5rekord;
                          buffor: Pointer;
                          rozmiar: Integer);
procedure md5koniec(var krotko: TMD5tab; var MD5tekst: TMD5rekord);

function ostatecznie(Buffor: Pointer; rozmiar: Integer): string;
function koncowemd5(Buffor : String): string;
implementation

{$R *.dfm}




const
    maksymalnie = 16384;

type
    PMD5Bufor = ^TMD5Bufor;
    TMD5Bufor = array[0..(maksymalnie - 1)] of Char;


procedure MD5i(var MD5tekst: TMD5rekord);
begin
    FillChar(MD5tekst, SizeOf(TMD5rekord), #0);
    with MD5tekst do begin
        stan[0] := LongInt(452301);
        stan[1] := LongInt($EFCDAB89);
        stan[2] := LongInt(BADCFE);
        stan[3] := LongInt(325476);
    end
end;


procedure dodatek(var MD5tekst: TMD5rekord; const Data; Len: Integer);                        
type
    bajty = array[0..0] of Byte;
var
    spis: Word;
    T: LongInt;
begin
    with MD5tekst do begin
        T := liczenie[0];
        Inc(liczenie[0], LongInt(Len) shl 3);
        if liczenie[0] < T then
            Inc(liczenie[1]);
        Inc(liczenie[1], Len shr 29);
        T := (T shr 3) and F;
        spis := 0;
        if T <> 0 then begin
            spis := T;
            T := 64 - T;
            if Len < T then begin
                Move(Data, znakbuf[spis], Len);
                Exit;
            end;
            Move(Data, znakbuf[spis], T);
            transformacja(stan, dlugoscbuf);
            Dec(Len, T);
            spis := T;  
        end;
        while Len >= 64 do begin
            Move(bajty(Data)[spis], znakbuf, 64);
            transformacja(stan, dlugoscbuf);
            Inc(spis, 64);
            Dec(Len, 64);
        end;
        Move(bajty(Data)[spis], znakbuf, Len);
    end
end;



procedure MD5koniec(var krotko: TMD5tab; var MD5tekst: TMD5rekord);
var
    Cnt : Word;
    P   : Byte;
begin
    with MD5tekst do begin
        Cnt := (liczenie[0] shr 3) and F;
        P := Cnt;
        znakbuf[P] := ;
        Inc(P);
        Cnt := 64 - 1 - Cnt;
        if Cnt < 8 then begin
            FillChar(znakbuf[P], Cnt, #0);
            transformacja(stan, dlugoscbuf);
            FillChar(znakbuf, 56, #0);
        end
        else
            FillChar(znakbuf[P], Cnt - 8, #0);
        dlugoscbuf[14] := liczenie[0];
        dlugoscbuf[15] := liczenie[1];
        transformacja(stan, dlugoscbuf);
        Move(stan, krotko, 16)
    end;
    FillChar(MD5tekst, SizeOf(TMD5rekord), #0)
end;


procedure transformacja(var Buftab: array of LongInt;const Data: array of LongInt);
var
    A, B, C, D: LongInt;

    procedure jazda1(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Z xor (X and (Y xor Z))) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure jazda2(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Y xor (Z and (X xor Y))) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure jazda3(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (X xor Y xor Z) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure jazda4(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Y xor (X or not Z)) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;
begin
    A := Buftab[0];
    B := Buftab[1];
    C := Buftab[2];
    D := Buftab[3];

    jazda1(A, B, C, D, Data[ 0] + LongInt($d76aa478),  7);
    jazda1(D, A, B, C, Data[ 1] + LongInt($e8c7b756), 12);
    jazda1(C, D, A, B, Data[ 2] + LongInt(2070db), 17);
    jazda1(B, C, D, A, Data[ 3] + LongInt($c1bdceee), 22);
    jazda1(A, B, C, D, Data[ 4] + LongInt($f57c0faf),  7);
    jazda1(D, A, B, C, Data[ 5] + LongInt(87c62a), 12);
    jazda1(C, D, A, B, Data[ 6] + LongInt($a8304613), 17);
    jazda1(B, C, D, A, Data[ 7] + LongInt($fd469501), 22);
    jazda1(A, B, C, D, Data[ 8] + LongInt(8098d8),  7);
    jazda1(D, A, B, C, Data[ 9] + LongInt(b44f7af), 12);
    jazda1(C, D, A, B, Data[10] + LongInt($ffff5bb1), 17);
    jazda1(B, C, D, A, Data[11] + LongInt(5cd7be), 22);
    jazda1(A, B, C, D, Data[12] + LongInt(b901122),  7);
    jazda1(D, A, B, C, Data[13] + LongInt($fd987193), 12);
    jazda1(C, D, A, B, Data[14] + LongInt($a679438e), 17);
    jazda1(B, C, D, A, Data[15] + LongInt(b40821), 22);

    jazda2(A, B, C, D, Data[ 1] + LongInt($f61e2562),  5);
    jazda2(D, A, B, C, Data[ 6] + LongInt($c040b340),  9);
    jazda2(C, D, A, B, Data[11] + LongInt(5e5a51), 14);
    jazda2(B, C, D, A, Data[ 0] + LongInt($e9b6c7aa), 20);
    jazda2(A, B, C, D, Data[ 5] + LongInt($d62f105d),  5);
    jazda2(D, A, B, C, Data[10] + LongInt(441453),  9);
    jazda2(C, D, A, B, Data[15] + LongInt($d8a1e681), 14);
    jazda2(B, C, D, A, Data[ 4] + LongInt($e7d3fbc8), 20);
    jazda2(A, B, C, D, Data[ 9] + LongInt(e1cde6),  5);
    jazda2(D, A, B, C, Data[14] + LongInt($c33707d6),  9);
    jazda2(C, D, A, B, Data[ 3] + LongInt($f4d50d87), 14);
    jazda2(B, C, D, A, Data[ 8] + LongInt(5a14ed), 20);
    jazda2(A, B, C, D, Data[13] + LongInt($a9e3e905),  5);
    jazda2(D, A, B, C, Data[ 2] + LongInt($fcefa3f8),  9);
    jazda2(C, D, A, B, Data[ 7] + LongInt(6f02d9), 14);
    jazda2(B, C, D, A, Data[12] + LongInt(d2a4c8a), 20);

    jazda3(A, B, C, D, Data[ 5] + LongInt($fffa3942),  4);
    jazda3(D, A, B, C, Data[ 8] + LongInt(71f681), 11);
    jazda3(C, D, A, B, Data[11] + LongInt(d9d6122), 16);
    jazda3(B, C, D, A, Data[14] + LongInt($fde5380c), 23);
    jazda3(A, B, C, D, Data[ 1] + LongInt($a4beea44),  4);
    jazda3(D, A, B, C, Data[ 4] + LongInt(bdecfa9), 11);
    jazda3(C, D, A, B, Data[ 7] + LongInt($f6bb4b60), 16);
    jazda3(B, C, D, A, Data[10] + LongInt($bebfbc70), 23);
    jazda3(A, B, C, D, Data[13] + LongInt(9b7ec6),  4);
    jazda3(D, A, B, C, Data[ 0] + LongInt($eaa127fa), 11);
    jazda3(C, D, A, B, Data[ 3] + LongInt($d4ef3085), 16);
    jazda3(B, C, D, A, Data[ 6] + LongInt(881d05), 23);
    jazda3(A, B, C, D, Data[ 9] + LongInt($d9d4d039),  4);
    jazda3(D, A, B, C, Data[12] + LongInt($e6db99e5), 11);
    jazda3(C, D, A, B, Data[15] + LongInt(fa27cf8), 16);
    jazda3(B, C, D, A, Data[ 2] + LongInt($c4ac5665), 23);

    jazda4(A, B, C, D, Data[ 0] + LongInt($f4292244),  6);
    jazda4(D, A, B, C, Data[ 7] + LongInt(2aff97), 10);
    jazda4(C, D, A, B, Data[14] + LongInt($ab9423a7), 15);
    jazda4(B, C, D, A, Data[ 5] + LongInt($fc93a039), 21);
    jazda4(A, B, C, D, Data[12] + LongInt(5b59c3),  6);
    jazda4(D, A, B, C, Data[ 3] + LongInt(f0ccc92), 10);
    jazda4(C, D, A, B, Data[10] + LongInt($ffeff47d), 15);
    jazda4(B, C, D, A, Data[ 1] + LongInt(845dd1), 21);
    jazda4(A, B, C, D, Data[ 8] + LongInt(fa87e4f),  6);
    jazda4(D, A, B, C, Data[15] + LongInt($fe2ce6e0), 10);
    jazda4(C, D, A, B, Data[ 6] + LongInt($a3014314), 15);
    jazda4(B, C, D, A, Data[13] + LongInt(e0811a1), 21);
    jazda4(A, B, C, D, Data[ 4] + LongInt($f7537e82),  6);
    jazda4(D, A, B, C, Data[11] + LongInt($bd3af235), 10);
    jazda4(C, D, A, B, Data[ 2] + LongInt(ad7d2bb), 15);
    jazda4(B, C, D, A, Data[ 9] + LongInt($eb86d391), 21);

    Inc(Buftab[0], A);
    Inc(Buftab[1], B);
    Inc(Buftab[2], C);
    Inc(Buftab[3], D);
end;


procedure MD5buff(var MD5tekst: TMD5rekord;Buffor: Pointer;rozmiar: Integer);
var
    wskaznik : PMD5Bufor;
    buforta : PChar;
    bajty1  : Word;
begin
    New(wskaznik);
    Buforta := Buffor;
    try
        repeat
            if rozmiar > maksymalnie then
                bajty1 := maksymalnie
            else
                bajty1 := rozmiar;
            Move(Buforta^, wskaznik^, bajty);
            Inc(Buforta, bajty);
            Dec(rozmiar, bajty);
            if bajty > 0 then
                dodatek(MD5tekst, wskaznik^, bajty);
        until bajty < maksymalnie;
    finally
        Dispose(wskaznik);
    end;
end;


function ostatecznie(Buffor: Pointer; rozmiar: Integer): string;
var
    I          : Integer;
    skroty  : TMD5tab;
    zdanie : TMD5rekord;
begin
    for I := 0 to 15 do
        Byte(skroty[I]) := I + 1;
    MD5i(zdanie);
    MD5buff(zdanie, Buffor, rozmiar);
    MD5koniec(skroty, zdanie);
    Result := '';
    for I := 0 to 15 do
        Result := Result + IntToHex(Byte(skroty[I]), 2);
end;


function koncowemd5(Buffor : String): string;
begin
    Result := ostatecznie(@Buffor[1], Length(Buffor));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
alfabet : array[0..35] of string;
i,i2,i3,i4 : integer;
zdanie :string;
begin
stopa := false;
label1.Caption := 'Godzina rozpoczecia : ' + TimeToStr(Time);
alfabet[0] := 'q';
alfabet[1] := 'w';
alfabet[2] := 'e';
alfabet[3] := 'r';
alfabet[4] := 't';
alfabet[5] := 'y';
alfabet[6] := 'u';
alfabet[7] := 'i';
alfabet[8] := 'o';
alfabet[9] := 'p';
alfabet[10] := 'a';
alfabet[11] := 's';
alfabet[12] := 'd';
alfabet[13] := 'f';
alfabet[14] := 'g';
alfabet[15] := 'h';
alfabet[16] := 'j';
alfabet[17] := 'k';
alfabet[18] := 'l';
alfabet[19] := 'z';
alfabet[20] := 'x';
alfabet[21] := 'c';
alfabet[22] := 'v';
alfabet[23] := 'b';
alfabet[24] := 'n';
alfabet[25] := 'm';
alfabet[26] := '0';
alfabet[27] := '1';
alfabet[28] := '2';
alfabet[29] := '3';
alfabet[30] := '4';
alfabet[31] := '5';
alfabet[32] := '6';
alfabet[33] := '7';
alfabet[34] := '8';
alfabet[35] := '9';

for i := low(alfabet) to high(alfabet) do begin
  for i2 := low(alfabet) to high(alfabet) do begin
  if stopa = true then break;
     for i3 := low(alfabet) to high(alfabet) do begin
        for i4 := low(alfabet) to high(alfabet) do begin
        application.ProcessMessages;
        zdanie := alfabet[i] + alfabet[i2] + alfabet[i3] + alfabet[i4];
        label3.Caption := 'Aktualne slowo : ' + zdanie;
        memo1.Lines.Add(Zdanie + ' : ' + koncowemd5(zdanie));
        sleep(1);
        end;
     end;
  end;
end;

label2.Caption := 'Godzina zakonczenia : ' + TimeToStr(Time);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines.SaveToFile('c:hashemd5.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
stopa := true;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Clear;
end;



No jak widzicie kod jest dosc obszerny Smile
funkcje wykorzystane w nim to :
-FillChar
-inc
-move
-dec
-shl - operator logiczny
-shr - operator logiczny
-xor - operator logiczny
-or - operator logiczny
-not - operator logiczny
-new
-dispose

Jakby trzeba bylo cos wyjasnic to pisac :]

Tagi: delphi, hashowanie

skomentuj (1)

[delphi]ROTX - koder maly 2009-07-26 19:31:04

Witam :]
Wczoraj obiecalem ze napisze koder ROT13 ale pomyslalem ze to malo uniwersalne i napisalem ROT(X) xD Czyli przesuniecie w dowolna strone o dowolna ilosc znakow uzywajac jedynie alfabetu lacinskiego.

Czyli jesli ktos by chcial zrobic z tego ROT13 to poprostu sobie koduje to jako "+" i 13 miejsc Smile

Najpierw dam kod a nasstepnie wszystko objasnie a wiec tak:


procedure TForm1.Button1Click(Sender: TObject);
var
s : string;
znak : char;
i,i2,i3,licz : integer;
begin
if wybor.Text = '+' then begin
for i := 0 to memo1.Lines.Count - 1 do begin
s := memo1.Lines.Strings[i];
    for i2 := 1 to length(s) do begin
    znak := s[i2];
    licz := ord(znak);
        for i3 := 0 to strtoint(edit1.Text) do begin
        licz := licz + 1;
          if licz > 122 then
          licz := 97;
        end; // do 3
    znak := char(licz);
    memo2.Text := memo2.Text + znak;
    end; // do 2
end; // do 1
end;

if wybor.Text = '-' then begin
for i := 0 to memo1.Lines.Count - 1 do begin
s := memo1.Lines.Strings[i];
    for i2 := 1 to length(s) do begin
    znak := s[i2];
    licz := ord(znak);
        for i3 := 0 to strtoint(edit1.Text) do begin
        licz := licz - 1;
          if licz < 97 then
          licz := 122;
        end; // do 3
    znak := char(licz);
    memo2.Text := memo2.Text + znak;
    end; // do 2
end; // do 1
end;



I to tyle :] Powiem wam takze ze kod mozna by skrocic nawet :] I to o kilka linijek.
Teraz objaasnie po kolei fragmenty kodu.


if wybor.Text = '+' then begin
for i := 0 to memo1.Lines.Count - 1 do begin
s := memo1.Lines.Strings[i];
    for i2 := 1 to length(s) do begin



Daje odrazu 4 linie bo to wlasnie tu mozna skrocic najbardziej kod Tongue Na poczatku widzimy wybor czy lecimy w lewo czy w prawo a nastepnie program zczytuje linjke a nastepnie kazdy znak po kolei.
Mozna by to zrobic poprostu aby zczytywal kolejny znak bez linii roznicy to zadnej nie robi procz szybkosci dzialania Smile


znak := s[i2];
    licz := ord(znak);


Najpirew zmienna znak pobiera pojedynczy znak z zmiennej s ( jest to tylko jeden znak )
Nastepnie znak zamieniamy na kod ASCII
I tu bardzo wazna rzecz Smile
Jak wiecei ROT13 dziala na alfabecie. Ja w swoim programie moglem dac tablice z kolejnymi znakami alfabetu uznalem jednak ze polecimy standardowa droga i uzyje ASCII ( w programie jednak bardziej uzytkowym i majacym naprawde kodzic za pomoca alfabetu warto uzyc tablicy )
Ok sama budowa tablicy ASCII jest prosta Smile Alfabet jest tam tak fajnie "schowany" ze male litery sa po kolei Smile od 97 do 122 co bardzo ulatwia zadanie.
Jednak tu wazna sprawa. Gdybym chcial kodowac takze duze znaki i liczby musialbym dopisac kilka linijek kodu odrozniajacych je od siebie albo uzyc wspomnianej wczesniej tablicy.


for i3 := 0 to strtoint(edit1.Text) do begin
        licz := licz + 1;
          if licz > 122 then
          licz := 97;
        end; // do 3



Gdy juz mamy liczbe znaku ASCII to uzywamy petli Smile Petla trwa o tyle dlugo o ile uzytkownik chcial przesunac dany tekst.
Za kazdym razem dodajemy + 1 do liczby i gdy osiagnie wiecej niz 122 ( powyzej znaku "z" ) to wraca do punktu wyjscia ( znaku "a" )


znak := char(licz);
    memo2.Text := memo2.Text + znak;
    end; // do 2


No i teraz to juz tylko odkodowac liczbe ASCII i przypisany do niej znak i dopisac go do jakiegos komponentu czy zmiennej jak tam kto woli :]


Kodowanie to jak kazdy zapewne wie latwo zlamac i nie zapewnia zadnego bezpieczenstwa aktualnie ale jak obiecalem ze napisze mini arta to tak robie :]
aha odkodowanie jak latwo sie domyslec przebiega analogicznie

Tagi: delphi, szyfrowanie

skomentuj (0)

[Delphi] literki szyfr 2009-07-26 19:25:37

Witam Smile Dzis mam kolejny programik kodujacy Smile Tym razem sadze ze odkodowanie go zajełoby niepowolanej osobie dosc duzo czasu Smile
Po 1 trzebaby znac liczbe kodujaca.
A druga sprawa to czas przy odkodowaniu metoda brute force Smile

No to najpierw teoria:
Mamy jakis alfabet ( teoretycznie nie wazna jest ilosc znakow chodz roznorodnosc napewno pomaga ). Teraz co jeden znak dodajemy "x" znakow losowych ( gdzie x to klucz )

w praktyce wyglada to tak :


function losuj(ilosc: Integer): string;
var
  alfabet: string;
begin
  Randomize;
  alfabet := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  Result := '';
  repeat
    Result := Result + alfabet[Random(Length(alfabet)) + 1];
  until (Length(Result) = ilosc)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
kod,slowo,znak : string;
i,i2 : integer;
begin
for i := 0 to length(memo1.Text) do begin
slowo := memo1.Lines.Strings[i];
     for i2 := 1 to length(slowo) do begin
     znak := slowo[i2];
     kod := losuj(strtoint(edit1.text));
     memo2.Text:= memo2.Text + znak + kod;
     end; // do 2
end; // do 1


end;


Kodowanie przy wiekszej liczbie jest bezpieczniejsze lecz dluzsze Smile natomiast odkodowanie przebiega analogicznie Smile

Tagi: delphi, szyfrowanie

skomentuj (0)

[delphi] Szyfr Bacona 2009-07-26 19:22:06

Witam Smile
Dzis zaprezentuje wam program kodujacy szyfrem Bacona.
Jest to szyfr banalny dosc Smile polega na tym iz danej literze sa przypozadkowane ciagi znakow "a" i "b".
dla liter "i" i "j" oraz dla "u" i "v' jest ten sam kod.
ciag znakow wyglada tak:

A = aaaaa
B = aaaab
C = aaaba
D = aaabb
E = aabaa
F = aabab
G = aabba
H = aabbb
I/J = abaaa
K = abaab
L = ababa
M = ababb
N = abbaa
O = abbab
P = abbba
Q = abbbb
R = baaaa
S = baaab
T = baaba
U/V = baabb
W = babaa
X = babab
Y = babba
Z = babbb


Jak latwo sie domyslic idzie to zlamac za pomoca olowka gdyz kazdy znak ma przypisany 5-literowy kod Smile takze banal ale tu chodzi o kod Smile a zrobilem to w delphi tak:
Odrazu daje koder/dekoder Smile oczywiscie odkodowanie przebiega analogicznie jak w kazdych przykladach Smile


var
  Encoding : Boolean;

procedure TForm1.Memo1Change(Sender: TObject);
var
  S : String;
begin
  if (Sender = Memo1) and (Encoding = True) then
  begin
    S := Memo1.Text;
    S := LowerCase(S);

      S := StringReplace(S, 'a', 'aaaaa ', [rfReplaceAll]);
      S := StringReplace(S, 'b', 'aaaab ', [rfReplaceAll]);
      S := StringReplace(S, 'c', 'aaaba ', [rfReplaceAll]);
      S := StringReplace(S, 'd', 'aaabb ', [rfReplaceAll]);
      S := StringReplace(S, 'e', 'aabaa ', [rfReplaceAll]);
      S := StringReplace(S, 'f', 'aabab ', [rfReplaceAll]);
      S := StringReplace(S, 'g', 'aabba ', [rfReplaceAll]);
      S := StringReplace(S, 'h', 'aabbb ', [rfReplaceAll]);
      S := StringReplace(S, 'i', 'abaaa ', [rfReplaceAll]);
      S := StringReplace(S, 'k', 'abaab ', [rfReplaceAll]);
      S := StringReplace(S, 'l', 'ababa ', [rfReplaceAll]);
      S := StringReplace(S, 'm', 'ababb ', [rfReplaceAll]);
      S := StringReplace(S, 'n', 'abbaa ', [rfReplaceAll]);
      S := StringReplace(S, 'o', 'abbab ', [rfReplaceAll]);
      S := StringReplace(S, 'p', 'abbba ', [rfReplaceAll]);
      S := StringReplace(S, 'q', 'abbbb ', [rfReplaceAll]);
      S := StringReplace(S, 'r', 'baaaa ', [rfReplaceAll]);
      S := StringReplace(S, 's', 'baaab ', [rfReplaceAll]);
      S := StringReplace(S, 't', 'baaba ', [rfReplaceAll]);
      S := StringReplace(S, 'u', 'baabb ', [rfReplaceAll]);
      S := StringReplace(S, 'w', 'babaa ', [rfReplaceAll]);
      S := StringReplace(S, 'x', 'babab ', [rfReplaceAll]);
      S := StringReplace(S, 'y', 'babba ', [rfReplaceAll]);
      S := StringReplace(S, 'z', 'babbb ', [rfReplaceAll]);
    Memo2.Text := S;
  end
  else
  if (Sender = Memo2) and (Encoding = False) then
  begin
    S := Memo2.Text;
    S := LowerCase(S);
  
      S := StringReplace(S, 'aaaaa', 'a', [rfReplaceAll]);
      S := StringReplace(S, 'aaaab', 'b', [rfReplaceAll]);
      S := StringReplace(S, 'aaaba', 'c', [rfReplaceAll]);
      S := StringReplace(S, 'aaabb', 'd', [rfReplaceAll]);
      S := StringReplace(S, 'aabaa', 'e', [rfReplaceAll]);
      S := StringReplace(S, 'aabab', 'f', [rfReplaceAll]);
      S := StringReplace(S, 'aabba', 'g', [rfReplaceAll]);
      S := StringReplace(S, 'aabbb', 'h', [rfReplaceAll]);
      S := StringReplace(S, 'abaaa', 'i', [rfReplaceAll]);
      S := StringReplace(S, 'abaab', 'k', [rfReplaceAll]);
      S := StringReplace(S, 'ababa', 'l', [rfReplaceAll]);
      S := StringReplace(S, 'ababb', 'm', [rfReplaceAll]);
      S := StringReplace(S, 'abbaa', 'n', [rfReplaceAll]);
      S := StringReplace(S, 'abbab', 'o', [rfReplaceAll]);
      S := StringReplace(S, 'abbba', 'p', [rfReplaceAll]);
      S := StringReplace(S, 'abbbb', 'q', [rfReplaceAll]);
      S := StringReplace(S, 'baaaa', 'r', [rfReplaceAll]);
      S := StringReplace(S, 'baaab', 's', [rfReplaceAll]);
      S := StringReplace(S, 'baaba', 't', [rfReplaceAll]);
      S := StringReplace(S, 'baabb', 'u', [rfReplaceAll]);
      S := StringReplace(S, 'babaa', 'w', [rfReplaceAll]);
      S := StringReplace(S, 'babab', 'x', [rfReplaceAll]);
      S := StringReplace(S, 'babba', 'y', [rfReplaceAll]);
      S := StringReplace(S, 'babbb', 'z', [rfReplaceAll]);
    Memo1.Text := S;
  end;
end;

Tagi: delphi, szyfrowanie

skomentuj (0)

[delphi] kodowanie ASCII / binarne 2009-07-26 19:19:09

Witam :)

Znow kodowanie mojego chorego umyslu :P No to najpierw teoria :)
mamy sobie jakis znak
wyciagamy jego nr z tablic ASCII

zmieniamy na binarny
jak to zrobic pokazalem wyzej dla przykladu :
97 | 1
48 | 0
24 | 0
12 | 0
6 | 0
3 | 1
1 | 1

1100001


Nastepnie podajemy jakis klucz
np liczba :

63 | 1
31 | 1
15 | 1
7 | 1
3 | 1
1 | 1

111111


teraz prownujemy te dwie binarne liczby


111111
1100001

algorytm dziala tak ze jesli liczby z tych samych pol sa takie same to je zmieniamy :) a jesli nie zostawiamy liczbe z kodowanego znaku

dla przykladu powyzej bedzie wygladalo to tak:

0000001

teraz juz tylko zamienic liczbe na dziesietna i wyciagnac znak odpowiadajacy jej z tablic ASCII

Aha w algorytmie zmienilem kolejnosc dzialan dla binarna --> dziesietna
Normalnie liczy sie
(1*2)^0 + (0*2)^1 + (0*2)^2 + (0*2)^3 + (0*2)^4 + (0*2)^5 + (0*2)^6 = 1

Ja ta kolejnosc odwrocilem w kodzie :)


takze w delphi wyglada to tak :)

Moze komus sie tez przyda :D
aha do bloku uses dodajemy modul "math"


function dwa(lD:integer):string;
var
  lB:string;
begin
while lD>1 do
begin
  if (lD mod 2) <> 0 then lB:=lB+'1' else lB:=lB+'0';
  lD:=lD div 2;
end;
lB :=lB+'1';
for lD:=length(lB) downto 0 do
  result := result + lB[lD];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,i2,i3,i4,kodzik : integer;
klucz,znak,licz : integer;
tek,tek2,zdanie : string;
slowo,koda : char;
a,b,zakod,ha: string;
oblicz : currency;
begin
oblicz := 0;
licz :=0;
klucz := strtoint(edit2.text);
zdanie := edit1.Text;
tek2 := dwa(klucz);  // nasz klucz
edit3.Text:=tek2;
for i := 1 to length(zdanie) do begin
tek:='';
slowo := edit1.Text[i];
znak := ord(slowo);
tek := dwa(znak);
tek := tek;
     for i2 := 1 to length(tek) - 1 do begin // do klucza
     a := tek2[i2];
     b := tek[i2];
     if (a = b) and (a = '1') then
     zakod:=zakod + '0';
     if (a=b) and (a = '0') then
     zakod :=zakod + '1';
     if a <> b then
     zakod := zakod + b;
     end; // do 1

     for i3 := 1 to length(zakod) do begin
     licz := licz + 1;
     end; // do 1

     for i4 := 1 to licz do begin
     oblicz := oblicz +  power((strtoint(zakod[i4])*2),i4);
     end; // do 1

kodzik := StrToInt(CurrToStr(oblicz));
koda := chr(kodzik);
ha := ha + koda;
end; // do 1
showmessage(ha);
end;

end.

Tagi: delphi, szyfrowanie

skomentuj (0)

[delphi] kodowanie binarne 2009-07-26 19:14:32

Witam :) dzis znow posiedzialem z nudow nad kodowaniem tekstu :) tym razem nie jest to xorowanie itd tylko moj wlasny pomysl :P Jest mozliwy do zlamania za pomoca tablic ASCII oraz ołówka i kawałkiem kartki :)
A wiec tak kodowanie bedzie sie opierac na systemie binarnym danego znaku

Aby zrozumiec kod moze lepiej wytlumacze jak pisac liczbe dziesietna na binarna i na odwrot :)

załózmy mamy liczbe 40
dzielimy ja przez dwa i jesli reszta = 0 to piszemy 0 jesli 1 to piszemy 1 :)

40 | 0
20 | 0
10 | 0
5 | 1
2 | 0
1 | 1

a wiec 101000


gdy mamy taka postac podmieniamy ja :)
poprostu zamieniamy 0 na 1 i na odwrot :)

a wiec z : 101000
zamieni sie na : 010111


teraz wyciagamy z tej liczby , liczbe dziesietna

robimy to potegujac kolejne liczby i mnozac przez 2
zaczynamy od tylu :
(1*2)^0 + (1*2)^1 + (1*2)^2 + (0*2)^3 + (1*2)^4 + (0*2)^5 = 23

mamy liczbe 23
teraz sprawdzamy ktory znak odpowiada tej liczbie :)
i go wypisujemy :)

Aby odkodowac postepujemy analogicznie :)


Kod w delphi wyglada mniej wiecej tak :) pisalem troche na szybko wiec komentarzy nie daje a o co biega wytlumaczylem teraz :) Moze sie przyda ;) aha do bloku uses nalezy dodac modul "math"


function dwa(lD:integer):string;
var
  lB:string;
begin
while lD>1 do
begin
  if (lD mod 2) <> 0 then lB:=lB+'1' else lB:=lB+'0';
  lD:=lD div 2;
end;
lB :=lB+'1';
for lD:=length(lB) downto 0 do
  result := result + lB[lD];
end;



procedure TForm1.Button1Click(Sender: TObject);
var
bin,slowo,bina,kod,znaka,tekst : string;
i,i2,i3,i4,tak : integer;
znak,ilosc,liczba: integer;
licz : currency;
koda : char;
begin
ilosc := 0;
licz := 0;
kod := '';
for i := 1 to length(edit2.Text) do begin
slowo := edit2.Text[i];
znak := ord(slowo[1]);

bin := dwa(znak);
     for i2 := 1 to length(bin) - 1 do begin
     bina := bin[i2];
     // --------------
     if bina = '0' then
     kod := kod + '1'
     else
     kod := kod + '0';
     // --------------
     end; // do 2
znaka := kod;   // zmieniony

    for i3 := 1 to length(znaka) do begin
    ilosc := ilosc + 1;
    end; // do 3

    for i4 := 1 to length(znaka) do begin
    liczba := strtoint(znaka[i4]);
    licz := licz + power((liczba * 2 ) , ilosc );
    ilosc := ilosc - 1;
    end; // do 4

tak := StrToInt( CurrToStr(licz));
koda := char(tak);
tekst := tekst +koda;
end; // do 1
showmessage(tekst);
end;

Tagi: delphi, szyfrowanie

skomentuj (0)

[delphi] Prosta steganografia 2009-07-26 19:05:21

Witam :]
Tym razem co¶ trudniejszego :] Otóż kodowanie tekstu w obrazie. Czyli prosta steganografia.
Na czym polega steganografia ?
steganografia - Jest to poprostu kryptografia czyli umiejetnosc szyfrowania danych. Kodowanie w ten sposob ma roooozne zastosowanie i jest roznie uzywany. Szyfrowac w ten sposob mozemy tajny tekst ale nie w postaci ASCII lecz np w obrazach badz plikach dzwiekowych / filmach itd.
Jesli mowimy nie tylko o komputerach to uzywa sie technik uzywania swiatla.
Badz bardzo znana technika gdzie prawdziwy tekst jest zapisany na 1 literze kazdego slowa :]

1.) Skoro kodujemy na obrazku musimy uzywac pewnych wspolrzednych.
Sa wiec to niewiadome X i Y.

2.) Kodowanie bedzie opieralo sie na 3 strumieniach. Czerwony zielony niebieski . Sa wiec kolejne 3 niewiadome.

3.) Kazda literka bedzie zapisana w jednym pikselku wiec musimy znac algorytm ktory rodziela kolejno literki i je rozmieszcza jest to kolejna jedna niewiadoma.

4.) Oczywiscie klucz.

Jak to bedzie wygladac w praktyce ?
Poprostu mamy tekst ktory chcemy zaszyfrowac w obrazku.
Algorytm moze byc przerozny zalezy tylko od waszej inwencji :) ja wymyslilem dla przykladu bardzo prostu szyfr z przesunieciem znow. ( moze to byc cokolwiek innego xororwanie , przesuneicia bitow , logarytmy czy krzywe eliptyczne. Tak jak mowie cokolwiek )

Moje kodowanie bedzie opieralo sie na zasadzie zaszyfrowania tekstu w jak najbardziej niemozliwym do odkrycia miejscu. A wiec najlepiej dzialac na jednym strumieniu barw ( w moim przypadku ppierwszy lepszy wiec czerwona barwa ).
Nastepnie zwykle wyciagniecie liczby z tablic ASCII danego szyfrowanego aktualnie znaku
Kolejno przesuniecie do 255 miejsc ( ograniczenie do 255 bo barwy RGB maja ograniczenie od 0 do 255 )
Na koniec pobieramy z danego piksela wszystkie barwy ( procz czerwonej ) i zapisujemy sobie je do zmiennej.
barw± czerwon± bedzie nasza liczba po przesunieciu.

A wiec praktycznie wyglada to tak :
( przykladowo obrazek : )

przykladowy obrazek

Kod zrodlowy takiego programu moze wiec wygladac tak :
procedure TForm1.Button1Click(Sender: TObject);
var
i,i2 : integer;
znak : string;
liczba : integer;
zielony, niebieski : integer;
begin
for i := 1 to length(edit1.Text) do begin
znak := edit1.Text[i];
liczba := ord(znak[1]);
   for i2 := 1 to strtoint(edit5.Text) do begin
   liczba := liczba + 1;
   if liczba > 255 then liczba := 0;
   end; // do 2
zielony := getgvalue(image1.Canvas.Pixels[strtoint(edit2.Text) + (i * strtoint(edit4.Text)) ,strtoint(edit3.Text)]);
niebieski := getbvalue(image1.Canvas.Pixels[strtoint(edit2.Text) + (i * strtoint(edit4.Text)) ,strtoint(edit3.Text)]);
image1.Canvas.Pixels[strtoint(edit2.Text) + (i * strtoint(edit4.Text)) ,strtoint(edit3.Text)] := rgb(liczba,zielony,niebieski);
end; // do 1


a wiec zmienne kolejno
x=56
y=23
odstep=14
klucz=50
Tekst do zaszyfrowania = Hackinq.pl wymiata ;]

Obrazek po zaszyfrowaniu

po zakodowaniu
Jak widzicie praktycznie zmian nie widac :] To jest w tym najlepsze bo wielu ludzi by nie podejrzewalo ze to tak naprawde zaszyfrowana wiadomosc dla kogos :)

Czemu zmia nie widac skoro bawilismy sie barwami ??
Ano tak jak pisalem my operujemy tylko na barwie czerwonej

Barwa zielona i niebieska zostaja bez zmian.

A wiec wsrod gromady pikseli "mala" zmiana nie robi roznicy. I jest w praktyce niezauwazalna. Trzeba to jedynie odkryc komputerowo :]

Tagi: delphi, steganografia

skomentuj (0)

[C++] Sortowanie b±belkowe - mediana i dominanta 2009-07-26 18:54:22

Witam :D
Tym razem algorytm znany chyba kazdemu programiscie :] Amianowicie sortowanie b±belkowe. Wykorzystamy to do obbliczenia mediany i dominanty :]
Co to jest nie musze chyba mowic ? :P Wyjasnie jedynie na czym polega sortowanie b±belkowe.
A wyjasnie to na przykladzie :
mamy ciag liczb : 45 2 68 1
chcemy je posortowac b±belkowo :) Algorytm wyglada tak :
jesli 45 > 2 to przesun 45 na miejsce 2 a 2 na miejsce 45
nastepnie jesli 45 > 68 to zrob tak jak poprzednio a jesli nie jest warunek spelniony to sprawdz czy 68 > 1 jesli tak itd itd :]
az do skutku :]

kod w c++

#include <clx.h>
#pragma hdrstop
#include <conio.h>
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused
void sortowanie_babelkowe(int *liczby2, int ilosc, bool *tak)
{
int pomoc;
  for (int i=0 ; i < ilosc-1 ; i++)
  {
     if (liczby2[i] > liczby2[i+1])
     {
     pomoc = liczby2[i];
     liczby2[i] = liczby2[i+1];
     liczby2[i+1] = pomoc;
     *tak=true;
     }
  }
}

int main(int argc, char* argv[])
{

int ilosc;
cout << "Ile liczb ?" << endl;
cin >> ilosc;
int *liczby = new int[ilosc];

for ( int i = 0; i < ilosc ; i++ )
{ // poczatek
cout << "Podaj liczbe nr " << i << endl;
  cin >> liczby[i];
} // koniec

bool zmienia;
do
{
zmienia = false;   // reset
sortowanie_babelkowe(liczby,ilosc,&zmienia); // sortujemy
} while (zmienia==true);  // dopoki bedzie prawda

// tablica liczby jest posortowana juz


int x;

if ( ilosc % 2 == 0 )
{
float wynik;
x = ilosc / 2;
wynik = (liczby[x-1] + liczby[x]) / 2;
cout << "Mediana wynosi : " << wynik << endl;
}
else
{
x = ilosc / 2;
cout << "Mediana wynosi : " << liczby[x] << endl;
}

// Mediana jest juz wyliczona
int maksior = 0;
int licz ;
int liczba;
for ( int i2 = 0 ; i2 < ilosc ; i2++)
{
licz = 0;
for ( int i3 = 0 ; i3 < ilosc; i3++)
{
  if (liczby[i2] == liczby[i3])
  licz++;
}
if (licz > maksior)
{
maksior = licz;
liczba = liczby[i2];
}
}

cout << "Dominanta wynosi : " << liczba << endl;

delete [] liczby;




getch();   // czekamy na klawisz
}
//------------------

Tagi: algorytmy, c++

skomentuj (0)

[C++] Dzielniki liczby 2009-07-26 18:46:53

Witam :]
Tym razem kolejny banalny przyklad na... odnajdywanie wszystkich dzielnikow danej liczby :)
Aby sprawdzic czy dana liczba dzieli sie przez inna liczbe musimy je podzielic dzieleniem modulo :]
Dzielenie modulo zwraca nam reszte z dzielenia a wiec jesli reszta = 0 to liczby sie dziela bez reszty :)

przyklad w c++

#include <clx.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>

//---------------------------------------------------------------------------
void podzielnosc(int liczba)
{
cout << "Dzielniki liczby "<<liczba << " to : ";
 for ( int i = 1 ; i < liczba ; i++ )
 {
  if (liczba % i == 0 )
  cout << i << ", ";
 } // koniec petli
}
//---------------------------------------------------------------------------
#pragma argsused
void main(int argc, char* argv[])
{
int liczba;
cin >> liczba;
podzielnosc(liczba);
getch();
}

Tagi: algorytmy, c++

skomentuj (0)

[delphi] Liczba doskonala 2009-07-26 18:33:41

Witam :D
Dzis zajmiemy sie zagadnieniem z ktorym poczatkujacy programisci nieraz maja problem :]
Amianowicie liczba doskonala.
Czym to cos jest ?
Liczba doskonala to liczba ktora p dodania swoich wszystkich dzielnikow ( nie liczac siebie samej ) da nam wlasnie sama siebie :P
Zobrazuje to na przykladzie :]
liczba 6
bo 1 + 2 + 3 = 6 a wiec 6 = 6 co oznacza ze jest to liczba doskonala :]
Algorytm wiec juz znacie teraz czas na kod w delphi :]

procedure TForm1.Button1Click(Sender: TObject);
var
i,i2,wynik,liczba : integer;
tablica : array of integer;
begin
wynik := 0;
for i := 1 to strtoint(edit1.Text) - 1 do begin
if strtoint(edit1.Text) mod i = 0 then begin
setlength(tablica,high(tablica)+2);
tablica[high(tablica)] := i;
end; // do warunku
end;
for i2 := low(tablica) to high(tablica) do begin
liczba := tablica[i2];
wynik := wynik + liczba;
end;
if wynik = strtoint(edit1.Text) then
showmessage('Jest to liczba doskonla');

end;

Tagi: algorytmy, delphi

skomentuj (0)

[delphi] Dodawanie na stringach 2009-07-26 18:26:22

Witam :]
Ludzie czesto maja problem z liczeniem ogromnych wartosci...
No bo wiadomo swoje typy maja okreslone wartosci maksymalne. Np Int / integer = max ma dla 2147483647.
Co zrobic aby liczyc wieksze wartosci np 54846521321548654212313548 + 1234548654522646321221464864632121 = ?

Wystarczy cofnac sie do czasow... podstawowki :) Pamietacie jak licz± dzieci ? Dzieci licz± "w słupku" :>
I to samo zrobimy z naszym programem :] Bedzie liczyl w slupku.
Konkretnie wiec posluzymy sie stringami. Dlatego nazwalem ten art "dodawanie na stringach" :)

kod:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
liczba1,liczba2,pamiec : integer;
caly,wynik : string;
begin
if length(edit1.Text) > length(edit2.Text) then
edit2.Text := stringofchar('0',length(edit1.Text) - length(edit2.Text)) + edit2.Text
else
edit1.Text := stringofchar('0',length(edit2.Text) - length(edit1.Text)) + edit1.Text;
pamiec := 0;
for i := length(edit1.Text) downto 1 do begin
liczba1 := strtoint(edit1.Text[i]);
liczba2 := strtoint(edit2.Text[i]);
wynik := inttostr(liczba1 + liczba2 + pamiec);

if strtoint(wynik) > 9 then begin
caly := wynik[2] + caly;
pamiec := 1;
end else begin
pamiec := 0;
caly := wynik + caly;
end; // do drugiego warunku


end; // do 1

showmessage(caly);

end;

Tagi: algorytmy, delphi

skomentuj (0)

[delphi] MAX i MIN wartosc w tablicy 2009-07-26 18:18:57

A więc by rozkręcić się na pocz±tek co¶ baaardzo prostego :] Przykład szukania liczby maksymalnej i minimalnej. Przyklad bedzie w delphi.

Na czym takie szukanie polega ?
Porownujemy poprostu czy liczba aktualna jest wieksza od poprzedniej jesli tak to zapamietujemy j± i tak w kolko.

Np mamy liczby 45 6 2 68 12
jak widać liczb± maksymalna jest 68 ale jak to ma zrobić program ? Otoż w banalny sposob :)
okreslamy zmienna o pczatkowej wartosci pierwszego fragmentu tablicy czyli tu 45
nastepnie porownujemy kolejne fragmenty
45 > 6 ? tak wiec nic nie robimy
45 > 2 ? tak samo
45 > 68 ? NIE!! i teraz przypisujemy zmiennej wartosc 68
nastepnie bedzie :
68 > 12 ? tak wiec nic nie robmy :]

Nasza maksymalna wartoscia jest wiec 68 :] jak to wyglada w kodzie ?
Przykladowo tak :

procedure TForm1.Button1Click(Sender: TObject);
var
tablica : array [0..100] of integer;
max,min,i,i2 : byte;
begin
randomize;
for i := low(tablica) to high(tablica) do begin
tablica[i] := random(1000);
end; // do 1

// ok teraz mamy juz losowa tablice i jej wartosci
// sprawdzamy najmniejsza i najwieksza wartosc
max := tablica[0];
min := tablica[0];
for i2 := low(tablica) to high(tablica) do begin
if max < tablica[i2] then
max := tablica[i2];
if min > tablica[i2] then
min := tablica[i2];
end; // do 2

showmessage('Najwieksza wartosc to : ' + inttostr(max) + ' a najmniejsza to : ' + inttostr(min));


end;

Tagi: algorytmy, delphi

skomentuj (0)

Księga Go¶ci
Znajomi i przyjaciele
http://lowbyte.da.ru/ HomePage Cybera
http://ruusek.wordpress.com/ Blog Ruska
http://n3t-b0y.ugu.pl/ N3t_b0y Home Page
gridlok.boo.pl/ Gridlok Home Page

Polecane
Hacking i programowanie Hacking i programowanie naprawde warto !