如何使用p7b证书加密zip文件并使用p12对其进行签名

时间:2019-08-29 09:27:59

标签: c# bouncycastle pkcs#7 pkcs#12

我有一个包含公钥的p7b文件,目的是使用此公钥加密zip文件,然后将其更改为.zip.encrypted,然后使用.p12文件对内容进行签名

问题

现在,我正在尝试弄清楚它是如何工作的。这仅仅是pkcs#7加密还是我称之为CMS Evelope?由于在p7b文件中,我只有一个公共rsa密钥,我将如何用它来加密整个zip文件?据我所知,您只能使用RSA加密来加密小字节。我可以使用某种字节流自行加密zip文件的每个字节吗?还是从p7b文件的公共RSA密钥中以某种方式生成AES密钥?我是否需要在Windows帐户中添加p7b证书才能访问其中的数据?

我尝试过的事情

我尝试使用.net资源,却无法弄清楚我想要的东西,然后我在Google上搜索了很多例子,发现人们如何加密短字符串并尝试进行修改,但这对我没有用。

现在我正在使用Bouncy Castle for C#,并且当我尝试对普通短字符串进行加密时,我认为我能够从p7b文件中读取公钥,这似乎可以正常工作。但是,当我使用我的zip文件时,我得到一个例外,即我的字节数组太大。我用于此测试的zip文件只有3KB,以后的实际文件将高达200MB

所以我想我使用p7b文件以及充气城堡的方式是错误的。

我的代码

 var p7bFilePath = @"key\Test.p7b";
 var text = @"zipfile";
 var bytesToEncrypt = File.ReadAllBytes(@"zip\test.zip");
 var certi = ReadCertificate(p7bFilePath);
 var encodedPublicKey = certi.GetPublicKey();
 var encryptEngine = new Pkcs1Encoding(new RsaEngine());
 encryptEngine.Init(true, encodedPublicKey);
 var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));

 Console.WriteLine(encrypted);

1 个答案:

答案 0 :(得分:0)

好吧,因为我问了这个问题,然后才删除并重新整理了一下,希望有人可以帮助我,所以我想我是在一个同事的帮助下解决的:

using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;
using System.IO;

namespace pkchwencrypting
{
    class Program
    {
        static void Main(string[] args)
        {
            var certificateData = File.ReadAllBytes("YOUR_p7b_FILE");
            var cert = new X509CertificateParser().ReadCertificate(certificateData);
//I just wanted to know if I can see the publicKey somehow            
//var publicKey = cert.GetPublicKey();

            var store = new Pkcs12Store(File.OpenRead("YOUR_p12_File"), "test".ToCharArray());
            var privateKey = store.GetKey("THE_NAME_OF_KEY_YOU_WANT_TO_GET").Key;

            var signedDataGen = new CmsSignedDataGenerator();
            signedDataGen.AddSigner(privateKey, cert, CmsSignedDataGenerator.EncryptionRsa, CmsSignedDataGenerator.DigestSha512);

            var zipContent = new CmsProcessableFile(new FileInfo("YOUR_DATA_FILE"));
//For me a zip
            var signedData = signedDataGen.Generate(zipContent, true);

            var envDataGen = new CmsEnvelopedDataGenerator();
            envDataGen.AddKeyTransRecipient(cert);

            var sData = new CmsProcessableByteArray(signedData.GetEncoded());
            var enveloped = envDataGen.Generate(sData, CmsEnvelopedDataGenerator.DesEde3Cbc);

            var dos = new DerOutputStream(File.OpenWrite("YOUR_DATA_FILE.zip.encrypted.sig)"));
            var bytesToWrite = enveloped.GetEncoded();
            dos.Write(bytesToWrite, 0, bytesToWrite.Length);
            dos.Flush();
            dos.Close();


        }

    }
}

这可能会帮助某人,也许有人可以看看它,如果这确实有道理,但它似乎做了应该做的事情。