'////////////////////////////////////////////////////////// '// CRIPTOGRAFIA - Técnicas de desarrollo para profesionales '////////////////////////////////////////////////////////// '// Capítulo 4: Criptografía en entornos .NET '// Sección 4.4: Codificación de encriptación asimétrica '////////////////////////////////////////////////////////// '// Listado 4.3: Ejemplo que implementa la firma digital '// utilizando el algoritmo DSA. Versión VB.NET. '////////////////////////////////////////////////////////// Imports System Imports System.Security.Cryptography Imports System.Text Class EjemploDSA Shared Sub Main() Try ' Crear una nueva instancia de DSACryptoServiceProvider para ' la generación de un nuevo par de llaves Dim DSA As New DSACryptoServiceProvider() ' Crear la instancia de SHA1CryptoServiceProvider para generar el hash SHA-1 Dim sha As New SHA1CryptoServiceProvider() ' Obtener el resultado del hash de nuestro ejemplo, que luego ' firmaremos Dim HashValue As Byte() = sha.ComputeHash(Encoding.Default.GetBytes("Contenido de prueba")) ' Almacenar el valor firmado Dim SignedHashValue As Byte() = DSASignHash(HashValue, DSA.ExportParameters(True), "SHA1") ' Verificar el hash y mostrar los resutados If DSAVerifyHash(HashValue, SignedHashValue, DSA.ExportParameters(False), "SHA1") Then Console.WriteLine("El resultado del hash fue verificado.") Else Console.WriteLine("El resultado del hash NO fue verificado.") End If Catch e As ArgumentNullException Console.WriteLine(e.Message) End Try End Sub Public Shared Function DSASignHash(ByVal HashToSign() As Byte, ByVal DSAKeyInfo As DSAParameters, ByVal HashAlg As String) As Byte() Try ' Crear una nueva instancia de DSACryptoServiceProvider Dim DSA As New DSACryptoServiceProvider() ' Importar la información de la llave DSA.ImportParameters(DSAKeyInfo) ' Crear una instancia de DSASignatureFormatter y pasar la ' DSACryptoServiceProvider para transferir la llave privada Dim DSAFormatter As New DSASignatureFormatter(DSA) ' Establecer el algoritmo de hashing según parámetro DSAFormatter.SetHashAlgorithm(HashAlg) ' Crear la firma para HashValue y devolverlo Return DSAFormatter.CreateSignature(HashToSign) Catch e As CryptographicException Console.WriteLine(e.Message) Return Nothing End Try End Function Public Shared Function DSAVerifyHash(ByVal HashValue() As Byte, ByVal SignedHashValue() As Byte, ByVal DSAKeyInfo As DSAParameters, ByVal HashAlg As String) As Boolean Try ' Crear una nueva instancia de DSACryptoServiceProvider Dim DSA As New DSACryptoServiceProvider() ' Importar información de la llave DSA.ImportParameters(DSAKeyInfo) ' Crear una instancia de DSASignatureFormatter y pasar la ' DSACryptoServiceProvider para transferir la llave privada Dim DSADeformatter As New DSASignatureDeformatter(DSA) ' Establecer el algoritmo de hashing según parámetro DSADeformatter.SetHashAlgorithm(HashAlg) ' Verificar la firma y devolver el resultado Return DSADeformatter.VerifySignature(HashValue, SignedHashValue) Catch e As CryptographicException Console.WriteLine(e.Message) Return False End Try End Function End Class