【问题标题】:Encrypting through .NET gives a Malformed ASN.1 header通过 .NET 加密会产生格式错误的 ASN.1 标头
【发布时间】:2015-12-10 14:07:17
【问题描述】:

我正在尝试加密一些文件以通过 Internet 发送。数据应该是 AES-256-CBC 加密的,然后使用公钥包装在 SMIME 信封中。只有当他们拥有私钥时才能解密。非常标准的加密东西,真的。

我的 Encrypt() 方法如下所示:

internal static byte[] EncryptSMIME(byte[] content, X509Certificate2 cert, string encryptionAlgh, int keySize)
{ 
   var cInfo = new ContentInfo(content);

   var mimeEnvelope = new EnvelopedCms(cInfo, new AlghorithmIdentifier(Oid.FromFriendlyName(encryptionAlgh, OidGroup.EncryptionAlghorithm), keySize));

   var recipient = new CmsRecipient(cert);

   mimeEnvelope.Encrypt(recipient);
   return mimeEnvelope.Encode();
}

我们有一个负载生成器,它可以生成未加密的文件,通过这种方法为它们提供数据,并返回一个正确加密的文件。运行 openssl asn1parse 工具会返回正确的标头数据。

但是,我们还有一个测试工具,应该能够以相同的方式加密磁盘中的文件。因此,我构建了这个 hokey WinForms 应用程序,它允许您选择几个文件,然后通过相同的 Encrypt() 方法提供字节数组(直接来自 FileStream)。生成的文件完全不同,即使通过两个应用程序运行相同的文件也是如此。一方面,它要大得多(示例:350kb vs 548kb),而且它似乎有一个格式错误的 ASN.1 标头。 openssl 工具回馈:

编码错误

9268:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too 长:.\crypto\asn1\asn1_lib.c:157:

几天来,我一直在努力解决这个问题,但找不到我的实现有什么问题。欢迎任何想法。

【问题讨论】:

  • 你能在某处上传错误的文件吗?加密器是否有可能添加base64编码+一些标头?
  • 我的第一个猜测是您的文本编码不同。

标签: c# .net encryption cryptography x509certificate


【解决方案1】:

终于找到问题了!原来加密方法根本不是问题。

LoadTesting 工具使用File.WriteAllBytes 编写实际的加密后文件。另一种是使用StreamWriter,它似乎应用了完全不同的编码。

一旦我将 StreamWriter 替换为对 File.WriteAllBytes 的调用(使用与之前完全相同的字节数组),生成的文件就很好了。

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2014-05-21
    • 2015-08-19
    • 2021-09-07
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多