2011-05-12 27 views
0

请大家帮忙;需要帮助才能在c#中使用bouncy城​​堡加密/解密文件

我已经创建了一个生成x.509v3证书的服务器应用程序。比,我出口一个publique和私人密钥在.txt文件(格式十六进制,或佩姆);

我现在必须在其他客户端应用程序的文件加密,我的问题是,我不能做到这一点使用公钥直接,为了这个,我已经写了下面的代码:

 string fichier = @"C:\\Users\\Me\\Documents\\marie.docx"; 
     FileInfo f = new FileInfo(fichier); 


     byte[] buffer = new byte[(int)f.Length]; 

     System.IO.StreamReader strem = new System.IO.StreamReader(fichier); 
     String line = strem.ReadToEnd(); 
     strem.Close(); 

     IBufferedCipher cipher = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); 

     string str = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7cXmz0lTtzEuFAP0rR1f//RZZ8dGxa26I/LwJiNFqJULDvLjmiEHs+u+2gjc3Qm1cwcusuP+akCJIsGyn+9joEbEUKCaJOXbXsuqFKWFlsnfoCGTT8M1a5J2SNixsrLCim9P+qoGfml7JONUhWoiUVYqagRG4WgFmQHonttdnWEqk5yHtXp4ZzL+Bw54IaliyEzigBMW4k0rwMceR31MGnGGcplOynX6Ga5J3HZvLm2XoUQ6PAWw19yjmjiurwBugDOA2NdLOOR96Jxv39Kv/MyGXjjN3Z2hEsSVhHQ4j9RlEg0zsMhXoHJ/MsoVr5WKhEpCuuwp8IuQmwAFW1GoEwIDAQAB"; 

     char[] cArray = str.ToCharArray(); 
     byte[] pub_Array = new byte[cArray.Length]; 

     for (int j = 0; j < cArray.Length; j++) 
      pub_Array[j] = (byte)cArray[j]; 

     KeyParameter par = new KeyParameter(pub_Array); 

     cipher.Init(false, par); 

     //byte[] output = cipher.DoFinal(data); 

     int blockSize = cipher.GetBlockSize(); 

     int outputSize = cipher.GetOutputSize(buffer.Length); 


     int leavedSize = buffer.Length % blockSize; 
     int blocksSize = leavedSize != 0 ? buffer.Length/blockSize + 1 : buffer.Length/blockSize; 
     byte[] raw = new byte[outputSize * blocksSize]; 
     int i = 0; 

     while (buffer.Length - i * blockSize > 0) 
     { 
      if (buffer.Length - i * blockSize > blockSize) 
       cipher.DoFinal(buffer, i * blockSize, blockSize, 
           raw, i * outputSize); 
      else 
       cipher.DoFinal(buffer, i * blockSize, 
           buffer.Length - i * blockSize, 
           raw, i * outputSize); 
      i++; 
     } 

     // Ecriture du fichier chiffré sur le disque dur 

     StreamWriter envfos = null; 

     using (envfos = new StreamWriter("fichier_chiffrer.txt")) 
     { 
      envfos.Write(raw); 

     } 

     envfos.Close(); 

我有一个

exception in : cipher.Init(false,par); << Impossible d'effectuer un cast d'un objet de type 'Org.BouncyCastle.Crypto.Parameters.KeyParameter' en type 'Org.BouncyCastle.Crypto.AsymmetricKeyParameter'. 

请帮助

在C#中的任何文件,请;

想一想

Cordialement marie;

回答

0

RSA加密需要一个AsymmeticKeyParameter作为关键。你可以看到异常抱怨。你可以使用RsaKeyParameter这个,但是这将需要你提供2个属性:ModulusExponent这两个都是关键。

由于您使用的是已经生成的X509证书,因此您也可以尝试从该文件获取密钥。我提供了一些可能的示例代码,但是我不知道它是否会起作用,因为我从未尝试过使用X509证书进行操作。该代码将取代您的KeyParameter par = new KeyParameter(pub_Array);行。

X509CertificateParser parser = new X509CertificateParser(); 
AsymmeticKeyParameter par = parser.ReadCertificate(pub_array).GetPublicKey(); 
1

这是一小段代码,显示了读取公钥的最简单方法。

string str = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7cXmz0lTtzEuFAP0rR1f//RZZ8dGxa26I/LwJiNFqJULDvLjmiEHs+u+2gjc3Qm1cwcusuP+akCJIsGyn+9joEbEUKCaJOXbXsuqFKWFlsnfoCGTT8M1a5J2SNixsrLCim9P+qoGfml7JONUhWoiUVYqagRG4WgFmQHonttdnWEqk5yHtXp4ZzL+Bw54IaliyEzigBMW4k0rwMceR31MGnGGcplOynX6Ga5J3HZvLm2XoUQ6PAWw19yjmjiurwBugDOA2NdLOOR96Jxv39Kv/MyGXjjN3Z2hEsSVhHQ4j9RlEg0zsMhXoHJ/MsoVr5WKhEpCuuwp8IuQmwAFW1GoEwIDAQAB"; 
string header = "-----BEGIN PUBLIC KEY\n"; 
string trailer = "\n-----END PUBLIC KEY"; 
str = header + str + trailer; 
StringReader sr = new StringReader(str); 
PemReader PemRdr = new PemReader(sr); 
RsaKeyParameters KeyParams = (RsaKeyParameters)PemRdr.ReadObject();