2009-09-07 18 views
8

Estoy tratando de descifrar los datos que se han cifrado previamente en RSA (no se preocupe, se supone que puedo, tengo las claves. Nada ilegal :)."Clave incorrecta". excepción al descifrar con RSACryptoServiceProvider (C# .NET)

Sin embargo, obtengo una "Clave incorrecta". error en la línea de descifrado Estoy seguro de que esta clave es correcta, ya que la tomé de vectores. Los vectores se proporcionan en el siguiente código. Teóricamente, tengo toda la información para descifrar, aunque no funcionará. Estoy pensando que podría ser una forma .NET de descifrado que aún no entendía.

Aquí está el código:

static void Main(string[] args) 
    { 
     byte[] N = // Modulus 
     { 
      0x00, 0x8C, 0x35, 0x04, 0xC8, 0x40, 0xB3, 0x67, 0xD8, 0x42, 0x35, 0x78, 0xF6, 0x2A, 0x02, 0xBE, 
      0xF7, 0x1C, 0xCD, 0x9D, 0x98, 0x55, 0x16, 0x3F, 0x81, 0xA4, 0xE5, 0x3E, 0x3D, 0x38, 0x27, 0xEE, 
      0x0D, 0x8B, 0xAF, 0xB0, 0xBB, 0xBA, 0xA4, 0xE1, 0xF2, 0xB6, 0x79, 0x92, 0x5B, 0x72, 0xBA, 0xC8, 
      0xD7, 0x63, 0xA9, 0x60, 0x17, 0xB1, 0x34, 0xF1, 0xA9, 0xE3, 0x46, 0x67, 0xB8, 0x06, 0x9A, 0xCD, 
      0x59, 0x95, 0x10, 0x32, 0x74, 0x15, 0x73, 0xB1, 0x09, 0x43, 0x56, 0xA3, 0x0B, 0xE5, 0x6D, 0x2F, 
      0x29, 0xF2, 0xB6, 0x6F, 0x5D, 0xA9, 0x55, 0x19, 0x6A, 0x2E, 0xB0, 0x30, 0x6A, 0x3F, 0xAB, 0x9F, 
      0x4F, 0xCE, 0x12, 0x66, 0x28, 0xDE, 0xEB, 0x4C, 0x07, 0x9E, 0x5F, 0x24, 0x47, 0x50, 0x39, 0xB8, 
      0x8F, 0x0F, 0xB8, 0x8C, 0x62, 0x8C, 0xC7, 0xA8, 0x30, 0x8C, 0xB3, 0x27, 0xA3, 0x13, 0xBC, 0xB0, 
      0xA5 
     }; 

     byte[] E = // Public exponent 
     { 
      0x01, 0x00, 0x01 
     };   

     byte[] D = // Private key 
     { 
      0x0D, 0x55, 0xA9, 0x8B, 0xC6, 0x23, 0x89, 0xF7, 0xD6, 0x6C, 0x31, 0x81, 0xF0, 0x02, 0xEC, 0xD8, 
      0xA1, 0xC3, 0xA8, 0x7E, 0x69, 0x71, 0x41, 0x3E, 0xFA, 0x48, 0xD7, 0x3F, 0x89, 0x4C, 0xBA, 0xE6, 
      0x4C, 0xE7, 0xBB, 0xBE, 0x4F, 0x05, 0x09, 0x7C, 0x45, 0x00, 0x90, 0xFB, 0xE3, 0x90, 0x82, 0x33, 
      0x82, 0x06, 0x04, 0xDE, 0x9B, 0xFA, 0xF6, 0x14, 0xFB, 0x49, 0xA1, 0xE9, 0xAD, 0xAF, 0x21, 0x62, 
      0x84, 0x45, 0x3F, 0xB4, 0x6C, 0x8A, 0xFF, 0xE1, 0x8C, 0x5B, 0xC9, 0xBA, 0xD5, 0xB3, 0x48, 0x57, 
      0x5A, 0xA8, 0x3F, 0x11, 0x28, 0xD3, 0xB3, 0x2F, 0xAF, 0x32, 0x29, 0xC3, 0xA4, 0x20, 0xC4, 0x03, 
      0x89, 0xD4, 0x42, 0x0D, 0xAB, 0x5F, 0x06, 0x7F, 0x57, 0xBE, 0xD1, 0x90, 0x0E, 0x5E, 0x47, 0xE8, 
      0xC8, 0xFF, 0xF3, 0x0F, 0xC2, 0xD1, 0x58, 0x9A, 0xEC, 0x66, 0x0B, 0x46, 0x9B, 0x79, 0x33, 0xC1 
     }; 

     byte[] C = // Ciphertext - to be decrypted 
     { 
      0x70, 0x72, 0xD9, 0xAD, 0x1C, 0x7D, 0x0D, 0xDF, 0x3F, 0xC7, 0xE7, 0xF5, 0x82, 0x2D, 0x64, 0x7A, 
      0xC8, 0x60, 0xC9, 0x93, 0x24, 0x14, 0x1A, 0xC3, 0xA4, 0x98, 0xB4, 0x63, 0x29, 0x5C, 0xEA, 0x41, 
      0x0A, 0xC4, 0x28, 0x0D, 0xED, 0x8C, 0x53, 0x20, 0xFC, 0x6B, 0x3A, 0x13, 0xBD, 0x0C, 0x2E, 0xB6, 
      0xA0, 0x19, 0xD4, 0xB5, 0xF3, 0x66, 0x1B, 0x70, 0x81, 0x3E, 0xB1, 0x68, 0x0A, 0x54, 0x23, 0x8E, 
      0x65, 0xD8, 0x8E, 0xE6, 0x70, 0x56, 0xB4, 0x3A, 0x0D, 0xD6, 0xC7, 0x12, 0x3F, 0x18, 0xCD, 0x3F, 
      0xE3, 0x63, 0x32, 0x6E, 0x4D, 0x7E, 0x2F, 0x4E, 0x5C, 0x6B, 0x77, 0x03, 0x37, 0x32, 0xD2, 0xF7, 
      0x27, 0x2D, 0x4B, 0xD8, 0x89, 0x89, 0x23, 0xA3, 0x9A, 0xD0, 0x95, 0x38, 0xD5, 0x00, 0x4B, 0x86, 
      0x46, 0x0C, 0x54, 0x4E, 0x1F, 0xAA, 0x34, 0x0D, 0x00, 0x1B, 0x38, 0x56, 0x83, 0x4F, 0x07, 0x68 
     }; 

     byte[] M = // Cleartext - reference 
     { 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x71, 0x77, 0x65, 0x72, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x61, 0x73, 0x64, 0x66, 0x67, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
     }; 

     RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); 
     RSAParameters param = new RSAParameters(); 
     param.Exponent = E; 
     param.D = D; 
     param.Modulus = N; // I don't know why the modulus (public key) is needed here. we're decrypting! 
     // But I get an error at importparameters if it's not there. 
     rsa.ImportParameters(param); 

     byte[] R = rsa.Decrypt(C, false); // Result. This decryption errors out with "Bad Key." 

     Console.WriteLine(R == M); // Should be true. 

     Console.Read(); 
    } 

Cualquier penetración es grandemente apreciado. He estado intentando depurar esto por semanas. Literalmente.

+0

Nota: Sé que el módulo tiene 129 bytes de longitud. El primer byte está en blanco por alguna razón. Eliminar este byte no afecta el resultado (y eso es normal, ya que teóricamente no necesitas el módulo en el proceso de descifrado, ya que es la clave pública). – Lazlo

Respuesta

20

que tenía el mismo problema con la "Bad Key" exce ption, resultó que el problema era cómo estaba generando mi certificado.

que estaba usando el interruptor:

-sky signature 

y cuando lo cambié a:

-sky exchange 

funcionó bien.

Este es el comando completo que he usado para makecert:

makecert -r -pe -n "CN=MyName" -ss my -sr CurrentUser -sky exchange 
+1

Me estaba perdiendo en el mayor agujero de conejo fracking hasta que encontré esta publicación. ¡¡Gracias por compartir!! –

0

Parece importar solo D no es suficiente. Creo que usted tiene que establecer las siguientes propiedades:

  • Módulo
  • exponente
  • Q
  • DP
  • DQ
  • InverseQ
  • D
2

Veo esto es una vieja pregunta, pero estoy respondiendo porque me fue sugerido como una respuesta a un problema actual.

Los predicados son deficientes porque (a) de cifrado RSA no funciona cuando el texto es del mismo tamaño que la clave, y (b) la comparación final utiliza '==' para probar la igualdad de objeto en lugar de equivalencia elemento-sabio.

Pero, las respuestas son buenas: asegúrese de que el certificado fue creado de modo que sea bueno para el 'intercambio', y al comparar una matriz de bytes como esta, asegúrese de equivalencia de elemento.

Cuestiones relacionadas