【问题标题】:how to encrypt zip file with p7b certificate and sign it with p12如何使用 p7b 证书加密 zip 文件并使用 p12 对其进行签名
【发布时间】:2020-01-02 13:11:45
【问题描述】:

我有一个包含公钥的 p7b 文件,目标是用这个公钥加密一个 zip 文件并将文件更改为 .zip.encrypted 然后使用 .p12 文件对内容进行签名

问题

现在我正试图弄清楚这是如何工作的。这只是 pkcs#7 加密还是我称之为 CMS Evelope?由于在 p7b 文件中我只有一个公共 rsa 密钥,我如何能够用它加密整个 zip 文件?据我所知,您只能使用 RSA 加密来加密小字节。是否有某种字节流可用于自行加密 zip 文件的每个字节?或者我是否以某种方式从 p7b 文件的公共 RSA 密钥中生成 AES 密钥?我是否需要将 p7b 证书添加到我的 windows 帐户才能访问里面的数据?

我的尝试

我尝试了 .net 资源,但无法弄清楚如何获得我想要的东西,然后我在谷歌上搜索了很多,发现了很多人们如何加密短字符串并尝试适应的例子,但它从来没有为我工作。

现在我正在为 c# 使用 Bouncy Castle,我想当我尝试加密一个普通的短字符串时,我能够从我的 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);

【问题讨论】:

    标签: c# bouncycastle pkcs#7 pkcs#12


    【解决方案1】:

    好的,因为我在删除它并重写它之前提出了这个问题,希望有人可以帮助我。我想我是在一位同事的帮助下找到解决方案的:

    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#。
    猜你喜欢
    • 2019-12-09
    • 2014-02-17
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2020-04-17
    • 2015-07-02
    • 1970-01-01
    • 2018-11-26
    相关资源
    最近更新 更多