从某种意义上说,MSDN 文档似乎是正确的,它应该在 XP SP3 中被设计支持,如果不是,那只是因为 .NET 3.5 中的一个错误。
AesCryptoServiceProvider 和 SHA256CryptoServiceProvider 都使用名为“Microsoft Enhanced RSA and AES Cryptographic Provider”的相同加密服务。在 XP 下,服务的名称略有不同:“Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)”。AesCryptoServiceProvider 的构造函数执行一个简单的检查:
string providerName = "Microsoft Enhanced RSA and AES Cryptographic Provider";
if(Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1)
{
providerName = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)";
}
SHAxxxCryptoServiceProvider 类的构造函数不检查(原型)名称,这就是它们在 XP 中失败的原因。如果他们这样做了,他们就会成功。
在给定的 PC 上有一个简单的解决方法。转到注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider,找到其名为“Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)”的子项,将其导出为 .reg,编辑此 .reg 并删除“(Prototype)”从它的名字。当你重新导入时,原来的密钥将被复制到没有(原型)的新密钥,内容相同。从现在开始,SHA256CryptoServiceProvider 将在这台 XPSP3 机器上工作。