需要帮助才能使用c#中的充气城堡加密/解密文件

时间:2011-05-12 13:25:04

标签: c# bouncycastle

请帮忙;

我创建了一个生成x.509v3证书的服务器应用程序。我在.txt文件中导出公共密钥和私钥(格式为hex或pem);

我现在必须加密另一个客户端应用程序中的文件,我的问题是我不能直接使用公钥来执行此操作,为此我写了以下代码:

        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;

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();