2010-05-26 25 views
5

Lo intenté y lo intenté, pero sigo obteniendo "Datos incorrectos". ¿Cómo descifrar datos utilizando RSACryptoServiceProvider con el Exponent/Modulus de la clave pública?C# RSA public Módulo/Exponente? (Datos incorrectos)

public static byte[] Encrypt(byte[] b, byte[] mod, byte[] exp) 
{ 
    CspParameters csp = new CspParameters(); 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 

    RSAParameters par = new RSAParameters(); 
    par.Exponent = exp; 
    par.Modulus = mod; 
    rsa.ImportParameters(par); 

    return rsa.Encrypt(b, false); 
} 
public static byte[] Decrypt(byte[] b, byte[] pubexp, byte[] mod, byte[] priexp) 
{ 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 
    RSAParameters rp = new RSAParameters(); 

    rp.Exponent = pubexp; 
    rp.D = priexp; 

    rp.Modulus = mod; 
    rsa.ImportParameters(rp); 
    return rsa.Decrypt(b, false); 
} 

static List<byte[]> Base2Array(string str) 
{ 
    byte[] b = Convert.FromBase64String(str); 

    List<byte[]> Bytes = new List<byte[]>(); 

    int i = 0; 
    while (i < b.Length) 
    { 
     int size = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b, i)); 
     i += 4; 
     byte[] b2 = new byte[size]; 
     Array.Copy(b, i, b2, 0, size); 
     Bytes.Add(b2); 
     i += size; 
    } 

    return Bytes; 
} 


static void Main(string[] args) 
{ 
    List<byte[]> pub = Base2Array("AAAAB3NzaC1yc2EAAAABJQAAAIBMW4HxU1glv+CcZpJnvUKEyeNfFoKkyLOVLOOb/vNXQkrkGsNdpYAZkKKizij8fD3u3/iYT8UI+xkFoyonRYVipgCslirJB1VdvLivXs69Ht4vf7VAv2yJSUni3XsIHauMlfOkjJ7DpUW75ZkrxsGieICFWlXvRnAyDdqQrkZRZQ=="); 
    List<byte[]> pri = Base2Array("AAAAgBSjHDNiojO3UXZg6Ux4VyrOx9SCn9mCWgykWTEUeR6Anp6DxhlPUw3UEEetVy97hlw8iGCEQxcvG4T7qocni9UtUTLdpuQzvr6718y2CP0ouKt/1hVKD9QssT08XUvJEBQnnl2yVZAbIqT/DGnUH36L0BnQE/2ombPakwHscfFFAAAAQQCSfQy2cP8Oa0IR0u0whxqGmuuXY/3tCD8NaaSCYm31ly0QBdxFdf2WkC51DNVaf5/1ErHceMapFN9Z3j+/6lA7AAAAQQCFcMoSA32f240nFBmMv/nn/mL1uSdAXOxjUHViJc6M8ntZvW2ZuP2qTvfA3mh1AK5K69piX/4T72xxqTA2tmrfAAAAQFxX1JunFI+fpobdienVCZcjibwbpDPf1MVTbwQhAXHqVBL3XXgkysS/67X/aWnv/+SdBDaXa1SnDpphSWOkxAQ="); 

    //pub[0] 7 
    //pub[1] 1 
    //pub[2] 128 

    //pri[0] 128 
    //pri[1] 65 
    //pri[2] 65 
    //pri[3] 64 

    byte[] pubmod = null; 
    byte[] primod = null; 
    byte[] pubexp = null; 
    byte[] priexp = null; 

    pubexp = pub[0]; 
    pubmod = pub[2]; 

    priexp = pri[0]; 
    primod = pri[2]; 


    byte[] bstr = Encoding.ASCII.GetBytes("Test"); 

    bstr = Encrypt(bstr, pubmod, pubexp); 
    bstr = Decrypt(bstr, pubexp, pubmod, null); 


    string str = Encoding.ASCII.GetString(bstr); 
} 
+0

información casi insuficiente .... –

+0

Agregó el código que no funciona. – user230821

+0

Parece que la clase RSA de microsofts es muy básica y solo acepta claves en su formato. O bueno, descargué castillo hinchable y estoy tratando de resolverlo. – user230821

Respuesta

2

que hago algo así:

public byte[] PublicDecryption(byte[] encryptedData) 
{ 
     var encData = new BigInteger(encryptedData); 
     BigInteger bnData = encData.modPow(_exponent, _modulus); 
     return bnData.getBytes(); 
} 

public byte[] PrivateDecryption(byte[] encryptedData) 
{ 
    var encData = new BigInteger(encryptedData); 
    d = new BigInteger(rsaParams.D); 
    BigInteger bnData = encData.modPow(d, _modulus); 
    return bnData.getBytes(); 
} 

donde BigInteger es la siguiente:

http://www.codeproject.com/KB/cs/biginteger.aspx

porque implementación de Microsoft es parcial y con errores.

Nunca he tenido un problema con esto.

Esperanza esta ayuda hace

1

pocos meses he tratado de implementar el escenario con el cifrado de clave privada y el descifrado de claves públicas. Pasé una semana intentando hacer esto con RSACryptoServiceProvider y ... nada. Solo admiten dos casos de uso:

  1. Encriptación de clave pública, descifrado de clave privada (completa).

  2. Firmando con llave privada, verificando con público.

Y han hecho todo lo posible para no permitir que hagas algo más con su API. Por favor, eche un vistazo a los foros de msdn: He encontrado muchas respuestas como esa msdn, incluidas las respuestas del equipo de desarrollo de soporte. Todo lo que dijeron: que esto está prohibido por diseño. Así que mi sugerencia es que ni siquiera intente hacer eso con RSACryptoServiceProvider, mejor use otra implementación.