C# 如何用p7b证书加密zip文件并用p12签名
我有一个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解决我的问题的方法是错误的 我的代码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密钥?我是否需
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#。