2010-07-30 5 views
6

Je suis en train de le port de la fonctionnalité php suivante vers perl:Comment créer un objet Crypt :: RSA à partir d'un module, d'un exposant et d'un exposant privé?

public function loadKey($mod, $exp, $type = 'public') 
{ 
    $rsa = new Crypt_RSA(); 
    $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1; 
    $rsa->setHash('sha256'); 
    $rsa->modulus = new Math_BigInteger(Magicsig::base64_url_decode($mod), 256); 
    $rsa->k = strlen($rsa->modulus->toBytes()); 
    $rsa->exponent = new Math_BigInteger(Magicsig::base64_url_decode($exp), 256); 

    // snip... 
} 

Je dois convertir une chaîne sous la forme ("RSA mod $ $ exp private_exp de $..."):

RSA.mVgY8RN6URBTstndvmUUPb4UZTdwvwmddSKE5z_jvKUEK6yk1u3rrC9yN8k6FilGj9K0eeUPe2hf4Pj-5CmHww==.AQAB.Lgy_yL3hsLBngkFdDw1Jy9TmSRMiH6yihYetQ8jy-jZXdsZXd8V5ub3kuBHHk4M39i3TduIkcrjcsiWQb77D8Q== 

... à un objet Crypt :: RSA. J'ai séparé les composants de sorte que j'ai $ mod, $ exp et $ private_exp, mais l'API Crypt :: RSA de perl ne semble pas avoir un moyen de définir explicitement.

Répondre

5

Elaboré sur IRC, documentant ici pour le reste du monde: il est complètement en situation irrégulière mais Crypt::RSA::Keyne ont des méthodes appelées n, e et d qui correspondent au module, l'exposant public, et l'exposant privé . Modulo bugs dans la fonction de vérification (qui est supposé pour fonctionner si p et q sont indisponibles mais n est, mais ne fait pas), il est possible de créer une clé de travail avec ces méthodes.

Nous avons résolu le problème ensemble en créant une sous-classe de Crypt::RSA::Key::Private avec une méthode de fabrication qui décode le codage base64 (en utilisant MIME::Base64::URLSafe) et l'encodage binaire supplémentaire (en utilisant Math::BigInt -> from_hex et unpack "H*") et définit alors ces trois députés, et les modules Crypt::RSA ont pu l'accepter comme une clé.

Questions connexes