使用EnvelopedCms加密/解密会引发BadData异常

时间:2015-06-23 11:59:11

标签: c# encryption

我有这个:

static string Encrypt(string message)
{
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);

    var cert = store.Certificates.Find(X509FindType.FindByThumbprint, c_thumbPrint, false);

    if (cert.Count == 0)
    {
        return null;
    }
    byte[] messageAsByteArray = new UnicodeEncoding().GetBytes(message);
    var contentInfo = new ContentInfo(messageAsByteArray);
    var envelopedCms = new EnvelopedCms(contentInfo);
    envelopedCms.Encrypt(new CmsRecipient(cert[0]));

    return new UnicodeEncoding().GetString(envelopedCms.Encode());
}


static string Decrypt(string message)
{
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);

    var cert = store.Certificates.Find(X509FindType.FindByThumbprint, c_thumbPrint, false);

    if (cert.Count == 0)
    {
        return null;
    }
    var envelopedCms = new EnvelopedCms();
    var messageAsBytes = new UnicodeEncoding().GetBytes(message);
    envelopedCms.Decode(messageAsBytes);
    envelopedCms.Decrypt(cert); //Throws BadData exception
    var decryptedBytes = envelopedCms.ContentInfo.Content;
    return new UnicodeEncoding().GetString(decryptedBytes);
}

我正在跑步:

Console.WriteLine(Decrypt(Encrypt("Pikachu"));

不幸的是,上面的注释行(envelopedCms.Decrypt(cert))会抛出

System.Security.Cryptography.CryptographicException ("Bad Data")

我最好的猜测是我没有正确地将加密的字符串转换为字节数组。有人能说出我做错了吗?

1 个答案:

答案 0 :(得分:1)

使用

return Convert.ToBase64String(envelopedCms.Encode());

用于加密例程,因为编码结果不一定返回可以表示为字符串(0 char)的数据

尝试

envelopedCms.Decrypt();

用于解密例程。这仅在StoreName.My(和任何StoreLocation)中搜索。如果为Decrypt()函数提供证书集合,则这些证书必须包含私钥。 X509Store仅授予对公钥的访问权。

此外,并非所有证书都适合编码/解码。它们必须至少包含一个私钥。您可能会收到一个抱怨无效密钥的异常。不知道它来自哪里。