2010-05-26 99 views
5

我試過並嘗試過,但我仍然得到「壞數據」。如何使用RSACryptoServiceProvider和公鑰的指數/模數來解密數據?C#RSA公共模/指數? (壞數據)

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

接近不夠的信息.... – 2010-05-26 05:51:15

+0

添加了不起作用的代碼。 – user230821 2010-05-26 15:04:30

+0

似乎microsofts RSA類是非常基本的,只接受其格式的密鑰。哦,下載的彈性城堡,並試圖找出它。 – user230821 2010-05-26 23:01:55

回答

2

我做這樣的事情:

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是這樣的:

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

因爲微軟實現局部和馬車。

我從來沒有遇到過這個問題。

希望這有助於

1

幾個月前,我曾試圖實施方案,其中包含私有密鑰加密和公鑰解密。我花了一個星期嘗試這樣做RSACryptoServiceProvider和..沒什麼。它們僅支持兩種用例:

  1. 公鑰加密,私鑰(完整)密鑰解密。

  2. 使用私鑰簽名,與公衆驗證。

他們已經盡了一切努力,不允許你在他們的API中做其他事情。 請檢查MSDN論壇: 我發現了很多像這樣的答案msdn,包括支持開發團隊的答案。他們都說:這是設計禁止的。所以我的建議是,甚至不要嘗試用RSACryptoServiceProvider來做到這一點,最好使用另一個實現。