我正在使用RSACryptoServiceProvider
来加密和解密简单的字符串,虽然它可以与普通证书一起使用,但它在智能卡方面让我有些悲伤。
以下是我正在使用的代码:
private X509Certificate2 _cert // this certificate is set early on in the program
private string Encrypt(string Data)
{
if (string.IsNullOrEmpty(Data)) return default(string);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_cert.PublicKey.Key;
return Convert.ToBase64String(((rsa.Encrypt(Encoding.Unicode.GetBytes(Data), true))));
}
private string Decrypt(string CipherText)
{
if (string.IsNullOrEmpty(CipherText)) return default(string);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_cert.PrivateKey;
return Encoding.Unicode.GetString(((rsa.Decrypt(Convert.FromBase64String(CipherText), true))));
}
它成功解密(没有错误)但编码不正确。它给了我像
这样的结果\ u08d8黔㡉Z ^쨳층器\ u0888諬翉烽逼䚘螷퓰姜낯ꄯ鲮ꘇ台ᾨ鳞텟칆蘟マ⺁ൿ䤳譻宐ù鉱㒎艴偃堎え뢈疠蚰3⸮賆슉ଞ맿댿䀵㓹摵뼚⡨ቾ᳓낣쏀ꖌ엷ὦ楐竖⸌ꅑ뙳糇Ч鎋笕粅嚄罜칮嬒쐞ڮ묭泊䘐쫦⊗邀 ☇仇挃箍絁绺罽华⏓:귪ي咷믭鹾签艉闼敹Ԓ嵯젨泪ꔤ狫ꆙ\ uab41軧\ n“个
有趣的是,无论我加密什么,解密的byte[]
长度始终为256。
我知道智能卡私钥操作总是发生在卡本身上,所以我确定它与它有关但我希望你们中的一些人有这方面的经验并且可以节省我的试验堆 - 和-error。
谢谢!
答案 0 :(得分:0)
您的智能卡似乎执行所谓的原始或教科书RSA。换句话说,它只执行模幂运算,让PKCS#1 v1.5 (EME-PKCS1-v1_5)或 - 在你的情况下 - OAEP (EME-OAEP decoding)解码给你。此填充具有与键大小/模数大小相同的大小。在你的情况下,这将是256字节或2048位。
因此,使用的智能卡出了问题。 Unpadding应该是它提供的功能的组成部分;在PC上这样做是没有意义的。
填充主要由随机(外观)数据组成,因此难怪它看起来像随机文本,尤其是现在正在使用UTF-16 LE(错误地称为{{1通过.NET)。