2009-09-07 19 views
8

Daha önce RSA'da şifrelenmiş olan verilerin şifresini çözmeye çalışıyorum (endişelenmeyin, yapabilmem gerekiyordu, anahtarlarım var. Hiçbir şey yasadışı değil :)."Hatalı Anahtar". RSACryptoServiceProvider (C# .NET) ile şifresini çözerken istisna

Ancak, bir "Hata Anahtarı" alıyorum. şifre çözme satırında hata. Bu anahtarın doğru olduğunu, vektörlerden aldığımdan eminim. Vektörler aşağıdaki kodda verilmiştir. Teorik olarak, işe yaramayacak olsa da, şifresini çözmek için tüm bilgilere sahibim. Henüz anlamadığım bir şifre çözme yolu olduğunu düşünüyorum. Herhangi bir fikir büyük takdir olduğunu

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(); 
    } 

: Burada

kodudur. Bunu haftalarca hata ayıklamaya çalışıyorum. Harfi harfine.

+0

Not: Modülün 129 bayt uzun olduğunu biliyorum. İlk bayt nedense boş. Bu baytın kaldırılması sonucu etkilemez (ve bu normaldir, çünkü teorik olarak, şifre çözme işleminde modüle ihtiyaç duymazsınız, çünkü genel anahtardır.) – Lazlo

cevap

20

vardı: Hepinize aşağıdaki özellikleri belirlemek zorunda inanıyoruz "Kötü Anahtar" ile aynı sorun ption, sorunun sertifikamı nasıl oluşturduğum olduğu ortaya çıktı.

-sky signature 

ve ben bunu değiştiği:

Ben anahtarını kullanarak edildi

-sky exchange 

iyi çalıştı. Bu eski bir sorudur bkz, ancak bir akım soruna cevap olarak bana önerildi çünkü yanıtlarken

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

Bulunduğum zamana kadar en büyük kırıcı tavşan deliğinde kayboluyordum bu gönderi. Paylaşım için teşekkürler!! –

0

Sadece D içeriyorsa yeterli değil.

  • Modülü
  • Üs
  • Q
  • DP
  • DQ
  • InverseQ
  • D
2

:

İşte MakeCert için kullanılan tam komuttur.

yüklemler '==' nesne eşitliği sınamak yerine düz metin anahtarı olarak aynı boyutta olduğunda (a) RSA şifreleme çalışmıyor ve (b) nihai karşılaştırma kullandığından kusurludur eleman-bilge eşdeğerlik.

Ancak, yanıtlar iyidir: sertifikanın 'exchange' için iyi olacak şekilde oluşturulduğundan ve böyle bir bayt dizisini karşılaştırırken, eşdeğer eşdeğerlik sağladığından emin olun.

İlgili konular