C# 如何用p7b证书加密zip文件并用p12签名

C# 如何用p7b证书加密zip文件并用p12签名,c#,bouncycastle,pkcs#7,pkcs#12,C#,Bouncycastle,Pkcs#7,Pkcs#12,我有一个p7b文件,其中包含公钥。目标是使用此公钥加密zip文件,并将文件更改为.zip.encrypted,然后使用.p12文件对内容进行签名 问题 现在我想弄清楚这是怎么回事。这只是pkcs#7加密还是我称之为CMS Evelope?因为在p7b文件中,我只有一个公开的rsa密钥,我怎样才能用它加密整个zip文件?据我所知,您只能使用RSA加密对小字节进行加密。是否有某种ByTestStream,我可以使用它自己加密zip文件的每个字节?或者我是否从p7b文件的公钥中生成AES密钥?我是否需

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

问题

现在我想弄清楚这是怎么回事。这只是pkcs#7加密还是我称之为CMS Evelope?因为在p7b文件中,我只有一个公开的rsa密钥,我怎样才能用它加密整个zip文件?据我所知,您只能使用RSA加密对小字节进行加密。是否有某种ByTestStream,我可以使用它自己加密zip文件的每个字节?或者我是否从p7b文件的公钥中生成AES密钥?我是否需要将p7b证书添加到我的windows帐户才能访问其中的数据

我尝试过的

我尝试了.net资源,但不知道如何得到我想要的,然后我在谷歌上搜索了很多例子,发现人们如何加密短字符串并试图进行调整,但这对我来说从来都不起作用

现在我正在使用Bouncy Castle for c#,我想当我尝试加密一个普通的短字符串时,我能够从我的p7b文件中读取公钥,这似乎是可行的。但是当我使用zip文件时,我得到一个异常,我的字节数组太大了。我在这个测试中使用的zip文件只有3KB,以后真正的文件将达到~200MB

所以我想我用p7b文件和bouncy castle解决我的问题的方法是错误的

我的代码

 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);

好吧,因为我之前问过这个问题,只是删除了它并重写了一点,希望有人能帮我。我想我是在一位同事的帮助下找到解决方案的:

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();
        }
    }
}

这可能会帮助一些人,也许有人可以看看它,如果这真的有意义,但它似乎做了它应该做的事。

这非常棒,而且(几乎)正是我所需要的。谢谢问:你也有解密加密文件的代码吗?遗憾的是,我没有,这是我以前工作场所的一个项目。但如果我能准确地回忆起来的话,我们只是使用了一些Bouncy Castle Java示例,并将其转换为c#。