首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用p7b证书加密压缩文件并使用p12签名

如何用p7b证书加密压缩文件并使用p12签名
EN

Stack Overflow用户
提问于 2019-08-29 09:27:59
回答 1查看 959关注 0票数 1

我有一个包含公钥的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文件的方式以及为我的问题使用弹跳城堡的方式是错误的。

我的代码

代码语言:javascript
复制
 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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-30 10:41:05

好吧,因为我之前问过这个问题,我把它删除了,并重写了一下,希望有人能帮我。我想我是在一所大学的帮助下找到解决办法的:

代码语言:javascript
复制
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();
        }
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57707117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档