Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 lis 2024, o 05:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 22 wrz 2013, o 21:08 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 18 lis 2012
Posty: 4
Pomógł: 0

Witam wszystkich,

jak widać jestem zupełnie nowy na forum Atnel, choć nie zupełnie nowy w świecie AVR i C, dość często tu zaglądałem ale nie miałem jakoś czasu aby zostać na dłużej.

Mam nadzieję, że teraz uda mi się zaglądać częściej i częściej coś napisać, dziś chciałbym zacząć z niewielkim poradnikiem dotyczącym zabawy ze znakami oraz stringami na naszych procesorkach AVR pokazując prostą metodę szyfrowania tekstu.
Może to być pewne uzupełnienie informacji które pojawiły się podczas konkursu Mirka: http://mirekk36.blogspot.com/2013/08/am ... ajaca.html

Tak wiec zaczynajmy ;)

1. Wstęp

Każdy myślę pamięta, że stałe znakowe w języku C przechowywane są za pomocą 7-bitowych kodów ASCII (choć zajmują oczywiście 8 bitów), są więc po prostu liczbami i
tak jak liczby poddają się wszelkim operacjom arytmetycznym.
Pozostaje więc odpowiedzieć sobie na pytanie do czego mogą nam takie operacje być potrzebne?
Polecam rzucić okiem na tablicę wszystkich kodów ASCII np. tutaj: http://pl.wikipedia.org/wiki/ASCII
widząc to w takiej formie łatwiej jest wszystko zrozumieć i można od razu zauważyć, że znaki ułożone są w dość logiczny sposób, np. co dla nas jest dość ważne, cyfry, małe i wielkie litery znajdują się w spójnych blokach oraz są prawidłowo posortowane (cyfry rosnąco, litery alfabetycznie)
tak np. cyfry od 0 do 9 zajmują kody ASCII od 30 do 39 i już tu możemy zauważyć pewne zastosowanie:
każdy znak reprezentujący liczbę 0-9 możemy niemal natychmiast zamienić na jego wartość dziesiętną odejmując od wartości kodu ASCII liczbę 30 (czyli nasze '0')
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Spoglądając na układ wielkich oraz małych liter w tabeli kodów ASCII, powinniśmy np. łatwo dostrzec, że długość alfabetu możemy policzyć operacją 'z' - 'a' + 1 lub też: 'Z' - 'A' + 1, dodatkowo biorąc pod uwagę, że odległość małych liter od ich wielkich "odpowiedników" jest stała i wynosi: 'a' - 'A' (ale też oczywiście 'c' - 'C' lub 'z' - 'Z') możemy np. napisać funkcje zamieniającą nam wszystkie wielkie litery w tekście na małe:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Krótkie przypomnienie dotyczące C-stringów:
W wyniku zapisu: char *str = "Hello"; otrzymujemy tak w rzeczywistości wskaźnik na literę 'H' w naszym "Hello". Aby teraz odwołać się np. do litery 'e' możemy skorzystać z dwóch równoznacznych zapisów:
*(str+1) lub str[1] ale możemy też po prostu przesunąć nasz wskaźnik (na stałe) na literę e przesuwając go na następny bajt pamięci a więc dodając do aktualnej wartości jedynkę, tak więc po operacji str++ nasz str wskazywać już będzie na literę e i to na tej właśnie zasadzie działa powyższa funkcja ;)

Wykorzystajmy więc te informacje przejdźmy do napisania prostej funkcji szyfrującej :).

2. Szyfr przesuwający - szyfrowanie.

Jest to najprostszy rodzaj szyfru podstawieniowego - czyli takiego w którym litery szyfrowanego wyrazu podmieniamy na inne litery bądź w ogóle znaki.
Szyfr przesuwający jak sama nazwa wskazuje, zastępuje wszystkie szyfrowane litery, inną, oddaloną o stałą liczbę pozycji literą (liczbę pozycji ustalamy sami i pozostaje ona stała dla całego szyfrowanego wyrażenia).
Litery które wykroczą poza alfabet "zawijamy" na początek (np. Y przesunięte o 2 to już litera A)

Zasadę działania bardzo dobrze obrazuje obrazek z Wikipedii prezentujący działanie szyfru dla przesunięcia 3 czyli tzn. Szyfru Cezara.

Obrazek

Spróbuję teraz pokazać jak łatwo możemy taki szyfr zaimplementować w języku C, na nasze potrzeby przyjmiemy, że wielkie litery wprowadzonego wyrażenia zamienimy na małe oraz damy też możliwość przesuwania się o ujemną liczbę pozycji (czyli w lewo).

Zacznijmy od pewnych spostrzeżeń: liczbę liter w alfabecie znamy ( jest ich 'z' - 'a' +1 ;) ), łatwo też zauważyć, że przesuwając się o taką liczbę wrócimy do naszej pierwotnej litery - szyfr dla przesunięcia 0, 26 ale też 52, 78 itd. pozostawi wiadomość szyfrowaną bez zmian a przesunięcie o liczbę 27 w rzeczywistości spowoduje przesunięcie tylko o 1, zgadza się? ;)
Kolejną rzeczą jaką trzeba zauważyć jest to, że np. przesunięcie o liczbę 2 w lewo jest równoznaczne z przesunięciem o 26 - 2 = 24 pozycje w prawo i tak analogicznie każde przesunięcie o ujemną liczbę pozycji (czyli w lewo) możemy zamienić na odpowiadające mu przesunięcie w prawo.

Gdy to już jest jasne, możemy zacząć od nagłówka naszej funcji, załóżmy, że będzie on miał następującą postać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czyli funkcja będzie zwracać zaszyfrowaną wiadomość w nowym stringu.

Wiemy, już, że na początku możemy wykonać takie operacje:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jako, że nasza funkcji zwraca nam odszyfrowaną wiadomość będziemy potrzebować miejsca w pamięci aby ją umieścić, załatwimy to najłatwiej tworząc kopię oryginalnej wiadomości którą później zmodyfikujemy i zwrócimy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

utworzyliśmy też dodatkowy wskaźnik o którym powiem na końcu, na razie ustawmy go na aktualną zwracaną wiadomość :>
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po takich przygotowaniach, możemy przejść do głównej części:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


na koniec wystarczy nam już tylko zwrócić zaszyfrowaną wiadomość ale jest tu pewien haczyk, otóż nasz wskaźnik zaszyfrowana_wiadomosc w każdym obrocie pętli był przesuwany o jeden znak do przodu i w tym miejscu wskazuje już na znak końca stringu - zwracanie go nie ma więc najmniejszego sensu.
Tutaj z pomocą przyjdzie nam wskaźnik tmp którego nigdzie nie modyfikowaliśmy więc on nadal wskazuje na początek naszej szyfrowanej wiadomości, wystarczy więc zakończyć naszą funkcję w taki sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście całą sprawę można było rozwiązać na wiele różnych sposobów i ominąć tego typu zabiegi, wystarczyło np. użyć pętli for i zapisu zaszyfrowana_wiadomosc[i] ale specjalnie chciałem pokazać coś innego ;)


3. Odszyfrowywanie.

Odszyfrowanie wiadomości to nic innego jak wykonanie operacji odwrotnej tzn. przesunięcia wszystkich liter o jednakową ilość pozycji tyle, że w drugą stronę. My, jako, że trochę bardziej rozbudowaliśmy funkcję szyfrującą, robić już nic nie musimy, nasza funkcja odszyfrowująca będzie miała po prostu postać:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I tak oto dobrnęliśmy do końca tej powtórki z operacji znakowych w C ;)

Pozostaje mi poruszyć jeszcze tylko jedną kwestię, do wydzielenia sobie kawałka pamięci na nasz zwracany string użyliśmy funkcji strdup która jak łatwo się domyślić dokonuje alokacji pamięci - a skoro tak to powinniśmy też tą pamięć zwalniać (szczególnie biorąc pod uwagę, że nasze procesorki ramem nie grzeszą ;) )
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Poniżej prezentuję jeszcze kod pierwszej funkcji złożony razem:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeśli chcielibyście w przyszłości usłyszeć coś konkretnego to proszę podrzucić propozycję tutoriala do języka C, C# lub Javy (ale tylko Android) ;)

PS. To mój pierwszy poradnik w życiu, proszę o wyrozumiałość :D

Pozdrawiam,
Dzedor



Ostatnio edytowano 23 wrz 2013, o 06:48 przez Dzedor, łącznie edytowano 4 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2013, o 23:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 paź 2011
Posty: 780
Pomógł: 20

Fajnie to ująłeś ten rodzaj szyfrowania to jeśli się nie mylę "szyfr cezara"

bo jeśli się nie mylę Cezar właśnie tak szyfrował swoja korespondencję :)

1 szyfrowanie poczty jeszcze nie elektronicznej ale poczty, hehe

Chyba się nie mylę :) http://pl.wikipedia.org/wiki/Szyfr_Cezara

Pozdrawiam

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2013, o 23:10 
Offline
Użytkownik

Dołączył(a): 07 maja 2012
Posty: 119
Pomógł: 2

Ciekawe podejście do tematu. My na informatyce robiliśmy szyfratory i deszyfratory Cezara w Exelu, i też ciekawa zabawa była by to wszystko ładnie zgrać ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2013, o 06:46 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 18 lis 2012
Posty: 4
Pomógł: 0

stachu napisał(a):
Fajnie to ująłeś ten rodzaj szyfrowania to jeśli się nie mylę "szyfr cezara"

bo jeśli się nie mylę Cezar właśnie tak szyfrował swoja korespondencję :)


Tak, zgadza się, Cezar używał szyfru przesuwającego o przesunięciu 3 i teraz jak kto woli można szyfrem Cezara nazywać ten konkretny szyfr z przesunięciem 3 lub ogólnie szyfr przesuwający jako ideę ;) .
Wspomniałem też, że obrazem z Wikipedii przedstawia właśnie szyfr Cezara :)

sosnus napisał(a):
Ciekawe podejście do tematu. My na informatyce robiliśmy szyfratory i deszyfratory Cezara w Exelu, i też ciekawa zabawa była by to wszystko ładnie zgrać ;)

Ale to już makrami w VBA, tak?
Domyślam, się, że musiało być trochę zabawy :D .

Dzięki za odpowiedzi Panowie ;) .

Pozdrawiam,



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2013, o 08:48 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27310
Lokalizacja: Szczecin
Pomógł: 1041

No no no ! ... że tak powiem, bardzo starannie przygotowany poradnik ;) jest co poczytać i się dowiedzieć ... tym bardziej, że jest też opisana implementacja w kodzie w C ;)

SUPER, poradnik, gratulacje ;)

no i witamy oficjalnie na forum, skoro to pierwszy raz ;) ... bardzo fajny start.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2013, o 19:23 
Offline
Użytkownik

Dołączył(a): 07 maja 2012
Posty: 119
Pomógł: 2

Dzedor napisał(a):
Ale to już makrami w VBA, tak?

Nie, wszystko się opierało praktycznie na funkcjach dot. pracy ze zmiennymi tekstowymi (kategoria funkcji: tekstowe).
Jak ktoś zainteresowany, dodaję plik w załączniku, może ktoś chce z ciekawości looknąć. Ma on kilka wad (wypisuje te zera, jest ograniczona ilość znaków ale... Zaliczone, a nie ma kiedy nad tym posiedzieć i dopracować, bo i czasu nie ma, ani to mi nie jest do niczego potrzebne teraz.

------------------------ [ Dodano po: kilkunastu sekundach ]

Zapomniałem powiedzieć, proszę patrzeć na ARKUSZ3 ;)


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2013, o 07:17 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 18 lis 2012
Posty: 4
Pomógł: 0

Aha, to nawet bym nie pomyślał, że tak można ;)

Fajny programik, można nim przetestować moją funkcję :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2013, o 08:14 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 57
Pomógł: 5

ciekawy artykuł z podstaw programowania i szyfrowania, gratulacje dla autora.

Od siebie dodał coś ciekawego po części związanego z tematem.

co prawda gościu opisuje UTF-8, ale na początku mówi o kodach ASCII i dopiero z tego filmu się dowiedziałem, że bardzo łatwo można odczytywać małe i duże litery z zapisu binarnego :
na przykład wielkie litery zawsze zawierają jedynkę na 7 bicie, a młodsze bity oznaczają kolejność litery w alfabecie
np. dla "A", która jest pierwsza w alfabecie: 1000001 (65Dec),
"B" jest drugą liczbą w alfabecie: 1000010 (66Dec).
itd. ...
natomiast litery małe mają jedynki na na bitachi 6 i 7
np. dla "a", która jest pierwsza w alfabecie: 1100001 (97Dec),
"b"jest drugą liczbą w alfabecie: 1100010 (98Dec).
itd. ...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2013, o 13:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27310
Lokalizacja: Szczecin
Pomógł: 1041

BARTB napisał(a):
dopiero z tego filmu się dowiedziałem, że bardzo łatwo można odczytywać małe i duże litery z zapisu binarnego


Warto czasem podglądnąć rozwiązania jakie masz w C, bo zamiana dużych liter na małe i odwrotnie w jednej z wbudowanych funkcji to właśnie tylko ustawienie bądź zgaszenie jednego bitu w kodzie znaku ;)

ci którzy kiedyś projektowali rozkład kodów ASCII właśnie się tym kierowali tak nawiasem mówiąc ;) ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2013, o 21:31 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 18 lis 2012
Posty: 4
Pomógł: 0

Bardzo ciekawa uwaga :), myślę, że tego nie brali pod uwagę układając kody ascii ;D .

PS. W drugim kodzie tylko mała literówka, potrzebne byłoby *(hex++) ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO