RSACryptoServiceProvider.SignHash-Methode
Berechnet die Signatur für den angegebenen Hashwert durch Verschlüsselung mit dem privaten Schlüssel.
Namespace: System.Security.Cryptography
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Function SignHash ( _
rgbHash As Byte(), _
str As String _
) As Byte()
'Usage
Dim instance As RSACryptoServiceProvider
Dim rgbHash As Byte()
Dim str As String
Dim returnValue As Byte()
returnValue = instance.SignHash(rgbHash, str)
public byte[] SignHash (
byte[] rgbHash,
string str
)
public:
array<unsigned char>^ SignHash (
array<unsigned char>^ rgbHash,
String^ str
)
public byte[] SignHash (
byte[] rgbHash,
String str
)
public function SignHash (
rgbHash : byte[],
str : String
) : byte[]
Parameter
- rgbHash
Der Hashwert der zu signierenden Daten.
- str
Der OID (Hash Algorithm Identifier) zum Erstellen des Hashwerts der Daten.
Rückgabewert
Die RSA-Signatur für den angegebenen Hashwert.
Ausnahmen
Ausnahmetyp | Bedingung |
---|---|
Der rgbHash-Parameter ist NULL (Nothing in Visual Basic). |
|
Der CSP kann nicht ermittelt werden. – oder – Es ist kein privater Schlüssel vorhanden. |
Hinweise
Diese Methode erstellt eine digitale Signatur, die mithilfe der VerifyHash-Methode überprüft wird.
Die gültigen Hashalgorithmen sind SHA1 und MD5. Der Algorithmusbezeichner kann mithilfe der MapNameToOID-Methode vom Hashnamen abgeleitet werden.
Beispiel
Im folgenden Codebeispiel werden einige Daten verschlüsselt und ein Hash der verschlüsselten Daten erstellt. Anschließend wird der Hash mit einer digitalen Signatur versehen.
Imports System
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 'Main
End Class 'MyMainClass
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 'New
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 'Sender
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 'New
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
rsaCSP.ImportParameters(rsaParams)
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 'DecryptData
End Class 'Receiver
End Namespace 'RSACryptoServiceProvider_Examples
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);
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);
}
}
}
#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 );
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" );
}
}
package RSACryptoServiceProvider_Examples;
import System.*;
import System.Text.*;
import System.Security.Cryptography.*;
class MyMainClass
{
public static void main(String[] args)
{
ubyte toEncrypt[];
ubyte encrypted[];
ubyte 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.get_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.get_PublicParameters(),
encrypted, signature)) {
// Decrypt the data using the receiver's private key.
myReceiver.DecryptData(encrypted);
}
else {
Console.WriteLine("Invalid signature");
}
} //main
} //MyMainClass
class Sender
{
private RSAParameters rsaPubParams;
private RSAParameters rsaPrivateParams;
public Sender()
{
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
// Generate public and private key data.
rsaPrivateParams = rsaCSP.ExportParameters(true);
rsaPubParams = rsaCSP.ExportParameters(false);
} //Sender
/** @property
*/
public RSAParameters get_PublicParameters()
{
return rsaPubParams;
} //get_PublicParameters
// Manually performs hash and then signs hashed value.
public ubyte[] HashAndSign(ubyte encrypted[])
{
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
SHA1Managed hash = new SHA1Managed();
ubyte hashedData[];
rsaCSP.ImportParameters(rsaPrivateParams);
hashedData = hash.ComputeHash(encrypted);
return rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));
} //HashAndSign
// Encrypts using only the public key data.
public ubyte[] EncryptData(RSAParameters rsaParams, ubyte toEncrypt[])
{
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
rsaCSP.ImportParameters(rsaParams);
return rsaCSP.Encrypt(toEncrypt, false);
} //EncryptData
} //Sender
class Receiver
{
private RSAParameters rsaPubParams;
private RSAParameters rsaPrivateParams;
public Receiver()
{
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
// Generate public and private key data.
rsaPrivateParams = rsaCSP.ExportParameters(true);
rsaPubParams = rsaCSP.ExportParameters(false);
} //Receiver
/** @property
*/
public RSAParameters get_PublicParameters()
{
return rsaPubParams;
} //get_PublicParameters
// Manually performs hash and then verifies hashed value.
public boolean VerifyHash(RSAParameters rsaParams,
ubyte signedData[], ubyte signature[])
{
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
SHA1Managed hash = new SHA1Managed();
ubyte hashedData[];
rsaCSP.ImportParameters(rsaParams);
hashedData = hash.ComputeHash(signedData);
return rsaCSP.VerifyHash(hashedData,
CryptoConfig.MapNameToOID("SHA1"), signature);
} //VerifyHash
// Decrypt using the private key data.
public void DecryptData(ubyte encrypted[])
{
ubyte 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);
} //DecryptData
} //Receiver
.NET Framework-Sicherheit
- KeyContainerPermission für die Berechtigung, eine Datei mithilfe des Schlüssels zu signieren. Zugeordnete Enumeration: Sign. Sicherheitsaktion: Demand.
Plattformen
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
.NET Compact Framework
Unterstützt in: 2.0
Siehe auch
Referenz
RSACryptoServiceProvider-Klasse
RSACryptoServiceProvider-Member
System.Security.Cryptography-Namespace