我有这个:
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")
我最好的猜测是我没有正确地将加密的字符串转换为字节数组。有人能说出我做错了吗?
答案 0 :(得分:1)
使用
return Convert.ToBase64String(envelopedCms.Encode());
用于加密例程,因为编码结果不一定返回可以表示为字符串(0 char)的数据
尝试
envelopedCms.Decrypt();
用于解密例程。这仅在StoreName.My(和任何StoreLocation)中搜索。如果为Decrypt()函数提供证书集合,则这些证书必须包含私钥。 X509Store仅授予对公钥的访问权。
此外,并非所有证书都适合编码/解码。它们必须至少包含一个私钥。您可能会收到一个抱怨无效密钥的异常。不知道它来自哪里。