2010-12-17 5 views
4

Je me demandais si quelqu'un connaissait un moyen de crypter de façon déterministe une valeur dans Ruby en utilisant un algorithme de cryptage asymétrique.Cryptage asymétrique déterministe (RSA) avec Ruby

Pour la plupart des cas d'utilisation, il est important de savoir que lorsque vous cryptez 'A', vous récupérez 'A' lorsque vous le décryptez, c'est-à-dire que vous ne vous souciez pas de la valeur cryptée. Vous vous souciez seulement de l'aller-retour complet.

Cependant, pour une application que je développe, j'ai vraiment besoin que la sortie soit déterministe. C'est-à-dire, j'ai besoin de crypter quelque chose avec RSA sans un remplissage variable.

Lorsque je tente de chiffrer une valeur avec OpenSSL::PKey::RSA::NO_PADDING une erreur est renvoyée:

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

Quelqu'un a une idée sur la façon dont je peux obtenir une valeur chiffrée déterministe en utilisant RSA?

Meilleures salutations,

DBA

+0

Salut. À quel point voulez-vous dire par «sortie pour être déterministe»? Voulez-vous avoir une longueur constante de données cryptées? Quelles sont les entrées? – osgx

+0

Lorsque vous cryptez une valeur (par exemple, 'xpto'), vous obtenez une valeur différente à chaque fois en raison du remplissage. Par exemple: crypt 'xpto' # => 'aaa'. J'ai besoin de ça quand je lance à nouveau la crypt 'xpto' ça retourne aussi 'aaa' et pas 'abc' – DBA

+1

J'ai compris. RSA a tendance à étendre votre message avec un remplissage aléatoire avant le cryptage. Est-ce que votre code fonctionne, si vous désactivez "OpenSSL :: PKey :: RSA :: NO_PADDING"? Pouvez-vous poster le code? – osgx

Répondre

1

Cette erreur provient de 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); 
    } 

Appelé de 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); 

Le flen est un message len; et le tlen est de: num=BN_num_bytes(rsa->n);

Alors, Vous avez besoin de vos données ont la même longueur d'octets que votre paramètre N de clé RSA

Aussi, comme je sais, vos données doivent être plus petites que N (si considéré comme nombre binaire long long long unique)

+0

Voyez-vous un moyen de contourner ce problème? Un padding fixe me permettrait de contourner ce problème, mais je ne vois pas comment je peux le faire en utilisant la librairie Ruby OpenSSL. – DBA

+0

Désolé pour l'édition longue et le code de creusement, c'est mon premier coup d'oeil dans 'rsa.c'. Lisez la dernière ligne. – osgx

+0

AHHH bien sûr. Maintenant, je me sens stupide! .. Merci pour l'illumination =) – DBA

2

Vous pouvez effectuer le remplissage à la longueur de clé appropriée vous avec des données non aléatoires

Questions connexes