订阅数据并验证签名C#

时间:2017-01-07 14:53:51

标签: c# rsa rsacryptoserviceprovider

我想制作2个应用程序。第一个将加密文件并签名。第二个将加密并验证数据。我使用以下代码作为示例。

using System;
using System.Security.Cryptography;
using System.Text;
class RSACSPSample
{
    static void Main()
    {
        try
        {
            // Create a UnicodeEncoder to convert between byte array and string.
            ASCIIEncoding ByteConverter = new ASCIIEncoding();
            string dataString = "Data to Sign";
            // Create byte arrays to hold original, encrypted, and decrypted data.
            byte[] originalData = ByteConverter.GetBytes(dataString);
            byte[] signedData;
            // Create a new instance of the RSACryptoServiceProvider class 
            // and automatically create a new key-pair.
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            // Export the key information to an RSAParameters object.
            // You must pass true to export the private key for signing.
            // However, you do not need to export the private key
            // for verification.
            RSAParameters Key = RSAalg.ExportParameters(true);
            // Hash and sign the data.
            signedData = HashAndSignBytes(originalData, Key);
            // Verify the data and display the result to the 
            // console.
            if(VerifySignedHash(originalData, signedData, Key))
            {
                Console.WriteLine("The data was verified.");
            }
            else
            {
                Console.WriteLine("The data does not match the signature.");
            }
        }
        catch(ArgumentNullException)
        {
            Console.WriteLine("The data was not signed or verified");
        }
    }
    public static byte[] HashAndSignBytes(byte[] DataToSign, RSAParameters Key)
    {
        try
        {   
            // Create a new instance of RSACryptoServiceProvider using the 
            // key from RSAParameters.  
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            RSAalg.ImportParameters(Key);
            // Hash and sign the data. Pass a new instance of SHA1CryptoServiceProvider
            // to specify the use of SHA1 for hashing.
            return RSAalg.SignData(DataToSign, new SHA1CryptoServiceProvider());
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }
    public static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, RSAParameters Key)
    {
        try
        {
            // Create a new instance of RSACryptoServiceProvider using the 
            // key from RSAParameters.
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            RSAalg.ImportParameters(Key);
            // Verify the data using the signature.  Pass a new instance of SHA1CryptoServiceProvider
            // to specify the use of SHA1 for hashing.
            return RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData); 
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return false;
        }
    }
}

问题是我无法理解如何为VerifySignedHash函数获取OriginalData(第一个参数)?我的意思是应用程序(签名检查器)将读取签名数据。如何将签名数据转换为数据验证原始数据?

0 个答案:

没有答案