RSA_NO_PADDING отличается между Java и C ++?

В Java я использую Bouncy Castle зашифровать данные с помощью заполнения:

Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");

Кодированный в Base64 результат:

AAAAAAAAAAAAAAAAA.....H6hBDxOrCI0K8fd13vOYtsKdo4SI3VZTa3...

Муравей это не изменится каждый раз.

И в C ++ я использую OpenSSL библиотека для шифрования данных:

RSA_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING);

Кодированный в Base64 результат:

bxeeBPfFRJsLOzJLMS/qGKtDe1zPw8H491QsE+uuRRay6/ep69fqv386j8...

И это изменится каждый раз, когда я запускаю код.

Я читаю вики и знаю RSA-шифрование — это детерминированный алгоритм шифрования..

Таким образом, результат Java является разумным и мой вопрос:

  1. «АААААААА …» правильный для дополнения Java?
  2. Что сделал openssl в C ++ код, чтобы вызвать результат, кажется, имеет набивка а время меняется?

Обновить

Я обнаружил, что мой код Java правильный.
А также При вызове RSA_private_encrypt с RSA_NO_PADDING вход должен
имеют тот же размер, что и модуль ключа RSA.
.После того, как я заполнил свой ввод до 256 байтов, openssl может расшифровать результат шифрования Java.

Итак, вопрос стал:

Что openssl сделал, чтобы заполнить ввод для достижения необходимой длины?

Обновить

Наконец, у меня не так много времени, чтобы исследовать OAEP в openssl. И сервер использует этот небезопасный способ из-за проблемы с историей. Поэтому я заполняю свой ввод байтом 0. Так же, как:

This is input                         //<-----following many ASCII 0 char to reach 256 bytes length

Но это приведет к тому же результату. Любой другой код должен предотвратить это на сервере и клиенте.

2

Решение

И это будет меняться каждый раз, когда я запускаю код.

Да. Это связано с Оптимальное асимметричное заполнение шифрования (OAEP).

Если вы отправляете одно и то же сообщение дважды, Атака на рассвете, Ваш противник, который наблюдает за сообщением, не сможет ничего узнать (или сделать обоснованное предположение), когда он увидит сообщение снова. Свойство известно как семантическая безопасность или Зашифрованность текста (IND-CPA).

Вот соответствующий доклад доктора Мэтта Грина о дополнении PKCS и дополнении OAEP. Это очень доступно: Плохая пара лет для индустрии криптографических токенов.


Правильно ли заполнение «AAAAAAAA …» для заполнения Java?

Возможно. Я считаю, что это просто строка из ведущих байтов 0x00, которые были закодированы в Base64.


Что openssl сделал в коде C ++, чтобы вызвать результирующее заполнение и изменение времени?

Его использование OAEP.


Итак, возникает вопрос:
Что openssl сделал, чтобы заполнить ввод для достижения необходимой длины?

Его использование OAEP.

Может возникнуть вопрос: почему Java не использует его, потому что отсутствие OAEP означает, что вы можете утечь информацию для каждого зашифрованного сообщения.

2

Другие решения