我有一个包含公钥的p7b文件,目标是用这个公钥加密一个zip文件,然后将该文件更改为.zip.encrypted,然后使用一个.p12文件对内容进行签名。
问题
现在我想弄清楚这是怎么回事。这仅仅是pkcs#7加密,还是我称之为CMS加密?因为在p7b文件中,我只有一个公共的rsa密钥,我怎么能用它加密整个压缩文件呢?据我所知,您只能使用RSA加密来加密小字节。是否有某种字节流可以用来自己加密zip文件的每一个字节?还是从p7b文件中以某种方式从公共RSA密钥中生成AES密钥?是否需要将p7b证书添加到windows帐户以获得对内部数据的访问?
我试过什么
我尝试了.net资源,但不知道如何得到我想要的,然后我在谷歌上搜索了很多例子,人们如何加密一个短字符串,并试图适应,但它从来没有对我起作用。
现在,我正在为c#使用Bouny城堡,当我试图加密一个普通的短字符串时,我想我能够从p7b文件中读取公钥,这似乎是可行的。但是当我使用zip文件时,我会得到一个异常,即字节数组太大。我在这个测试中使用的zip文件只有3KB,以后真正的文件将达到~200 to。
因此,我想我使用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);发布于 2019-08-30 10:41:05
好吧,因为我之前问过这个问题,我把它删除了,并重写了一下,希望有人能帮我。我想我是在一所大学的帮助下找到解决办法的:
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();
}
}
}这可能对某人有帮助,也许有人可以看看,如果这真的有意义的话,但它似乎做了它应该做的事情。
https://stackoverflow.com/questions/57707117
复制相似问题