【发布时间】: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