Это приложение с открытым исходных кодом создано для шифрования текста (или «секретных сообщений»). Оно шифрует текст с использованием сквозного шифрования (E2E), чтобы только вы или человек, которому вы доверяете и который знает пароль, могли его прочитать.
Шифрование и дешифрование происходят на вашем устройстве. Приложение работает полностью на стороне клиента и может использоваться офлайн. Ваши данные никуда не передаются и нигде не хранятся.
После шифрования вы получаете три самодостаточных части:
Эти части необходимы для расшифровки, они не хранятся в приложении или на серверах. Для успешной расшифровки потребуются эти данные, пароль и количество итераций которые использовались при шифровании.
Как выглядит | Описание |
---|---|
Edit | Режим редактирования |
Markdown | Превью в markdown |
Ввести пароль & итерации | |
Зашифровать. Нажмите чтобы зашифровать | |
Расшифровать. Нажмите чтобы расшифровать | |
Мануальный ввод данных: SALT, IV, DATA | |
Получить QR-код | |
Поменять ширину редактирования/превью |
Соберите ссылку по частям, или просто перейдите по ссылки (или QR-Code) и убедитесь что в адресной строке у вас ссылка вида # + <SALT> : <IV> : <DATA>
.
Или используйте , чтобы ввести данные вручную.
Чем больше итераций, тем больше нагрузка, больше времени нужно чтобы зашифровать/расшифровать, тем сильнее шифрование.
Количество итераций масштабируется:
Количество итераций не может быть меньше 1.
Текст сжимается и преобразуется в WordArray (массив 32-битных слов):
const compressedMessage = LZString.compressToUint8Array(message);
const messageWordArray = CryptoJS.lib.WordArray.create(compressedMessage);
Создается ключ с помощью алгоритма PBKDF2 на основе случайно сгенерированной соли, введенного пароля и кол-ва итераций:
const generateKey = (password: string, salt: string, iterations: number): CryptoJS.lib.WordArray => {
return CryptoJS.PBKDF2(password, salt, {
keySize: 256 / 32,
iterations: iterations,
});
};
const salt = CryptoJS.lib.WordArray.random(128 / 8).toString();
const key = generateKey(password, salt, iterations);
С помощью созданного ключа алгоритмом PBKDF2 и случайно сгенерированным IV (Initialization Vector - Вектор инициализации) текст шифруется алгоритмом шифрования AES-256 в режиме CBC (Cipher Block Chaining) с заполнением PKCS7:
const iv = CryptoJS.lib.WordArray.random(128 / 8);
const encrypted = CryptoJS.AES.encrypt(messageWordArray, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
Вектор инициализации (IV) необходим для обеспечения уникальности шифрования даже при повторном использовании одного и того же ключа.
На выходе получается объединенная строка в формате # + <SALT> : <IV> : <DATA>
:
return salt + ":" + iv.toString() + ":" + encrypted.toString();
Расшифровка происходит также, только в обратном порядке.
Все эти данные (SALT & IV) нужны для расшифровки DATA.
6
qwerty
SALT, IV, DATA
SALT: 05f2cc85783d31c30d27fbdd3482eefe
IV: 5879f308fdda0f58bc2a2dc25e8f5a14
DATA: TyoQu72aMK1oXboMPA64IhjDXWkFo/tnywQZY6OWGQ99fcSSR3VrHnOrC35UNIvyajLkumEnDYuCYdn79vq0Wtf9J/tHhUZYDqf6+AFhLjGlWYv3P0Pyv6tC6reVuDBQ9gjz+1JWMi+GeRz6JFmoB65eA+f8+EO3MCQ2ko8KH5pvvDvgwZBbje8zHxXiFNchlB0dIdljxdY12yoCia1b6xX+KV/ihoEmXtRmhHptiBpyJDfbwzABxv0dxT4+OI+N0JCQmDSQF1iMpsmHUHzYCSVlVP4JRp8PzaHRkI+iJWIsXOD+FOoCJmCHOqwBBZ/jYLq277S0g8hr/TsBrVxcbpdnA4b6RluF+RdgUSfMYOhWeH5twwkceg6FfSNF2F+1b7GyzGDq5lxgMXewiaoOpGhaLgkNllKAQbG8rS31j7nknhM2dyURu3QCmTvwGnaTPMgVEHFO0pqoKxOKojwo4dR4Q4jsK6sxcHa50U/bPNi3LGd0H/hY4SKt1wLsTUiYuM2g/zRdAtg4GekJo0EhF3zWmITDNUjiqHYK+wiX5fRCIrlnnEvbMZjRziUDRX26nrQPs6fYMVAF5YgQVGzLlIs0uKO3EC0WyPqtNAVxuFBfLdygKeXnoCr2U7CwOMf0B7OY4I6NSpC5++YITcsZzQ==
Соль (SALT):
05f2cc85783d31c30d27fbdd3482eefe
IV:
5879f308fdda0f58bc2a2dc25e8f5a14
Зашифрованные данные (DATA):
TyoQu72aMK1oXboMPA64IhjDXWkFo/tnywQZY6OWGQ99fcSSR3VrHnOrC35UNIvyajLkumEnDYuCYdn79vq0Wtf9J/tHhUZYDqf6+AFhLjGlWYv3P0Pyv6tC6reVuDBQ9gjz+1JWMi+GeRz6JFmoB65eA+f8+EO3MCQ2ko8KH5pvvDvgwZBbje8zHxXiFNchlB0dIdljxdY12yoCia1b6xX+KV/ihoEmXtRmhHptiBpyJDfbwzABxv0dxT4+OI+N0JCQmDSQF1iMpsmHUHzYCSVlVP4JRp8PzaHRkI+iJWIsXOD+FOoCJmCHOqwBBZ/jYLq277S0g8hr/TsBrVxcbpdnA4b6RluF+RdgUSfMYOhWeH5twwkceg6FfSNF2F+1b7GyzGDq5lxgMXewiaoOpGhaLgkNllKAQbG8rS31j7nknhM2dyURu3QCmTvwGnaTPMgVEHFO0pqoKxOKojwo4dR4Q4jsK6sxcHa50U/bPNi3LGd0H/hY4SKt1wLsTUiYuM2g/zRdAtg4GekJo0EhF3zWmITDNUjiqHYK+wiX5fRCIrlnnEvbMZjRziUDRX26nrQPs6fYMVAF5YgQVGzLlIs0uKO3EC0WyPqtNAVxuFBfLdygKeXnoCr2U7CwOMf0B7OY4I6NSpC5++YITcsZzQ==
Приложение работает на клиенте.
Ничего не хранится в базе данных.
Базы данных не существует.