Необработанное подписание - это не что иное, как модульное возведение в степень. Сейчас вроде бы есть два варианта, но в основном останется только один. Я объясню ниже.
Прежде всего, можно подумать, что использование Signature
с "NoneWithRSA"
должно работать. Алгоритм действительно существует, но, к сожалению, все еще работает; он просто удаляет структуру ASN.1 с указанием хэш-функции и значения. Так что этот недоступен.
Хотя подписание - это не то же самое, что шифрование, обе операции в конечном итоге полагаются на модульное возведение в степень. Так что, к счастью, можно использовать экземпляр Cipher
для создания необходимых вам функций:
Security.addProvider(new BouncyCastleProvider());
Cipher rsa = Cipher.getInstance("RSA/ECB/NoPadding", BouncyCastleProvider.PROVIDER_NAME);
rsa.init(Cipher.DECRYPT_MODE, kp.getPrivate());
byte[] signatureUsingCipher = rsa.doFinal("owlstead"
.getBytes(StandardCharsets.UTF_8));
System.out.println(Hex.toHexString(signatureUsingCipher));
Теперь следует отметить, что Bouncy Castle выполняет несколько иную операцию, чем поставщик Oracle SunJCE. Вместо того, чтобы просто удалить заполнение, он также забывает передать зашифрованный текст через алгоритм I2OSP (см. Стандарт PKCS # 1), который правильно кодирует выходной размер модуля. Таким образом, вы можете иметь зашифрованный текст меньшего размера, чем 128 байтов для определенных комбинаций ключа / открытого текста. Это очень легко увидеть, зашифровав значение 0, где на выходе будут нулевые байты.
Наконец, обратите внимание, что указание режима Cipher.ENCRYPT
или Cipher.DECRYPT
не имеет значения; оба просто выполняют модульное возведение в степень. Однако Cipher.DECRYPT с большей вероятностью ожидает закрытый ключ, поэтому я использовал его в приведенном выше коде.
Вы можете сгенерировать пару ключей для тестирования приведенного выше кода следующим образом:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
Предупреждение: создание подписи без безопасного заполнения небезопасно; это может привести к атакам экзистенциальной подделки. Вы можете использовать это только как строительный блок для создания безопасной схемы.
person
Maarten Bodewes
schedule
30.10.2016
NoneWithRSA
или простоRSA
. Надежный провайдер также может выполнять PSS с различными хешами, а также безRSASSA-PSS RawRSASSA-PSS NoneWithRSASSA-PSS
- person dave_thompson_085   schedule 26.10.2016