Асимметричное детерминированное шифрование (RSA) с помощью Ruby

StackOverflow https://stackoverflow.com/questions/4475407

  •  11-10-2019
  •  | 
  •  

Вопрос

Мне было интересно, знает ли кто-нибудь способ детерминированного шифрования значения в Ruby с использованием асимметричного алгоритма шифрования.

Для большинства вариантов использования важно только то, что когда вы шифруете 'A', вы получаете 'A' обратно при его расшифровке, то есть вас не волнует само зашифрованное значение.Вас интересует только полная поездка туда и обратно.

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

Когда я пытаюсь зашифровать значение с помощью OpenSSL::PKey::RSA::NO_PADDING возвращается сообщение об ошибке:

OpenSSL::PKey::RSAError Exception: data too small for key size

У кого-нибудь есть идея о том, как я могу получить детерминированное зашифрованное значение с помощью RSA?

С наилучшими пожеланиями,

ДБА

Это было полезно?

Решение

Эта ошибка возникает из-за криптография/rsa/rsa_none.c

int RSA_padding_add_none(unsigned char *to, int tlen,
    const unsigned char *from, int flen)
    {
    if (flen > tlen)
            {
            RSAerr(RSA_F_RSA_PADDING_ADD_NONE,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
            return(0);
            }

    if (flen < tlen)
            {
            RSAerr(RSA_F_RSA_PADDING_ADD_NONE,RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE);
            return(0);
            }

    memcpy(to,from,(unsigned int)flen);
    return(1);
    }

Звонил из rypto/rsa/rsa_eay.c

static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
         unsigned char *to, RSA *rsa, int padding)
...
               i=RSA_padding_add_none(buf,num,from,flen);

Тот Самый flen это сообщение, лен;и тот tlen находится от: num=BN_num_bytes(rsa->n);

Итак, Вам нужно, чтобы ваши данные имели ту же длину в байтах, что и ваши N параметр ключа RSA

Кроме того, как я знаю, ваши данные должны быть меньше N (если рассматривать их как одно длинное-длинное-длинное двоичное число).

Другие советы

Вы можете выполнить прокладку до соответствующей длины ключа сами с помощью нелуряющих данных

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top