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

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

Я ищу, чтобы написать такого, что ищут люди, и моя статья была бы полезной. Я нашел вот такой запрос как “Шифрование данных паролем” и сначала не понял, что могут вообще искать люди на такой запрос. Потом немного подумав решил написать статью и о том, что я сам думаю об этом, и что на мой взгляд может быть здесь просто звучит как неправильный запрос к поисковой системе. Итак, давайте в целом поговорим о шифровании данных и как оно делается. Я не буду лазить в технические подробности, такого материала очень много, охвачу лишь краткую суть.

Шифрование данных синхронным ключом

Часто используется такой метод шифрования данных, который позволяет зашифровать их одним ключом и расшифровать им же. Возможно, многие в детстве играли в такую игру как придумывали свой язык или пытались шифровать свои записки подменяя одни буквы другими или вообще другими символами. Вот в сущности это и есть шифрование синхронным ключом. Каким бы не был хорош ключ, если его узнать, данные сможет расшифровать кто угодно. Однако, в современном мире, при создании даже ключа с синхронным алгоритмом шифрования, можно установить пароль на этот ключ. Таким образом, ваш ключ будет лучше защищен, и если его даже скомпроментируют но не будут знать пароля, то и воспользоваться ключом для дешифровки данных все-равно не получится. Но все же это не шифрование данных паролем.

Шифрование данных асинхронными ключами

Данный алгоритм немного посложнее и используется в настоящее время почти во всех случаях шифрования данных, которые используются в современной криптографии. Например, вы заходите на сайт с https://, который показывается зеленым (или любым другим) замочком в вашем браузере, это как раз и означает, что ваш браузер и сервер установили общение друг с другом с помощью асинхронных ключей. Каждый передал свой открытый ключ друг другу, и с помощью них зашифровывают сообщения. А вот расшифровка происходит закрытым ключем, который никуда не передается. Конечно здесь еще имеет место быть алгоритму Диффи Хельмана, который позволяет безопасно обменяться даже открытыми ключами, но в рамках данной статьи, описывать его мне кажется излишним. Вы без труда найдете информацию об алгоритме если вам интересено.

Ключи для такого вида шифрования применяются разные, возможно вы слышали о PGP или GPG ключах, которыми активно пользуются при шифрвоании файлов, так же возвожмно слышали про RSA. Я лишь хочу сказать, что если вы не хотите глубоко познавать мир современной криптограффи, вам может быть достаточно просто узнавать эти названия и пониматьт, что здесь речь идет о шифровании. Главная суть этого механизма состоит в том, что открытым ключом данные шифруются, а закрытым расшифровываются. Таким образом, получается что вы можете безопасно передать свой открытый ключ кому угодно, и он сможет зашифровать файл или сообщение для вас, а расшифровать сможете его только вы - обладатель закрытого ключа.

Кто пользовался GPG шифрованием и программами, наверняка видели, что есть даже общественные серверы для обмена открытыми ключами. По открытому ключу подобрать закрытый невозможно, поэтому даже размещение его на общественные обменники, никакой опасности не несет. Как и в случае с синхронным ключом, в асинхронном на закрытый ключ можно установить пароль, и любая программа или утилита, которая будет расшифровывать данные вашим закрытым ключом у вас спросит пароль, так как клю дополнительно зашифрован с помощью пароля, и без пароля восстановить целостность ключа не возможно. Однако, это тоже не шифрование паролем, в моем понимании.

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

Теперь добрались до раздела, который называется как вся эта статья. Я не знаю, что имелось ввиду в данном запросе, о попробую предположить, что для шифрования данных используется не какой то ключ, а именно пароль. Т.е. такой способ шифрования данных можно сравнить с шифрованием данных синхронным ключом, но отличием будет то, что вместо ключа используется пароль. Обычно пароль, даже хороший это 20 символов, а ключи шифрования сейчас используются не менее чем 512 битные. Отсюда можно сразу сказать, что надежность такого шифрования данных низкая. 20 символов подобрать на современном компьютере, ради получения каких-либо ценных данных это всего пара минут времени. На слабом компьютере речь может идти о паре часов. Но это все равно очень незначительно. Однако способ есть. И если вы просто хотите разобраться с шифрованием данных, то шифрование данных паролем не плохой способ разобраться, вот почему:

  1. Маловероятно, что вы найдете готовую программу для этого, так как это не является надежным способом шифрования
  2. Исходя из первого, вам придется самим написать такую программу, но не переживайте это довольно легко.
  3. Вы узнаете как работаете перемешивание символов, которое используется в любом шифровании.

Я попытаюсь очень просто и кратко объяснить как это работает.

Шифрование происходит всегда с помощью перемешивания символов. Т.е. замена одних символов другими, но вот подбор таких символов и отличает разные алгоритмы шифрования. Ну если очень упрощенно. Так вот, для перемешивания вы действительно можете использовать не ключ а любой пароль.

Как это работает?

Шифрование паролем как и любым ключом возможно потому что каждый символ имеет свой код в различных системах исчисления. Конечно здесь, обычно имеется ввиду бинарная система исчисления и кодировка 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')
'Мулпжу'

Получаем Мулпжу, что явно не соответствует нашему исходному зашифрованному слову Пример. Вот таким образом и возможно шифрование данных паролем. Надеюсь было не очень сложно, и вы дочитали до конца, чтобы прочитать мою благодарность за прочтение! Спасибо, что прочли, напишите комментарий здесь или в нашем телеграм канале, если хотите высказаться на этот счет.

comments powered by Disqus