Начало / Икономика / Какво е Биткойн част II: Криптографията зад криптовалутите

Какво е Биткойн част II: Криптографията зад криптовалутите

Автор: Стилгар 

Това писание има за цел да запознае непрограмисти с това как Bitcoin функционира на техническо ниво. Как е възможно да няма централен сървър и никой да не го контролира? Въпреки че обяснението е опростено това не е текст с неточни метафори, а сериозно описание с математика. Въпреки че математиката е на ниво максимум шести клас и е опростена максимално това не е леко четиво за хора, които нямат навика да четат текст свързан с математика. За криптографски концепции които са твърде сложни за да бъдат обяснени тук (изискват математика за 12ти клас) е включено само обяснение за това какво може да се постигне с тях. За радост тези инструменти съществуват преди Bitcoin и Bitcoin ги използва наготово.

За начало е важно да разберем, че всичко в компютрите е число. Текст? Може да дадем на всяка буква номер и после да имаме поредица от числа. Картинка? Може всеки пиксел да е три числа за червено, зелено и синьо и картината да е поредица от числа. Поредицата от числа наредени едно след друго можем да третираме като едно много голямо число. Затова в долните обяснения когато обясняваме нещо за произволно големи числа може да се счита че важи за какви да е данни.

Номерата на символите за главни букви от латинската азбука както са дефинирани в ASCII – American Standard Code for Information Interchange. На практика всички компютри ползват тези номера за тези символи. Малките букви имат отделни номера. Символи като запетайка или дори невидими символи като интервала също имат номера.

Публичен и частен ключ

Криптографията с публичен и частен ключ съществува от 70те и се ползва масово и навсякъде в Интернет. Когато видиш катинарче до адреса в браузъра това означава, че връзката е криптирана и за целта се използва подобна криптография. Публичният ключ се обявява публично и не е тайна (въпреки че в някои ситуации може би е добре да обявяваш, че е твой под псевдоним както прави Сатоши Накамото).

Частният ключ свързан с него трябва да се пази тайна. Ключовете са две числа свързани с магията на математиката. Избират се много големи такива числа и обикновено се записват с малко допълнителна информация в бройна система в основа 64 (или друга голяма основа), за да са по-кратки. Ето примерен комплект:

––BEGIN RSA PRIVATE KEY–– MIICXAIBAAKBgQCDUb6HaTNpyNF8bn9/3X6cTiBkbWfbjPdZwjus0DlLXWfTFhhP 5fckSjn0j38UdPpFBasiA2B22BzAWnRClZ3OtPtMeogrnaNnj1ETBOU0wq2Ka+VV Xdb/UjURj+nVQeXmKjiw2XkkkR1FBRbAXkLRGKTdFy8g5Ozcbly/knQdTQIDAQAB AoGATaKRKor2W07fElpdRGHVTWEe42CO6wyO22DqWMONa9Hf5LqGSw4gqzK6yqvf LF/v6chtISGv8PLZJJsVapv7e/CO6UqwX962ngRXOW5/WPbAkYMhlSfQ8R+womf3 KALNNbjwVvV5bjm5j6NqWhMyvrHM6GPlqPpzCeuEvH7xGaECQQDiFrwUoGho52ws hZN7H+rRIlAr7cTDNgWP6oWy2ED6A3E37Zk680LmE4vTDf4GtKt2fN0gtAEoXnpF xu7V+FCpAkEAlLFRnIsXZUt2HDoxHi91ZHsjEsyEMV+yI2Fp4NMTBAoSHQkbFSry ed/bbZRNWyace2TRntdh8OYtyQ1vFRp6BQJBANRjwyAlaLBT5v0UJu3dl/wLHgGG hfdUwnjmOd8+5Bt6LFv76pzEda4p4orMdDzccM8IkbrtHsFLr9XpAekkMrECQFiw 58AbSwo1l67AmxmpLzmPJV2KNfOJZCUsbs4WuMn5A9Lj4o6evmEpwKW9BuMuxbno agx35kid04OQCskosM0CQFir7K7SjX0ZgsbehdMy1JBHcibr/4wqaKScmX1IukCN iaX0QngtfKE3jds2asvRUpxa7OiT2audl8xPdRkigwU=
––END RSA PRIVATE KEY––

––BEGIN PUBLIC KEY–– MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDUb6HaTNpyNF8bn9/3X6cTiBk bWfbjPdZwjus0DlLXWfTFhhP5fckSjn0j38UdPpFBasiA2B22BzAWnRClZ3OtPtM eogrnaNnj1ETBOU0wq2Ka+VVXdb/UjURj+nVQeXmKjiw2XkkkR1FBRbAXkLRGKTd Fy8g5Ozcbly/knQdTQIDAQAB
––END PUBLIC KEY––

Ключовете обикновено не се разпространяват в текстов вид а са скрити в някакви файлове с които работят програмите. Например Bitcoin портфейлите обикновено имат специален файл в който стоят ключовете криптирани (с парола). Буквите и другите символи в горния пример служат за цифри над 10 (A означава 10, B означава 11 и т.н.). Записването не е особено важно, просто приеми, че това са много големи числа. Генерирането им става като се измислят две големи прости числа отговарящи на някакви условия и се прекарат през процедура от която излизат двата ключа. Двата ключа са „магически“ свързани и от публичния ключ няма как ефективно (бързо) да се намери частния. Би могло да се направи с много опити, но причината да избираме големи числа е за да сме сигурни, че опитите са толкова много, че да е безсмислено да се опитва чрез налучкване дори всички компютри на света да се впрегнат в това. Чрез криптографски алгоритми с тези два ключа могат да се правят две неща. Първото е криптиране на данни с публичния ключ така че само притежателят на частния ключ може да ги декриптира. Това става като данните се превръщат в числа и после се смесват с ключа чрез поредица от аритметични операции. Криптираните данни (наричани cyphertext) се смесват чрез аритметични операции с частния ключ и така се декриптират.

Втората операция, която е много по-важна за Bitcoin, е подписването. Една информация може да бъде подписана с частния ключ така че всеки може да провери с помощта на публичния ключ, че подписът е точно от притежателя на частния ключ (отговарящ на този публичен ключ). Данните се смесват с частния ключ чрез аритметични операции и се получава едно (голямо) число което наричаме подпис. После данните се дават заедно с полученото число (подписа) и с друг алгоритъм, включващ публичния ключ, данните и подписа, се проверява дали подписът е валиден. Генерирането на „фалшив“ подпис е на практика невъзможно. На практика проверката става с програмка, а още по-често е вградена в софтуера (например катинарчето в браузъра означава, че проверката е минала успешно).

Криптографски хеш функции

Функция в математиката е операция при която на едно число (или по-общо – данни) x се намира съответно друго число y така че на всеки x съответства точно един y, но на всеки y може да съответстват много x. Примери:

y = x + 5
y = 1 (за всяко x резултатът е 1)
y = 5 ако x е между 10 и 20, а в противен случай y = 3

(Алтернативен запис е f(x) = x + 5, където f е име на функция)

Хеш функциите са функции за които аргументът може да е всякакъв, но стойността на функцията винаги е в определен интервал и обикновено искаме при равномерно разпределение на аргумента функцията също да е равномерно разпределена в интервала. Например може да искаме резултатът от функцията винаги да е между 0 и 9 включително.

Една проста такава функция е y = x mod 10 – където „mod“ е деление с остатък и резултатът е остатъкът, например:

5 mod 10 = 5;
15 mod 10 = 5;
10 mod 10 = 0;
23 mod 10 = 3 и т.н.

Учи се във втори клас, понякога се нарича „деление по модул N“, а в програмните езици се използва символът %, например 23 % 10 се чете „23 делено по модул 10“. Може да мислите за тази операция като „превъртане“ – като се стигне до N просто започваме пак от 0. Делението по модул е често използвана операция в криптографията и програмирането. Забележете че, ако аргументът x е равномерно разпределен то и функцията (резултатите) ще са равномерно разпределени в интервала [0, 9]. В същото време, ако вземем горната функция

y = 5 и ако x е между 10 и 20, а в противен случай y = 3

то резултатите няма да са равномерно разпределени и ще има много повече резултати 3 отколкото 5 защото има много числа извън интервала [10, 20] и само 11 числа в него. Затова не наричаме тази функция хеш функция.

Какво обаче е криптографска хеш функция? Горният ни пример за хеш функция може да бъде обърнат – възможно е от резултат да бъде получен аргумент който да отговаря на този резултат. Криптографските хеш функции се конструират така че да не може със сметки да се извърши обратната операция. Те са сложни и включват интересни разбърквания, а резултатите от тях са много големи числа, за да е трудно да се намери аргумент чрез прости опити. Второто изискване, за да бъде една функция криптографски хеш е да не могат да се намерят колизии (да не са известни). Колизия означава различни данни да имат един и същи хеш. Колизиите съществуват за всички криптографски хешове, но никой не може да ги намери. Ако се намери колизия съответната хеш функция се счита за счупена.

Друг начин да се мисли за криптографския хеш е сякаш предварително, за всички възможни данни сме генерирали случайно число което да им съответства и си държим тези числа в таблица. Когато ни подадат аргумент проверяваме в таблицата и вадим случайното число (за едни и същи входни данни винаги вадим същото число). Таблицата е тайна. Разбира се на практика няма как да се направи това защото потенциалните входни данни са безкрайни, но целта на хеш функциите е да са неразличими по поведение от такава хипотетична хеш функция. Хешът трябва да е неразличим от случайно генериран.

Криптографски хеш може да се използва, за да се провери дали файл е истински. Например производител на софтуер може да сложи хеша на софтуера си на сайта си и да предложи link за сваляне от друго място (например торент или чужд сървър). Потребителят може да свали файла и да се увери, че хешът му е същият (като генерира отново хеша по алгоритъма на съответната хеш функция). Ако хешът е същият то файлът не е променен и е точно каквото производителят на софтуера е пуснал защото никой не би могъл да съчини различна поредица от данни, която да произведе същия хеш. (Ако може това не е криптографска хеш функция или функцията е счупена).

Bitcoin използва криптографска хеш функция наречена SHA-256. Важно е да се спомене, че при криптографските хешове дори малка промяна на данните (примерно 1 буква в текст) води до тотално различен хеш. Пак искам да отбележа, че всичко споменато до тук се използва навсякъде в Интернет от десетилетия и не е измислено за Bitcoin. Всички тези неща не изискват докторска степен по математика или компютърни науки за да се разберат и да се увери човек, че наистина работят и в интернет има курсове (например https://www.coursera.org/learn/crypto), които ги обясняват, но изискват няколко седмици учене. Разбирането и взимането на тестовете става и без познания по програмиране, но практическите задачи изискват програмиране защото все пак трудно се смятат на ръка хиляди аритметични операции.

 

Хареса ли ви? Отделете минута да подкрепите ЕКИП в Patreon!
Become a patron at Patreon!

Относно Гост Автор

Прочети още

Финансовият преврат в България от 1947 г.

1947 година в българската история е свързана с провеждането на важна парична реформа. Тя е …