RSACryptoServiceProvider.SignHash 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정된 해시 값의 서명을 계산합니다.
오버로드
SignHash(Byte[], String) |
지정된 해시 값의 서명을 계산합니다. |
SignHash(Byte[], HashAlgorithmName, RSASignaturePadding) |
지정된 패딩을 사용하여 지정된 해시 값의 서명을 계산합니다. |
SignHash(Byte[], String)
지정된 해시 값의 서명을 계산합니다.
public:
cli::array <System::Byte> ^ SignHash(cli::array <System::Byte> ^ rgbHash, System::String ^ str);
public byte[] SignHash (byte[] rgbHash, string? str);
public byte[] SignHash (byte[] rgbHash, string str);
override this.SignHash : byte[] * string -> byte[]
member this.SignHash : byte[] * string -> byte[]
Public Function SignHash (rgbHash As Byte(), str As String) As Byte()
매개 변수
- rgbHash
- Byte[]
서명할 데이터의 해시 값입니다.
- str
- String
데이터의 해시 값을 만드는 데 사용되는 해시 알고리즘 식별자(OID)입니다.
반환
지정된 해시 값의 RSA 서명입니다.
예외
rgbHash
매개 변수가 null
인 경우
예제
다음 코드 예제에서는 일부 데이터를 암호화하고, 암호화된 데이터의 해시를 만든 다음, 디지털 서명을 사용하여 해시에 서명합니다.
// This example uses the SHA1 algorithm.
// Due to collision problems with SHA1, Microsoft recommends SHA256 or better.
#using <System.dll>
using namespace System;
using namespace System::Text;
using namespace System::Security::Cryptography;
ref class Sender
{
private:
RSAParameters rsaPubParams;
RSAParameters rsaPrivateParams;
public:
Sender()
{
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
//Generate public and private key data.
rsaPrivateParams = rsaCSP->ExportParameters( true );
rsaPubParams = rsaCSP->ExportParameters( false );
}
property RSAParameters PublicParameters
{
RSAParameters get()
{
return rsaPubParams;
}
}
//Manually performs hash and then signs hashed value.
array<Byte>^ HashAndSign( array<Byte>^encrypted )
{
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
SHA1Managed^ hash = gcnew SHA1Managed;
array<Byte>^hashedData;
rsaCSP->ImportParameters( rsaPrivateParams );
hashedData = hash->ComputeHash( encrypted );
return rsaCSP->SignHash( hashedData, CryptoConfig::MapNameToOID( "SHA1" ) );
}
//Encrypts using only the public key data.
array<Byte>^ EncryptData( RSAParameters rsaParams, array<Byte>^toEncrypt )
{
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
rsaCSP->ImportParameters( rsaParams );
return rsaCSP->Encrypt( toEncrypt, false );
}
};
ref class Receiver
{
private:
RSAParameters rsaPubParams;
RSAParameters rsaPrivateParams;
public:
Receiver()
{
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
//Generate public and private key data.
rsaPrivateParams = rsaCSP->ExportParameters( true );
rsaPubParams = rsaCSP->ExportParameters( false );
}
property RSAParameters PublicParameters
{
RSAParameters get()
{
return rsaPubParams;
}
}
//Manually performs hash and then verifies hashed value.
bool VerifyHash( RSAParameters rsaParams, array<Byte>^signedData, array<Byte>^signature )
{
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
SHA1Managed^ hash = gcnew SHA1Managed;
array<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.
void DecryptData( array<Byte>^encrypted )
{
array<Byte>^fromEncrypt;
String^ roundTrip;
ASCIIEncoding^ myAscii = gcnew ASCIIEncoding;
RSACryptoServiceProvider^ rsaCSP = gcnew RSACryptoServiceProvider;
rsaCSP->ImportParameters( rsaPrivateParams );
fromEncrypt = rsaCSP->Decrypt( encrypted, false );
roundTrip = myAscii->GetString( fromEncrypt );
Console::WriteLine( "RoundTrip: {0}", roundTrip );
}
};
int main()
{
array<Byte>^toEncrypt;
array<Byte>^encrypted;
array<Byte>^signature;
//Choose a small amount of data to encrypt.
String^ original = "Hello";
ASCIIEncoding^ myAscii = gcnew ASCIIEncoding;
//Create a sender and receiver.
Sender^ mySender = gcnew Sender;
Receiver^ myReceiver = gcnew 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" );
}
}
// 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);
}
}
}
' This example uses the SHA1 algorithm.
' Due to collision problems with SHA1, Microsoft recommends SHA256 or better.
Imports System.Text
Imports System.Security.Cryptography
Namespace RSACryptoServiceProvider_Examples
Class MyMainClass
Shared Sub Main()
Dim toEncrypt() As Byte
Dim encrypted() As Byte
Dim signature() As Byte
'Choose a small amount of data to encrypt.
Dim original As String = "Hello"
Dim myAscii As New ASCIIEncoding()
'Create a sender and receiver.
Dim mySender As New Sender()
Dim myReceiver As 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) Then
'Decrypt the data using the receiver's private key.
myReceiver.DecryptData(encrypted)
Else
Console.WriteLine("Invalid signature")
End If
End Sub
End Class
Class Sender
Private rsaPubParams As RSAParameters
Private rsaPrivateParams As RSAParameters
Public Sub New()
Dim rsaCSP As New RSACryptoServiceProvider()
'Generate public and private key data.
rsaPrivateParams = rsaCSP.ExportParameters(True)
rsaPubParams = rsaCSP.ExportParameters(False)
End Sub
Public ReadOnly Property PublicParameters() As RSAParameters
Get
Return rsaPubParams
End Get
End Property
'Manually performs hash and then signs hashed value.
Public Function HashAndSign(ByVal encrypted() As Byte) As Byte()
Dim rsaCSP As New RSACryptoServiceProvider()
Dim hash As New SHA1Managed()
Dim hashedData() As Byte
rsaCSP.ImportParameters(rsaPrivateParams)
hashedData = hash.ComputeHash(encrypted)
Return rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"))
End Function 'HashAndSign
'Encrypts using only the public key data.
Public Function EncryptData(ByVal rsaParams As RSAParameters, ByVal toEncrypt() As Byte) As Byte()
Dim rsaCSP As New RSACryptoServiceProvider()
rsaCSP.ImportParameters(rsaParams)
Return rsaCSP.Encrypt(toEncrypt, False)
End Function 'EncryptData
End Class
Class Receiver
Private rsaPubParams As RSAParameters
Private rsaPrivateParams As RSAParameters
Public Sub New()
Dim rsaCSP As New RSACryptoServiceProvider()
'Generate public and private key data.
rsaPrivateParams = rsaCSP.ExportParameters(True)
rsaPubParams = rsaCSP.ExportParameters(False)
End Sub
Public ReadOnly Property PublicParameters() As RSAParameters
Get
Return rsaPubParams
End Get
End Property
'Manually performs hash and then verifies hashed value.
Public Function VerifyHash(ByVal rsaParams As RSAParameters, ByVal signedData() As Byte, ByVal signature() As Byte) As Boolean
Dim rsaCSP As New RSACryptoServiceProvider()
Dim hash As New SHA1Managed()
Dim hashedData() As Byte
Dim dataOK As Boolean
rsaCSP.ImportParameters(rsaParams)
dataOK = rsaCSP.VerifyData(signedData, CryptoConfig.MapNameToOID("SHA1"), signature)
hashedData = hash.ComputeHash(signedData)
Return rsaCSP.VerifyHash(hashedData, CryptoConfig.MapNameToOID("SHA1"), signature)
End Function 'VerifyHash
'Decrypt using the private key data.
Public Sub DecryptData(ByVal encrypted() As Byte)
Dim fromEncrypt() As Byte
Dim roundTrip As String
Dim myAscii As New ASCIIEncoding()
Dim rsaCSP As New RSACryptoServiceProvider()
rsaCSP.ImportParameters(rsaPrivateParams)
fromEncrypt = rsaCSP.Decrypt(encrypted, False)
roundTrip = myAscii.GetString(fromEncrypt)
Console.WriteLine("RoundTrip: {0}", roundTrip)
End Sub
End Class
End Namespace 'RSACryptoServiceProvider_Examples
설명
이 메서드는 메서드를 사용하여 VerifyHash 확인된 디지털 서명을 만듭니다.
유효한 해시 알고리즘은 및 MD5입니다SHA1. 알고리즘 식별자는 메서드를 사용하여 MapNameToOID 해시 이름에서 파생될 수 있습니다.
SHA1 및 MD5의 충돌 문제로 인해 MICROSOFT는 SHA256 이상을 기반으로 하는 보안 모델을 권장합니다.
추가 정보
적용 대상
SignHash(Byte[], HashAlgorithmName, RSASignaturePadding)
지정된 패딩을 사용하여 지정된 해시 값의 서명을 계산합니다.
public:
override cli::array <System::Byte> ^ SignHash(cli::array <System::Byte> ^ hash, System::Security::Cryptography::HashAlgorithmName hashAlgorithm, System::Security::Cryptography::RSASignaturePadding ^ padding);
public override byte[] SignHash (byte[] hash, System.Security.Cryptography.HashAlgorithmName hashAlgorithm, System.Security.Cryptography.RSASignaturePadding padding);
override this.SignHash : byte[] * System.Security.Cryptography.HashAlgorithmName * System.Security.Cryptography.RSASignaturePadding -> byte[]
Public Overrides Function SignHash (hash As Byte(), hashAlgorithm As HashAlgorithmName, padding As RSASignaturePadding) As Byte()
매개 변수
- hash
- Byte[]
서명할 데이터의 해시 값입니다.
- hashAlgorithm
- HashAlgorithmName
데이터의 해시 값을 만드는 데 사용되는 해시 알고리즘 이름입니다.
- padding
- RSASignaturePadding
패딩입니다.
반환
지정된 해시 값의 RSA 서명입니다.
예외
hashAlgorithm
이 null
또는 Empty입니다.
padding
이 Pkcs1와 다른 경우
적용 대상
.NET