Ruby的非对称确定性加密(RSA)

时间:2010-12-17 22:44:20

标签: ruby rsa encryption-asymmetric

我想知道是否有人知道使用非对称加密算法确定性地加密Ruby中的值的方法。

对于大多数用例,人们只关心当你加密“A”时,你在解密时得到'A',那就是你不关心加密值本身。你只关心完整的往返。

但是,对于我正在开发的应用程序,我确实需要输出是确定性的。也就是说,我需要使用RSA加密某些内容而不使用可变填充。

当我尝试使用OpenSSL::PKey::RSA::NO_PADDING加密值时,会返回错误:

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

任何人都知道如何使用RSA获取确定性加密值?

致以最诚挚的问候,

DBA

2 个答案:

答案 0 :(得分:2)

您可以使用非随机数据自行执行填充到适当的密钥长度

答案 1 :(得分:1)

此错误来自crypto/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是消息len; tlen来自:num=BN_num_bytes(rsa->n);

所以,您需要的数据与RSA密钥的N参数具有相同的字节长度

另外,据我所知,您的数据必须小于N(如果被视为单个长长二进制数)