我有一个包含公钥的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);
答案 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();
}
}
}
这可能会帮助某人,也许有人可以看看它,如果这确实有道理,但它似乎做了应该做的事情。