Witam :]
Rezygnuje z bloga :) Postawilem swoja www i zapraszam :)
http://polak17.republika.pl/
Witam :]
Tym razem czysty gotowiec ... coz... nie bardzo bylo co zmieniac
przykladowy obrazek :

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

I to na tyle :]
zrodlo http://www.algorytm.org/index.php?option...&Itemid=28
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 :

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 :

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

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

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

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

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 :

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 :]
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
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
Stad "skracanie" sobie drogi i automatyczne reakcje.
Socjotechnikami sa bardzo czesto sklepikarze 
Czytajac rozne wiadomosci od ludzi i ksiazki czesto zauwazalem sytuacje w ktorej ludzie ulegaja stereotypom 
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 
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" ? 
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
) dajemy i mowimy ze to prezent. Nawet gdy nasza "ofiara" odmawia wrecz WPYCHAMY w rece jej ten cukierek 
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
Niewiele osob po daniu "prezentu" ( nawet niechcianego ) odwroci sie od nas plecami
( szczegolnie tam gdzie wielu ludzi widzialo nasz "dobry" gest ).
"Ofiara" bala by sie "co pomysli spoleczenstwo jesli sie nie
odwdziecze"
?
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
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 
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
Dlatego gdy cos powiemy publicznie to nasza konsekwencja czesto idzie naprzod. Przyklad ktory znacie to ... RON !!!
Pamietacie jak wmawial nam ze to nie jego IP itd :] ?
Byly tu slowa pisane w SB ( publicznie )
Byla konsekwencja w darzeniu do celu 
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
)
Typowy przyklad zaangazowania i konsekwencji nawet wtedy gdy to glupie 
No wlasnie ale CZEMU on tak robil skoro to glupie ???
heheh no wlasnie
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"
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 
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
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
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
?
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 
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 
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
czemu ? czy tym razem chodzi o lęk ?
Nie tym razem tez nie to 
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
).
A wiec co ofiara POWINNA ZROBIC ? NIC ? no oczywiscie nie :] cos zrobic musi
ale co ? walczyc ?
tez nie
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 
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 !
"
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
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
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 
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
Dobrze jest takze jakby byli ubrani podobnie ( w podobnym stylu ).
Oczywiscie przydatne sa takze... komplementy :] A jakze
Uwaga jednak zbyt nachalne komplementowanie danej osoby moze odwrocic skutek i dana osoba bedzie miala nas dosc
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
Zaczynano od 15 V za kazdy blad podnoszono stawke o 15V az do 450V 
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 ? ) 
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" 
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)
Witam 
Tak mnie jakos naszlo
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"
?
Ano znana metoda dzialania w slupku
( moj kodzik nie radzi sobie z liczbami ujemnymi ale da sie to naprawic
)
A wiec dodawanie i odejmowanie w jednym
:
#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
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');
}
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)
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 :

Witam :]
W zamierzeniu mial to byc malware ale ostatecznie napisalem poprostu uzytkowy program 
Programik umozliwia nam sciagniecie stacji radiowych na dysk :] konkretnie to malych plikow ktore nalezy otworzyc w winampie 
( 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 
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:
Witam :]
Oto moje nowe dziecko xD Obiecalem kiedys ze cos takiego wykodze :] dzis sie wzialem od poludnia i troche wykodzilem 
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:

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

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:

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 
( 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
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 
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
ale nie sa to pewne informacje poniewaz nie zarazalem sie specialnie tym malware :]
Program wyglada tak:

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 :]
Witam 
Dzis znow program graficzny :] Tym razem jeden z ladniejszych efektow to jest efekt blur ( rozmycie ) 
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 
{
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 :

I Po

Hej witam wszystkich :] Dzis pobawimy sie grafika i zrobimy dosc duzo w niej
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 
Ok co jeszcze ? Otoz jak widzicie jest to 1 czesc atykulu wiec jak sie mozna latwo domyslec sa w planach inne czesci
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 
Za kazdym razem bedziemy pracowac na jednym i tym samym obrazku. Jest nim :

No to chyba na tyle jesli chodzi o wstep
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
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
efekt przy wartosc 77 :

No dobra skoro rozjasnianie jest to i niech bedzie przyciemnianie
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 
efekt przy wartosci 77 :

No dobra wiec teraz zajmijmy sie trudniejszym aspektem :] Chodz gwarantuje wam ze tu nie ma w sumie nic trudnego
Tak jak kiedys napisal V3rt w SB "patrzac na obrazek widzisz cyfry" tak
idac ta zasada poprostu wykonujemy najprostsze obliczenia matematyczne
Nic ponad to 
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 :

Swietnie :] jak widac bylo to nieco trudniejsze od rozsjasniania ale
tylko pozornie ( nieco funkcje warunkowe groznie wygladaja ) ale tak
naprawde wszystko w normie 
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

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 
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);
}
}

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);
}
}

No to lecimy dalej :] tym razem cos co potrafi upiekszyc niejedno zdiecie :] NASYCENIE KOLOROW 
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);
}
}

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);
}
}

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:

Kolejnym efektem jest sepia
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);
}
}

Przedostatnim filtrem ktory pokaze jest szum kolorowy :] Podobny do tego co widac nieraz w TV i nazywamy to kaszk±
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 
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);
}

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);
}
}

No to na tyle jesli chodzi o czesc 1 :]
mam nadzije ze art sie podoba
Tak w sumie to podaje tu sasme gotowce duzo nie opisuje bo ... nie ma w
sumie czego opisuac :] Sma matematyka i zabawa z liczbami
Polecam eksperymentowac bo naprawde fajne efekty moga wyjsc nieraz :]
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 :

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 :

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:
Tagi: delphi, steganografia
skomentuj (0)
Witam :]
Dzis czesc 3 artykulow lamania szyfrow 
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 : ŘĘŰ·×ŐßÖŇŰ®
Cytat:slowo : hackinq
haslo : a
szyfr : ÉÂÄĚĘĎŇ
Cytat:slowo : hackinq
haslo : aaaaaaaaaaaaaaaa
szyfr : ÉÂÄĚĘĎŇ
skad ??slowo : hackinq
haslo : ab
szyfr : ÉĂÄÍĘĐŇ
slowo : ?
haslo : ?
szyfr : ŃĐÍÂÄŰĆĚ’˜
polaczek17

Tagi: szyfrowanie
skomentuj (0)
Witam 
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
?
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 
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}hqnhNie znamy klucza ani hasla.

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
Tagi: szyfrowanie
skomentuj (0)
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
Tagi: szyfrowanie
skomentuj (0)
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
Tagi: delphi, szyfrowanie
skomentuj (0)
Witam :]
Dosc dlugo nad tym pracowalem wspomagalem sie googlami itd 
Ale w koncu sie udalo :] Algorytm md5 BEZ dodatkowych komponentow 
( 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 
Oczywiscie moznaby tez uzyc slownika 
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 
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)
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 
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
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 
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 
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
Alfabet jest tam tak fajnie "schowany" ze male litery sa po kolei
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
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)
Witam
Dzis mam kolejny programik kodujacy
Tym razem sadze ze odkodowanie go zajełoby niepowolanej osobie dosc duzo czasu 
Po 1 trzebaby znac liczbe kodujaca.
A druga sprawa to czas przy odkodowaniu metoda brute force 
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
natomiast odkodowanie przebiega analogicznie
Tagi: delphi, szyfrowanie
skomentuj (0)
Witam 
Dzis zaprezentuje wam program kodujacy szyfrem Bacona.
Jest to szyfr banalny dosc
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
takze banal ale tu chodzi o kod
a zrobilem to w delphi tak:
Odrazu daje koder/dekoder
oczywiscie odkodowanie przebiega analogicznie jak w kazdych przykladach
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)
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)
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)
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 : )

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

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)
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
}
//------------------
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();
}
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;
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" :)
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;