რამდენი რაღაცა დაიწერა არ ტოპიკზე, ეტყობა საზოგადოებას აინტერესებს

. შევეცდები რაც მე ვიცი გაგიზიაროთ, იმედია გამოგადგებათ.
კრიპტაციის პოირველი კანონის მიხედვით

, უნდა ჩათვალოთ, რომ ალგორითმი რომლითაც ტექსტია დაშიფრული და თვითონ ტექსტიც დაინტერესებულ მხარეს გააჩნია. ეხლა წარმოიდგინედ რამდენად რთულია 33 იტერაციანი ციკლის დაწერა კეისარის კოდის გასატეხად. ამიტომ დაივიწყეთ ყველანაირი კეისარი და ბიტური წაძვრები, დღევანდელ კრიფტოგრაფიაში მაგაზე ლაპარაკი ისეთივე პონტია, როგორც პერფობარათებზე XP-ს საინსტალაცოის შენახვა

.
დღევანდელ სამყაროში ”კროფტომდგრადად” ისეთი ალგორითმები მიიჩნევა, რომლის გახსნა ინ შემტვევაშიც კი როცა ალგოროთმიც ცნობილია და დაშიფრული ტექსტის გვაქვს მაინც შეუძლებელია. RSA ერთერთი ზუსტად ეგეთი ალგორითმია. ისე უნდა დავაკონკრეტოთ რას ნიშნავს ”გაშიგრვა შეუძლებელია” - შეუძლებელი არაფერი არაა, განსაკუთრებით თუ ალგორითმი იცი, საქმე იმაშია, რომ გასაშიფრად დაინტერესებულ მხარეს უნდა მოუხდეს ყველა ვარიანტის გადასინჯვა (ან მიახლოვებული რანგის ოპერაციის ჩატარება). კეისარის კოდის შემთხვევას თუ დავუბრუნდებით იქ სულ 33 სხვადასხვა ვარიანტი იყო (33 ქართულისვის), ანუ მიახლოებით 5 ბიტიან გასაღებს მივიღებთ (2^5=32), დღევანდელი ალგორითმები 64, 128, 512, 1024 და ხანდახან 4096 ბიტიან გასაღებებსაც იყენებენ.
ეს იმხელა რიცხვებია, რომ მაგის ყველა ვარიანტის გადასინჯვა შეუძლებელია, რა თქმა უნდა ყველაფერი ალბათობაზეა დამოკიდებული და თეორულად ისიც შეიძლება, რომ ყველაზე დიდი გასაღებით დაკრიფტული კოდი პირველივე მოსინჯული გასაღებით გაიხსნას, მაგრამ წარმოიდგინეთ რა არის იმის ალბათობა რომ თუნდაც 128 ბიტიანი კოდი (2^128 მიახლოებით იგივეა რაც 10^40 ანუ ორმოცნიშნა რიცხვზე დიდია) პირდაპირ გაიხსნება? ალბათობა იმისა რომ ამ აბზაცის ჩაკითხვამდე თავში აგური დაგეცემათ და მოგკლავთ უფრო დიდია.
ვინც გადარჩით იმას გავახარებ, რომ მსოფლიოში ოფიციალურად მხოლიდ ერთხელ არის დაფიქსირებული 129 ბიტიანი გასაღებით დაკრფტული ტექსტის გახსნა, ისიც განაწილებული გამოთვლებით, მსოფლიოს უამრავი კომპიუტერის გამოყენებით. ამით იმის თქმა მინდოდა, რომ კოდის მდგრადობა არა მარტო ალგორითმზე, არამედ გასაღების სიგრძეზეც არის დამოკიდებული და დამოკიდებულია ძალიან მნიშვნელოვნად.
ეხლა ისევ ალგორითმებს დავუბრუნდეთ. გასაგებია, რომ დაკრიფტულ ტექსტსა და საწყის ტექსტს შორის ცალსახა დამოკიდებულება არსებობს, წინააღმდეგ შემთხვევაში კოდი არ გაიხსნება. ანუ ნებისმიერი კრიფტაციის ფუნქციისთვის f , თუ y=f(x, k) მაშინ უნდა არსებობდეს ისეთი g ფუნქცია, რომ x=g(y, k), სადაც x და y საწყისის და დაკრიფტული ტექსტებია, ხოლო k გასაღები, f და g დაშიფრვის და გაშიფრვის ფუნქციები (ალგორითმები). ანუ უნდა მოხდეს ტექსტის აღდგენა ცალსახად.
კრიფტაციის მთელი სირთულე ისაა, რომ მაშინაც კი როცა ვიცით f,
g და y არ მოხდეს ისეთი ფუნქციის m (ალგორითმის) მოებნა, რომელიც დაადგენს x საწყის ტექსტს ისე, რომ არ გადასინჯავს k-ს ყველა ვარიანტს (ან არ ჩაატარებს მიახლოვებული რანგის ოპერაციას). იმედია რაიმე არ ავურიე
რატომ ითვლება RSA ალგორითმი მდრადად, იმიტომ რომ დღეისათვის არ არსებობს (ან არსებობს, მაგრამ ფართო საზოგადოებისათვის უცნობია

) რაიმე ეფექტური ალგორითმი დიდი მარტივი რიცხვების გამოსათვლელად და ვერ ხერხდება რიცხვის მარტივ მამრავლებად სწრაფი დაშლა. RSA-ს ალგორითმი კიდე, ზუსტად ამ პრინციპზე მუშაობს. პრინციპში საკმაოდ პრიმიტიული ალგორითმია, უბრალოდ ზოგს უყვარს ხოლმე ფილოსოფიურად ახსნა

. ასე რომ როცა ეს პრობლემა გადაიჭრება RSA-ც გაიშიფრება ადვილად. დღეისათვის კიდე მისი გახსნისთვის ყველა შესაძლო ვარიანტის გადასინჯვაა საჭირო.
არსებობს კიდევ ერთი ცნობილი და ძალიან გაცრცელებული ალგორითმი DES (Data Encription Standard). ზუსტად ამ ალგორითმზეა დაფუძნებული UNIX პაროლების სისტემა. თუ სწორედ მახსოვს მომხმარებლის პაროლი გამოიყენება როგორც გასაღები და იშიფრება 25 ჯერ DES ალგორითმის მეშვეობით რვა 0 (”00000000”). მერე მიღებული ინფორმაცია ინახება პაროლების ფაილში. დღეისათვის ეს მთლად ესე არაა, კიდევ ემატება რამოდენიმე ბაიტი დროის (DataTime) მიხედვით, რომ უფრო საიმედო რომ იყოს პაროლი მაგრამ იდეა ეგეთია. მოკლედ თემას გადაუხვიე. DES-ი RSA-გან განსხვავებით ერთ გასაღებს იყენებს, კეისარის კოდის მსგავსად. ანუ თუ დაშიფრავთ ტექსტს KEY_A გასარებით ისევ KEY_A თი უნდა გახსნათ:
თუ (TEXT) encrypt (KEY_A) = (CIPHERED_TEXT)
მაშინ (CIPHERED_TEXT) decrypt (KEY_A) = (TEXT)
RSA ესე არ მუშაობს, აქ არის ორი გასაღები KEY_A და KEY_B ისეთი რომ:
თუ (TEXT) -> (KEY_A) = (CIPHERED_TEXT)
მაშინ (CIPHERED_TEXT) -> (KEY_B) = (TEXT)
ანალოგიურად
თუ (TEXT) -> (KEY_B) = (CIPHERED_TEXT)
მაშინ (CIPHERED_TEXT) -> (KEY_A) = (TEXT)
სხვანმაირად რომ ვთქვათ KEY_A-თი დაშიფრული ტექსტი იხხნება KEY_B და პირიქით. ეს ბევრი რაღაცის საშულაებას იძლევა. ხშირად ამ გასაღებების წყვილს A და B-ს მაგიერ public და private-ს ეძახიან, დასახელება სუფთა სიმბოლურია შინაარსის მიხედვით, გასაღებები სიმეტრიულია და რომელი იქნება public და რომელი private არანაირი მნიშვნელობა არ აქვს. მაგალითად ერთერთი გამოყენების ვარიანტი იქნება მე რომ ფორუმზე დავდო ჩემი KEY_Public, მერე დავშიფრო პოსტი და ისე გამოვაქვეყნო, მაგის გახსნას ყველა შეძლებს ჩემი ღია გასაღებით და შინაარსის ნახვს, მაგრამ მუღამი ისსაა რომ ყველას ეცოდინება რომ პოსტი მართლა მე გავაკეთე (პრინციპში ისედაც იცით, მაგრამ ხომ შეეძლო ბოროტ ადმინისტრატორს სახელი შეეცვალა ბაზაში

) ანუ შეიძლება ვთქვათ რომ მე ხელი მოვაწერე წერილს.
უფრო გავართულოდ სიტუაცია და ვთქვათ, რომ ჩემს გარდა კიდევ არის ვიღაც ”მონდომებული” და იმანაც გამოაქვეყნა თავისი ღია გასაღები. მაშინ მე შემიძლია დავწერო პოსტი, მერე დავშიფრო მაგისი public გასაღებით და ისე დავპოსტო ფორუმზე. ამ დაკრიფტულ ტექსტს ”მონდომებულის” გარდა ვერავინ ვერ გახსნის (ჩემი ჩათვლით) იმიტომ, რომ ”მონდომებულის” public გასაღებით დაშიფრული ტექსტი, მარტო ”მონდომებულის” private გასაღებით გაიხსნება, private გასაღები კიდე მარტო მაგისთვისაა ცნობილი. მაგრამ საიდან გაიგებს მონდომებული, რომ ეს პოსტი მე დავწერე, ამის გაკეთება ხომ ყველას შეეძლო, ანუ ჩემი სახელით გაეგზავნა ტექსტი ”მონდომებულისთვის”? ამითვის მე ტექტს პირდაპირ ”მონდომებულის” public გასაღებით კი არ დავკრიფტავ, ჯერ ჩემი private გასაღებით დავკრიფტავ (ანუ მოვაწერ ხელს) და მერე ”მონდომებულის” public გასაღებით. ასე რომ მონდომებულის გარდა ამას ვერავინ ვერ წაიკითხავს და ის დარწმუნებული იქნება, რომ ტექსტი მე დავწერე. იმედია ახსნა ძალიან აბდა-უბდათ არ გამომივიდა.
ერთი მნიშვნელოვანი დეტალი რომელიც აქედან გამომდინარეობს და ხდის RSA ალგორითმს ინტერნეტისთვის ყველაზე მისაღებად - RSA-ს არ სღირდება დაცული არხი გსაღების გასაცვლელად. რას ნიშნავს ეს, მაგალითად DES რომ გამოვიყენოთ RSA-ს ნაცვლად, მაშინ გამოვა, რომ მანამ სანამ მე და ”მონდომებული” ერთმანეთთან დაცული მიმოწერის დაწყებას შევძლებთ, უნდა შევხვდეთ სადმე და DES-ის გასაღები გადავცე. RSA-ს ეს არ სჭირდება, შეგვიძლია ორივემ სადმე ფორუმზე დავდოთ ღია (public) გასაღებები და მაინც ჩვენს წერილებს ვერავინ ვერ წაიკითხავს (მიუხედავათ იმისა რომ public გასაღებები ყველამ იცის).
ამ პრინციპზეა დაფუძნებული SSL, სეანსის დაწყების წინ ბრაუზერი და სერვერი აგენერირებენ ღია და დახურული გასაღებების წყვილს (public და private წყვილს) და ღია გასაღებებს ერთმანეთს უგზავნიან, გზაში ორივე გასაღები ვიღაც ”საზიზღარმა” ჰაკერმა რომც ჩაიგდოს ხელში, მაინც არ გამოადგება. იმიტომ რომ არც ერთი დახურული გასაღები არ იცის.
თუ ვიმნეს უფრო მეტი გაინტერესებთ RSA-ზე (საწყისი კოდი და ა.შ.) მოძებნეთ PGP, ეგეც იგივე ალგორითმზეა დაფუძნებული და open source არის. ანუ არაკომერციულია. ისე ჩემი რჩევა, ნუ ეცდებით RSA-ს დაწერას, ალგორითმი კი არის მარტივი გასაგებათ, მაგრამ დასაწერად საკმაოდ არატრივიალურია. ყველა ენას აქვს მაგის უამრავი ბიბლიოთეკა და Windows-საც აქვს კრიპტო აპი. ასე რომ დრო არ დაკარგოთ.
ეხლა ცოტა MD5-ზე, MD5 პრინციპში კრიპტაციასთან კავშირში არ არის. MD5 ერთ-ერთი ხეშ ფუნქციაა. კრიფტაციის ფუნქციებიდან განსხვავებით ხეშ ფუნქციებს შებრუნებული ფუნქცია არ გააჩნიათ. ანუ აბსილიტურად შეუძლებელია უკუღმა აღდგენა. მაგალითისთვის y=x^2, ყველამ კარგად იცით რაც არის. y=4-თვის ამ ფუნქციას ორი x შეესაბამება -2 და 2 ასე, რომ ზუსტად ვერ გაიგებთ რომელ არგუმენტზე მიიღო ფუნქციამ მნიშვნელობა 4. ეხლა წარმოიდგინეთ ფუნქცია, რომელიც უამრავ x-ზე იღებს ერთი და იგივე y-ს, ყველა ესეთი ფუნქცია ცალმხრივია.
MD5 (Message Digest) არის ხეშ ფუნქცია, რომელიც ნებისმიერი ტექსტისთვის (x არგუმენტი) აბრუნებს 16 ბაიტიან (თუ არ მეშლება) მნიშვნელობას (y რეზულტატს). ყველაზე პრიმიტიული ხეშ ფუნქციის რეალიზაცია ძალიან მართივია, მაგალითად დაითვალით რაიმე long l-ში ტექსტის სიმბოლოების ჯამი. როცა l გადაივსება ისევ ნულიდან დაიწყებთ. ასე რომ ნებისმიერი ფაილის ხეშს დათვლით საკმაოდ ადვილად მისი სიმბოლოების კოდების ჯამით. პრობლემა ისაა, რომ ასეთი წესით დათვლილი ხეშ-კოდი სტრიქონებისთვის ”abcd” და ”bacd” ან ”abdc” და კიდევ სხვებისთვის ერთი და იგივე იქნება. MD5 იმდენად “ჭკვიანია” რომ ყველა ამ სტრიქონს სხვასდასხვა კოდს დაუგენერირებს. ზუსტად ამით იზომება ხეშ ფუნქციის ავკარგიანობა, ის ფუნქციაა უკეთესი სადაც ალბათობა მზგავსი მონაცემებისთვის კოდის დამთხვევისა ძალიან მცირეა.
რაში გამოიყენება ხეშ ფუნქციები? უამრავ რამეში, მაგალითად ... ეხლა კარგი და მოკლე მაგალითი არ მახსენდება

. აუ, ისედაც რამდენი დამიწერია

ასე რომ თუ ვინმეს დაგაინტერესებთ სხვა დროს მოგწერთ.
მემგონი ყველა დროის პოსტის რეკორდი მოვხსენი, გპირდებით მეორედ ამას მეტს აღარ ვიზავ, ვინც ბოლომდე ჩაიკითხეთ არ მცემოთ