2010-07-08 128 views
4

我有两个AsymmetricAlgorithm对象包含一个RSA私钥和RSA公钥。私钥从Windows-MY密钥存储区中取出,并从用户证书中取回公钥。我如何使用这些密钥和RSACryptoServiceProvider一起使用C#中的RSA算法加密数据?换句话说,我如何指定我想要使用我已有的密钥?使用不对称算法私钥和公钥与RSA C#

+0

当你包含有关这些 '两个对象' 的一些细节你可以得到更好的答案。 – 2010-07-08 18:39:41

+0

它们与我从用户证书中提取的RSA密钥相匹配,还有什么可说的? – 2010-07-08 19:12:28

回答

2
#region "RSA Encrypt/Decrypt" 
public string RSAEncrypt(string str, string publicKey) 
{ 
    //---Creates a new instance of RSACryptoServiceProvider--- 
    try { 
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
    //---Loads the public key--- 
    RSA.FromXmlString(publicKey); 
    byte[] EncryptedStr = null; 

    //---Encrypts the string--- 
    EncryptedStr = RSA.Encrypt(ASCII.GetBytes(str), false); 
    //---Converts the encrypted byte array to string--- 
    int i = 0; 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    for (i = 0; i <= EncryptedStr.Length - 1; i++) { 
     //Console.WriteLine(EncryptedStr(i)) 
     if (i != EncryptedStr.Length - 1) { 
      s.Append(EncryptedStr[i] + " "); 
     } else { 
      s.Append(EncryptedStr[i]); 
     } 
    } 

    return s.ToString(); 
    } catch (Exception err) { 
    Interaction.MsgBox(err.ToString()); 
    } 
} 

public string RSADecrypt(string str, string privateKey) 
{ 
    try { 
    //---Creates a new instance of RSACryptoServiceProvider--- 
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
    //---Loads the private key--- 
    RSA.FromXmlString(privateKey); 

    //---Decrypts the string--- 
    byte[] DecryptedStr = RSA.Decrypt(HexToByteArr(str), false); 
    //---Converts the decrypted byte array to string--- 
    System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    int i = 0; 
    for (i = 0; i <= DecryptedStr.Length - 1; i++) { 
     //Console.WriteLine(DecryptedStr(i)) 
     s.Append(System.Convert.ToChar(DecryptedStr[i])); 
    } 
    //Console.WriteLine(s) 
    return s.ToString(); 
    } catch (Exception err) { 
    Interaction.MsgBox(err.ToString()); 
    } 
} 
#endregion 

公共密钥(ARG)应该是这样的: <RSAKeyValue> <模> yNi8BvATA77f +/6cU6z [...] 9VULgU = < /模> <指数> AQAB < /指数> </RSAKeyValue >

私钥(arg)应该如下所示: <RSAKeyValue> <模> yNi8BvATA77f +/6cU6z [...] 9VULgU = < /模> <指数> AQAB < /指数> <P> 8ZlZPmko3sam9pvD /升[...] ba0MWLjj9dyUMvmTQ6L8m9IQ == </P > <Q> 1NGHjXyEa9SjUwY [...] v + op2YyyglMeK/Gt5SL0v6xqQZQ == </Q > <DP> LpjE/aSKnWzzBt1E [...] i5f63Ak9wVG3ZPnwVDwefNkMAQ == </DP > <DQ> qAgb8AGNiJom [...] 8x3qaD3wx + UbnM5v3aE5Q == </DQ > <InverseQ> fQ4 + 7r3Nmgvz113L [...] uJqEgCNzw == </InverseQ > <d> B4n7JNeGHzHe/nqEK [... ] GaOBtuz0QTgE = </d > </RSAKeyValue >

+0

酷,我可以使用AsymmetricAlgorithm.ToXmlString(布尔)将密钥转换为XML。谢谢。 – 2010-07-08 18:35:48

+0

-1,对不起,这个例子已经足够糟糕了,以致未来的人误入歧途。不需要专门化字符串,不需要专门化ASCII字符串,也不需要解密从其加密方法输出的格式,并且包含未指定的方法HexToByteArr()。 – 2010-07-09 00:19:04

+0

@gregs,你有点挑剔好友。几年前,我建立了这两个函数,因为它比字节[]更容易加密/解密(ascii)字符串。它展示了这个概念。将Hex转换为byte []非常重要,所以我没有在这里包含不相关的代码。快速搜索“HexToBytes”可以得到很多例子。 – tgolisch 2010-07-09 16:10:20