Sto tentando di decodificare i dati che sono stati precedentemente crittografati in RSA (non preoccuparti, dovrei essere in grado di farlo, ho le chiavi."Chiave errata". eccezione durante la decodifica con RSACryptoServiceProvider (C# .NET)
Tuttavia, ottengo una "Chiave errata". errore nella riga di decrittazione. Sono sicuro che questa chiave è giusta, dato che l'ho presa dai vettori. I vettori sono forniti nel seguente codice. In teoria, ho tutte le informazioni da decifrare, anche se non funzionerà. Sto pensando che potrebbe essere un modo .NET di decodificare che non ho ancora capito.
Ecco il codice:
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();
}
Tutta la comprensione è notevolmente apprezzato. Ho cercato di eseguire il debug di questo per settimane. Letteralmente.
Nota: so che il modulo è lungo 129 byte. Il primo byte è vuoto per qualche motivo. La rimozione di questo byte non influisce sul risultato (ed è normale, dal momento che in teoria non è necessario il modulo nel processo di decodifica, poiché è la chiave pubblica.) – Lazlo