2010-07-30 11 views
6

estoy tratando de puerto de la siguiente funcionalidad php a perl:¿Cómo puedo crear un objeto Crypt :: RSA a partir de módulo, exponente y exponente privado?

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... 
} 

que necesito para convertir una cadena en la forma ("RSA $ mod $ exp $ private_exp..."):

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

... a un objeto Crypt :: RSA. He dividido los componentes, así que tengo $ mod, $ exp, y $ private_exp, pero la API perl Crypt :: RSA no parece tener una forma explícita de establecerse.

Respuesta

5

elaborado en el IRC, documentando aquí para el resto del mundo: esto es completamente indocumentado pero Crypt::RSA::Keyhace tienen métodos llamados n, e y d que corresponden al módulo, el exponente público, y el exponente privado . Los errores de módulo en la función de verificación (que es supuesta si p y q no están disponibles pero n es, pero en realidad no lo es), es posible crear una clave de trabajo con esos métodos.

hemos resuelto el problema juntos, creando una subclase de Crypt::RSA::Key::Private con un método de fábrica que decodifica la codificación base64 (usando MIME::Base64::URLSafe) y la codificación binaria adicional (usando Math::BigInt -> from_hex y unpack "H*") y luego establece esos tres miembros privados, y los módulos Crypt::RSA pudieron aceptarlo como clave.

Cuestiones relacionadas