验证签名
更新:2007 年 11 月
若要验证数据是否是由特定方进行签名的,您必须具有以下信息:
对数据进行签名的一方的公钥。
数字签名。
已签名的数据。
签名方使用的哈希算法。
若要验证由 RSAPKCS1SignatureFormatter 类签署的签名,请使用 RSAPKCS1SignatureDeformatter 类。必须向 RSAPKCS1SignatureDeformatter 类提供签名方的公钥。您将需要模数和指数的值以指定公钥。(生成公钥/私钥对的一方应提供这些值。) 首先创建一个 RSACryptoServiceProvider 对象以保存将验证该签名的公钥,然后将 RSAParameter 结构初始化为指定该公钥的模数值和指数值。
下面的代码显示 RSAParameters 结构的创建。Modulus 属性被设置为称为 ModulusData 的字节数组的值,而 Exponent 属性被设置为称为 ExponentData 的字节数组的值。
Dim RSAKeyInfo As RSAParameters
RSAKeyInfo.Modulus = ModulusData
RSAKeyInfo.Exponent = ExponentData
RSAParameters RSAKeyInfo;
RSAKeyInfo.Modulus = ModulusData;
RSAKeyInfo.Exponent = ExponentData;
创建 RSAParameters 对象后,可以将 RSACryptoServiceProvider 类的新实例初始化为在 RSAParameters 中指定的值。然后将 RSACryptoServiceProvider 传递给 RSAPKCS1SignatureDeformatter 的构造函数以传输密钥。
下面的示例阐释此过程。在本示例中,HashValue 和 SignedHashValue 是远程方提供的字节数组。该远程方已使用 SHA1 算法对 HashValue 进行了签名,从而生成了数字签名 SignedHashValue。RSAPKCS1SignatureDeformatter.VerifySignature 方法验证该数字签名是否有效并被用于对 HashValue 进行签名。
Dim RSA As New RSACryptoServiceProvider()
RSA.ImportParameters(RSAKeyInfo)
Dim RSADeformatter As New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA1")
If RSADeformatter.VerifySignature(HashValue, SignedHashValue) Then
Console.WriteLine("The signature is valid.")
Else
Console.WriteLine("The signture is not valid.")
End If
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("SHA1");
if(RSADeformatter.VerifySignature(HashValue, SignedHashValue))
{
Console.WriteLine("The signature is valid.");
}
else
{
Console.WriteLine("The signature is not valid.");
}
如果签名有效,则上述的代码段将显示“The signature is valid”;如果无效,则显示“The signature is not valid”。