英語で読む

次の方法で共有


RSACryptoServiceProvider.SignHash メソッド

定義

指定したハッシュ値の署名を計算します。

オーバーロード

SignHash(Byte[], String)

指定したハッシュ値の署名を計算します。

SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)

指定したパディングを使用して、指定したハッシュ値の署名を計算します。

SignHash(Byte[], String)

ソース:
RSACryptoServiceProvider.Unix.cs
ソース:
RSACryptoServiceProvider.Unix.cs
ソース:
RSACryptoServiceProvider.Unix.cs

指定したハッシュ値の署名を計算します。

public byte[] SignHash(byte[] rgbHash, string? str);
public byte[] SignHash(byte[] rgbHash, string str);

パラメーター

rgbHash
Byte[]

署名されたデータのハッシュ値。

str
String

データのハッシュ値を作成するために使用されるハッシュ アルゴリズム識別子 (OID)。

戻り値

Byte[]

指定されたハッシュ値の RSA 署名。

例外

rgbHash パラメーターが null です。

暗号化サービス プロバイダー (CSP) を取得できません。

- または -

秘密キーはありません。

次のコード例では、一部のデータを暗号化し、暗号化されたデータのハッシュを作成し、デジタル署名でハッシュに署名します。

// This example uses the SHA1 algorithm.
// Due to collision problems with SHA1, Microsoft recommends SHA256 or better.
using System;
using System.Text;
using System.Security.Cryptography;

namespace RSACryptoServiceProvider_Examples
{
    class MyMainClass
    {
        static void Main()
        {
            byte[] toEncrypt;
            byte[] encrypted;
            byte[] signature;
            //Choose a small amount of data to encrypt.
            string original = "Hello";
            ASCIIEncoding myAscii = new ASCIIEncoding();

            //Create a sender and receiver.
            Sender mySender = new Sender();
            Receiver myReceiver = new Receiver();

            //Convert the data string to a byte array.
            toEncrypt = myAscii.GetBytes(original);

            //Encrypt data using receiver's public key.
            encrypted = mySender.EncryptData(myReceiver.PublicParameters, toEncrypt);

            //Hash the encrypted data and generate a signature on the hash
            // using the sender's private key.
            signature = mySender.HashAndSign(encrypted);

            Console.WriteLine("Original: {0}", original);

            //Verify the signature is authentic using the sender's public key.
            if (myReceiver.VerifyHash(mySender.PublicParameters, encrypted, signature))
            {
                //Decrypt the data using the receiver's private key.
                myReceiver.DecryptData(encrypted);
            }
            else
            {
                Console.WriteLine("Invalid signature");
            }
        }
    }

    class Sender
    {
        RSAParameters rsaPubParams;
        RSAParameters rsaPrivateParams;

        public Sender()
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            //Generate public and private key data.
            rsaPrivateParams = rsaCSP.ExportParameters(true);
            rsaPubParams = rsaCSP.ExportParameters(false);
        }

        public RSAParameters PublicParameters
        {
            get
            {
                return rsaPubParams;
            }
        }

        //Manually performs hash and then signs hashed value.
        public byte[] HashAndSign(byte[] encrypted)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
            SHA1Managed hash = new SHA1Managed();
            byte[] hashedData;

            rsaCSP.ImportParameters(rsaPrivateParams);

            hashedData = hash.ComputeHash(encrypted);
            return rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));
        }

        //Encrypts using only the public key data.
        public byte[] EncryptData(RSAParameters rsaParams, byte[] toEncrypt)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            rsaCSP.ImportParameters(rsaParams);
            return rsaCSP.Encrypt(toEncrypt, false);
        }
    }

    class Receiver
    {
        RSAParameters rsaPubParams;
        RSAParameters rsaPrivateParams;

        public Receiver()
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            //Generate public and private key data.
            rsaPrivateParams = rsaCSP.ExportParameters(true);
            rsaPubParams = rsaCSP.ExportParameters(false);
        }

        public RSAParameters PublicParameters
        {
            get
            {
                return rsaPubParams;
            }
        }

        //Manually performs hash and then verifies hashed value.
        public bool VerifyHash(RSAParameters rsaParams, byte[] signedData, byte[] signature)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
            SHA1Managed hash = new SHA1Managed();
            byte[] hashedData;

            rsaCSP.ImportParameters(rsaParams);
            bool dataOK = rsaCSP.VerifyData(signedData, CryptoConfig.MapNameToOID("SHA1"), signature);
            hashedData = hash.ComputeHash(signedData);
            return rsaCSP.VerifyHash(hashedData, CryptoConfig.MapNameToOID("SHA1"), signature);
        }

        //Decrypt using the private key data.
        public void DecryptData(byte[] encrypted)
        {
            byte[] fromEncrypt;
            string roundTrip;
            ASCIIEncoding myAscii = new ASCIIEncoding();
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            rsaCSP.ImportParameters(rsaPrivateParams);
            fromEncrypt = rsaCSP.Decrypt(encrypted, false);
            roundTrip = myAscii.GetString(fromEncrypt);

            Console.WriteLine("RoundTrip: {0}", roundTrip);
        }
    }
}

注釈

このメソッドは、 メソッドを使用して検証されるデジタル署名を VerifyHash 作成します。

有効なハッシュ アルゴリズムは と MD5ですSHA1。 アルゴリズム識別子は、 メソッドを使用 MapNameToOID してハッシュ名から派生できます。

SHA1 と MD5 の競合の問題により、Microsoft は SHA256 以上に基づくセキュリティ モデルを推奨しています。

こちらもご覧ください

適用対象

.NET 10 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)

ソース:
RSACryptoServiceProvider.Unix.cs
ソース:
RSACryptoServiceProvider.Unix.cs
ソース:
RSACryptoServiceProvider.Unix.cs

指定したパディングを使用して、指定したハッシュ値の署名を計算します。

public override byte[] SignHash(byte[] hash, System.Security.Cryptography.HashAlgorithmName hashAlgorithm, System.Security.Cryptography.RSASignaturePadding padding);

パラメーター

hash
Byte[]

署名されたデータのハッシュ値。

hashAlgorithm
HashAlgorithmName

データのハッシュ値を作成するために使用されるハッシュ アルゴリズム名。

padding
RSASignaturePadding

パディング。

戻り値

Byte[]

指定されたハッシュ値の RSA 署名。

例外

hashAlgorithmnull または Empty です。

hashnullです。

または

paddingnullです。

paddingPkcs1 と一致しません。

適用対象

.NET 10 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1