2010-05-26 8 views
5

मैंने कोशिश की है और कोशिश की है लेकिन मुझे "खराब डेटा" मिलना जारी है। सार्वजनिक कुंजी के एक्सपोनेंट/मॉड्यूलस के साथ RSACryptoServiceProvider का उपयोग करके डेटा को आप कैसे डिक्रिप्ट करते हैं? माइक्रोसॉफ्ट कार्यान्वयन आंशिक और त्रुटिपूर्ण हैसी # आरएसए सार्वजनिक मॉड्यूलस/एक्सपोनेंट? (खराब डेटा)

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

है क्योंकि:

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

जहां BigInteger यह है:

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

लगभग पर्याप्त जानकारी नहीं .... –

+0

जो कोड काम नहीं करता है उसे जोड़ा गया। – user230821

+0

लगता है कि माइक्रोस्कोफ्ट आरएसए कक्षा बहुत बुनियादी है और केवल अपने प्रारूप में कुंजी स्वीकार करता है। हे ठीक है, डाउनलोड उछालभरी महल और इसे समझने की कोशिश कर रहा हूँ। – user230821

उत्तर

2

मैं ऐसा ही कुछ है।

मुझे इसके साथ कोई समस्या नहीं है।

आशा इस मदद

1

कुछ महीने पहले मैं निजी कुंजी एन्क्रिप्शन और सार्वजनिक कुंजी डिक्रिप्शन के साथ परिदृश्य को लागू करने की कोशिश की है। मैंने RSACryptoServiceProvider और .. कुछ भी नहीं करने के साथ ऐसा करने में एक सप्ताह बिताया। वे केवल दो उपयोग मामलों का समर्थन करते हैं:

  1. सार्वजनिक कुंजी एन्क्रिप्शन, निजी (पूर्ण) कुंजी डिक्रिप्शन।

  2. निजी कुंजी के साथ साइन इन करना, जनता के साथ सत्यापन करना।

और उन्होंने सब कुछ किया है ताकि आप अपने एपीआई के साथ कुछ और करने की अनुमति न दें। कृपया, msdn फ़ोरम देखें: मुझे समर्थन विकास टीम के उत्तरों सहित, msdn जैसे कई उत्तरों मिल गए हैं। उन्होंने सभी ने कहा: यह डिजाइन द्वारा निषिद्ध है। तो मेरा सुझाव यह है कि RSACryptoServiceProvider के साथ ऐसा करने का प्रयास न करें, बेहतर कार्यान्वयन का उपयोग करें।

संबंधित मुद्दे