Шифрование данных паролем

Я ищу, чтобы написать такого, что ищут люди, и моя статья была бы полезной. Я нашел вот такой запрос как “Шифрование данных паролем” и сначала не понял, что могут вообще искать люди на такой запрос. Потом немного подумав решил написать статью и о том, что я сам думаю об этом, и что на мой взгляд может быть здесь просто звучит как неправильный запрос к поисковой системе. Итак, давайте в целом поговорим о шифровании данных и как оно делается. Я не буду лазить в технические подробности, такого материала очень много, охвачу лишь краткую суть.
Шифрование данных синхронным ключом
Часто используется такой метод шифрования данных, который позволяет зашифровать их одним ключом и расшифровать им же. Возможно, многие в детстве играли в такую игру как придумывали свой язык или пытались шифровать свои записки подменяя одни буквы другими или вообще другими символами. Вот в сущности это и есть шифрование синхронным ключом. Каким бы не был хорош ключ, если его узнать, данные сможет расшифровать кто угодно. Однако, в современном мире, при создании даже ключа с синхронным алгоритмом шифрования, можно установить пароль на этот ключ. Таким образом, ваш ключ будет лучше защищен, и если его даже скомпроментируют но не будут знать пароля, то и воспользоваться ключом для дешифровки данных все-равно не получится. Но все же это не шифрование данных паролем.
Шифрование данных асинхронными ключами
Данный алгоритм немного посложнее и используется в настоящее время почти во всех случаях шифрования данных, которые используются в современной криптографии. Например, вы заходите на сайт с https://
, который показывается зеленым (или любым другим) замочком в вашем браузере, это как раз и означает, что ваш браузер и сервер установили общение друг с другом с помощью асинхронных ключей. Каждый передал свой открытый ключ друг другу, и с помощью них зашифровывают сообщения. А вот расшифровка происходит закрытым ключем, который никуда не передается. Конечно здесь еще имеет место быть алгоритму Диффи Хельмана, который позволяет безопасно обменяться даже открытыми ключами, но в рамках данной статьи, описывать его мне кажется излишним. Вы без труда найдете информацию об алгоритме если вам интересено.
Ключи для такого вида шифрования применяются разные, возможно вы слышали о PGP или GPG ключах, которыми активно пользуются при шифрвоании файлов, так же возвожмно слышали про RSA. Я лишь хочу сказать, что если вы не хотите глубоко познавать мир современной криптограффи, вам может быть достаточно просто узнавать эти названия и пониматьт, что здесь речь идет о шифровании. Главная суть этого механизма состоит в том, что открытым ключом данные шифруются, а закрытым расшифровываются. Таким образом, получается что вы можете безопасно передать свой открытый ключ кому угодно, и он сможет зашифровать файл или сообщение для вас, а расшифровать сможете его только вы - обладатель закрытого ключа.
Кто пользовался GPG шифрованием и программами, наверняка видели, что есть даже общественные серверы для обмена открытыми ключами. По открытому ключу подобрать закрытый невозможно, поэтому даже размещение его на общественные обменники, никакой опасности не несет. Как и в случае с синхронным ключом, в асинхронном на закрытый ключ можно установить пароль, и любая программа или утилита, которая будет расшифровывать данные вашим закрытым ключом у вас спросит пароль, так как клю дополнительно зашифрован с помощью пароля, и без пароля восстановить целостность ключа не возможно. Однако, это тоже не шифрование паролем, в моем понимании.
Шифрование данных паролем
Теперь добрались до раздела, который называется как вся эта статья. Я не знаю, что имелось ввиду в данном запросе, о попробую предположить, что для шифрования данных используется не какой то ключ, а именно пароль. Т.е. такой способ шифрования данных можно сравнить с шифрованием данных синхронным ключом, но отличием будет то, что вместо ключа используется пароль. Обычно пароль, даже хороший это 20 символов, а ключи шифрования сейчас используются не менее чем 512 битные. Отсюда можно сразу сказать, что надежность такого шифрования данных низкая. 20 символов подобрать на современном компьютере, ради получения каких-либо ценных данных это всего пара минут времени. На слабом компьютере речь может идти о паре часов. Но это все равно очень незначительно. Однако способ есть. И если вы просто хотите разобраться с шифрованием данных, то шифрование данных паролем не плохой способ разобраться, вот почему:
- Маловероятно, что вы найдете готовую программу для этого, так как это не является надежным способом шифрования
- Исходя из первого, вам придется самим написать такую программу, но не переживайте это довольно легко.
- Вы узнаете как работаете перемешивание символов, которое используется в любом шифровании.
Я попытаюсь очень просто и кратко объяснить как это работает.
Шифрование происходит всегда с помощью перемешивания символов. Т.е. замена одних символов другими, но вот подбор таких символов и отличает разные алгоритмы шифрования. Ну если очень упрощенно. Так вот, для перемешивания вы действительно можете использовать не ключ а любой пароль.
Как это работает?
Шифрование паролем как и любым ключом возможно потому что каждый символ имеет свой код в различных системах исчисления. Конечно здесь, обычно имеется ввиду бинарная система исчисления и кодировка ASCII, но не всегда. Тем не менее, будем считать, что у каждого символа есть код в какой то системе, и мы можем подменять одни символы другими, даже используя такую вещь как пароль. Просто мы будем подменять отсутствующие байты байтами из пароля, в терминологии криптографии это называется соль. С помощью соли перемешивают байты в исходной строке, и их всегда можно восстановить, зная эту соль, если зашифровали данные только с ее помощью. Далее если хотите сами попробовать и знаете какой-то минимум языка JavaScript можете попробовать использовать функции, которые я напишу ниже в консоли nodejs.
function crypt(salt, string) {
let sumSalt = getSaltSum(salt);
return Buffer.from(crypterCicle(string, sumSalt)).toString('base64');
}
function decrypt(salt, crypted) {
let sumSalt = getSaltSum(salt);
let decodedBase64 = Buffer.from(crypted, 'base64').toString();
let decrypted = '';
return crypterCicle(decodedBase64, sumSalt);
}
function crypterCicle(string, sumSalt) {
let result = '';
for (let symbol in string) {
let char = string[symbol].charCodeAt() ^ sumSalt;
result += String.fromCharCode(char);
}
return result;
}
function getSaltSum(salt) {
let sumSalt = 0;
for (let symbol in salt) {
sumSalt += salt[symbol].charCodeAt();
}
return sumSalt;
}
Возьмем в качестве нашего пароля (или правильней сказать соли) просто 123
для примера и шифровать мы будем фразу Пример
. Вводим:
crypt('123', 'Пример')
'0onTltKu0qrSo9OW'
И вот выпавшая строка '0onTltKu0qrSo9OW'
как раз и есть наше зашифрованное слово Пример.
Чтобы расшифровать обратно, нужно знать соль и вот эта наша строка, делаем так:
> decrypt('123', '0onTltKu0qrSo9OW')
'Пример'
И видим наше исходное слово. Если ошибиться хоть на один символ в соли, то мы уже не получим исходное слово. Давайте попробуем вместо 123 написать 122:
> decrypt('122', '0onTltKu0qrSo9OW')
'Мулпжу'
Получаем Мулпжу
, что явно не соответствует нашему исходному зашифрованному слову Пример
. Вот таким образом и возможно шифрование данных паролем.
Надеюсь было не очень сложно, и вы дочитали до конца, чтобы прочитать мою благодарность за прочтение! Спасибо, что прочли, напишите комментарий здесь или в нашем
телеграм канале, если хотите высказаться на этот счет.