如何使用 p7b 证书加密 zip 文件并使用 p12 签名
how to encrypt zip file with p7b certificate and sign it with p12
我有一个包含 public 密钥的 p7b 文件,目标是使用此 public 密钥加密一个 zip 文件并将文件更改为 .zip.encrypted 然后使用.p12文件签名内容
问题
现在我正试图弄清楚它是如何工作的。这只是 pkcs#7 加密还是我称之为 CMS Evelope?由于在 p7b 文件中我只有一个 public rsa 密钥,我如何才能用它加密整个 zip 文件?据我所知,您只能使用 RSA 加密来加密小字节。我可以使用某种字节流来自行加密 zip 文件的每个字节吗?或者我是否从 p7b 文件的 public RSA 密钥中以某种方式生成 AES 密钥?我是否需要将 p7b 证书添加到我的 windows 帐户才能访问其中的数据?
我试过的
我尝试了 .net 资源,但无法弄清楚如何获得我想要的东西,然后我在谷歌上搜索了很多,发现了很多例子,人们如何加密一个短字符串并试图适应,但它从来没有为我工作。
现在我正在使用用于 C# 的 Bouncy Castle,我认为当我尝试加密普通的短字符串时我能够从我的 p7b 文件中读取 public 密钥,它似乎可以工作。但是当我使用我的 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);
好的,因为我问过这个问题之前只是删除它并重写了一点,希望有人能帮助我。我想我是在同事的帮助下找到解决方案的:
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();
}
}
}
这可能对某些人有帮助,也许有人可以看看它,如果这确实有意义但它似乎做了它应该做的事情。
我有一个包含 public 密钥的 p7b 文件,目标是使用此 public 密钥加密一个 zip 文件并将文件更改为 .zip.encrypted 然后使用.p12文件签名内容
问题
现在我正试图弄清楚它是如何工作的。这只是 pkcs#7 加密还是我称之为 CMS Evelope?由于在 p7b 文件中我只有一个 public rsa 密钥,我如何才能用它加密整个 zip 文件?据我所知,您只能使用 RSA 加密来加密小字节。我可以使用某种字节流来自行加密 zip 文件的每个字节吗?或者我是否从 p7b 文件的 public RSA 密钥中以某种方式生成 AES 密钥?我是否需要将 p7b 证书添加到我的 windows 帐户才能访问其中的数据?
我试过的
我尝试了 .net 资源,但无法弄清楚如何获得我想要的东西,然后我在谷歌上搜索了很多,发现了很多例子,人们如何加密一个短字符串并试图适应,但它从来没有为我工作。
现在我正在使用用于 C# 的 Bouncy Castle,我认为当我尝试加密普通的短字符串时我能够从我的 p7b 文件中读取 public 密钥,它似乎可以工作。但是当我使用我的 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);
好的,因为我问过这个问题之前只是删除它并重写了一点,希望有人能帮助我。我想我是在同事的帮助下找到解决方案的:
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();
}
}
}
这可能对某些人有帮助,也许有人可以看看它,如果这确实有意义但它似乎做了它应该做的事情。