tools / rsa
rsa/
Шифрование RSA открытым ключом и расшифровка закрытым, а также шифрование закрытым ключом и расшифровка открытым. Дополнение, формат ключа, форматы ввода и вывода и кодировка настраиваются, а ключи не покидают браузер.
Открытый текст
Ключ
Шифртекст
История
После каждого успешного шифрования или расшифровки запись сохраняется автоматически. Хранятся последние 20 записей, только в браузере этого устройства. Ключи не сохраняются, но расшифрованный открытый текст сохраняется, поэтому на общем компьютере очищайте историю после работы.
Что такое AES, DES и RSA и чем они отличаются
AES и DES — симметричные шифры: шифрование и расшифровка выполняются одним и тем же ключом, как будто один ключ и запирает дверь, и отпирает. Они быстрые и подходят для больших объемов данных; сложность в том, как безопасно передать этот ключ другой стороне.
DES — старый стандарт 1970-х с эффективным ключом всего 56 бит: его уже можно подобрать перебором на специальном оборудовании или в кластере компьютеров, поэтому он нужен только для связи со старыми системами, которые его все еще используют. AES заменил DES как стандарт. Он использует ключи 128, 192 или 256 бит, практических атак на него сегодня нет, и это выбор по умолчанию для шифрования данных.
RSA — асимметричный шифр: используется пара ключей. Открытый ключ можно давать кому угодно, им шифруют; закрытый хранится у вас, им расшифровывают. Это как почтовый ящик, в который может бросить письмо кто угодно, а открыть его можете только вы. Не нужно заранее договариваться об общем ключе, но RSA медленный и за раз шифрует лишь несколько сотен байт. Реальные системы часто сочетают оба подхода: RSA шифрует случайно сгенерированный ключ AES для другой стороны, а AES шифрует сами данные.
Сколько данных можно зашифровать за один раз
RSA шифрует за один раз лишь небольшой блок данных, предел определяется длиной ключа и способом дополнения. Для PKCS1Padding максимум — длина ключа в байтах минус 11, для ключа 2048 бит это 245 байт; для OAEP — длина ключа в байтах минус удвоенная длина хеша минус 2, для ключа 2048 бит с SHA-256 это 190 байт. Более длинные данные обычно шифруют с помощью AES, а RSA используют для шифрования ключа AES.
Как это соответствует Java
Названия дополнения совпадают с Java Cipher: для RSA/ECB/PKCS1Padding выберите PKCS1Padding; для RSA/ECB/OAEPWithSHA-256AndMGF1Padding выберите третий вариант, так как Java по умолчанию использует для MGF1 SHA-1; если хеши заданы через OAEPParameterSpec, выберите OAEPPadding и отдельно укажите хеш OAEP и хеш MGF1. Кодировки тоже следуют правилам Java, например UTF-16 кодируется с порядком байтов big-endian и началом FE FF.
Почему шифртекст каждый раз разный
При шифровании открытым ключом и PKCS1Padding, и OAEP добавляют в дополнение случайные байты, поэтому один и тот же текст каждый раз дает разный шифртекст, и каждый из них расшифровывается закрытым ключом; это нормально. При шифровании закрытым ключом дополнение фиксированное, и результат всегда одинаков. OAEP работает только для шифрования открытым ключом и расшифровки закрытым.
Какие ключи поддерживаются
PEM поддерживается в четырех вариантах: BEGIN PUBLIC KEY, BEGIN RSA PUBLIC KEY, BEGIN PRIVATE KEY и BEGIN RSA PRIVATE KEY; можно также вставить только Base64 из середины. Hex — то же содержимое в шестнадцатеричном виде. Закрытые ключи с паролем нужно сначала расшифровать. Если выбран тип ключа «Открытый ключ», можно вставить и закрытый ключ — будет использована его открытая часть.
Частые вопросы
Что делать, если расшифровка не удается и появляется «ключ не подходит, неверны тип ключа или дополнение»
Проверьте по очереди три пункта. Первый: парный ли ключ тому открытому ключу, которым шифровали, — данные, зашифрованные открытым ключом, открывает только соответствующий закрытый. Второй: тип ключа должен быть «Закрытый ключ». Третий: дополнение должно совпадать с тем, что использовалось при шифровании; при OAEPPadding также должны совпадать хеш OAEP и хеш MGF1. Наконец, убедитесь, что формат ввода выбран верно: если перепутать hex и base64, расшифровка тоже не удастся.
Что делать, если формат ключа не принимается или сообщается, что CERTIFICATE не поддерживается
Сначала убедитесь, что «Формат ключа» соответствует вставленному содержимому: для текста, начинающегося с -----BEGIN, выберите pem, для длинной строки шестнадцатеричных цифр — hex; при ошибке обычно появляется сообщение, на какой формат переключиться. В PEM должен быть открытый или закрытый ключ RSA, сертификат (BEGIN CERTIFICATE) напрямую использовать нельзя: сначала извлеките открытый ключ командой openssl x509 -in cert.pem -pubkey -noout. Если сертификат и ключ вставлены вместе, блок с ключом выбирается автоматически.
Что делать, если у закрытого ключа есть пароль и появляется «сначала расшифруйте его в ключ без пароля»
Закрытые ключи с паролем здесь не поддерживаются (BEGIN ENCRYPTED PRIVATE KEY или строка Proc-Type: 4,ENCRYPTED в заголовке PEM). Сначала уберите пароль на своем компьютере и затем вставьте ключ, например командой openssl rsa -in original-file -out new-file, введя пароль по запросу. Получившийся файл — закрытый ключ без защиты, поэтому после работы обращайтесь с ним осторожно.
Что делать с сообщением о превышении предела и сколько кириллических букв можно зашифровать
Предел считается в байтах, а не в символах. Для ключа 2048 бит с PKCS1Padding максимум — 245 байт; в UTF-8 кириллическая буква занимает 2 байта (около 122 букв), а китайский иероглиф — 3 байта (около 81 иероглифа); в кодировке GBK иероглиф занимает 2 байта, то есть около 122. При шифровании после вставки ключа рядом с заголовком панели ключа показывается «максимум N байт за одно шифрование» для текущего ключа и дополнения. При превышении выдается ошибка, автоматического разбиения на части здесь нет.
Как расшифровать данные, зашифрованные в браузере через JSEncrypt или Web Crypto
JSEncrypt использует PKCS1Padding и выдает Base64, поэтому здесь выберите дополнение PKCS1Padding и формат ввода base64. RSA-OAEP в браузерном Web Crypto использует один и тот же хеш и для OAEP, и для MGF1, поэтому выберите OAEPPadding и задайте хеш OAEP и хеш MGF1 одинаковыми, например SHA256 для обоих. В обоих случаях выберите тип ключа «Закрытый ключ».
Что означают сообщения «шифртекст длиннее ключа» и «значение шифртекста выходит за допустимый диапазон ключа»
Длина шифртекста RSA равна длине ключа в байтах: 256 байт для ключа 2048 бит, в hex это 512 символов, и больше быть не может. При расшифровке рядом с заголовком панели ключа показывается «Шифртекст: N байт» — сравните это число с количеством байт рядом с полем ввода. Если шифртекст длиннее ключа, чаще всего неверно выбран формат ввода или скопировано лишнее; если значение вне допустимого диапазона, этот шифртекст зашифрован не открытым ключом из пары к этому ключу — используйте правильный ключ.
Можно ли использовать шифрование закрытым ключом и расшифровку открытым для подписи и проверки подписи
Напрямую нельзя. Шифрование закрытым ключом здесь просто применяет закрытый ключ к вашим данным с PKCS1Padding без хеширования, а подпись вроде SHA256withRSA сначала считает хеш, а затем помещает его в фиксированную структуру (DigestInfo). Поэтому если расшифровать здесь открытым ключом стандартную подпись, получится эта структура, а не исходный текст. Для подписи и проверки используйте библиотеку или инструмент, поддерживающий алгоритмы вроде SHA256withRSA.
Что хранится в истории и отправляется ли она куда-то?
Хранится только в localStorage браузера на этом устройстве и никуда не отправляется; в коде страницы нет сетевых запросов. После каждого успешного шифрования или расшифровки добавляется одна запись, хранится не более 20 записей, а те, у которых ввод или результат длиннее 20 000 символов, не сохраняются. В записи есть параметры, ввод и результат, а также 8-символьный отпечаток ключа (первые 8 шестнадцатеричных символов SHA-256 от модуля; он показан после # в записи и нужен, чтобы отличать, тот же ли это ключ), но самого ключа нет, поэтому после «Загрузить» ключ нужно вставить заново. Расшифрованный открытый текст сохраняется, поэтому на общем компьютере после работы нажмите «Очистить историю».