Página 1 de 2

Generar SHA256 en C#

Publicado: Vie Jul 28, 2017 5:24 pm
por gerloxxx
Hola a todos, estoy intentando usar la clase SHA256CryptoServiceProvider para generar el SHA256:


System.Security.Cryptography.SHA256CryptoServiceProvider hasher = new System.Security.Cryptography.SHA256CryptoServiceProvider();

pero me marca el siguiente error:


Error 4 El tipo o el nombre del espacio de nombres 'SHA256CryptoServiceProvider' no existe en el espacio de nombres 'System.Security.Cryptography' (¿falta una referencia de ensamblado?)


alguna sugerencia?? uso VS2012

Saludos

Re: Generar SHA256 en C#

Publicado: Vie Jul 28, 2017 9:17 pm
por RicJaver
Buenas noches.

Te recomiendo la siguiente liga:

https://www.codeproject.com/Tips/703567 ... private-ke

Para generar el sello como Sha256, solo cambiar new SHA1CryptoServiceProvider()); por
new SHA256CryptoServiceProvider());

Espero te sea de utilidad.

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 9:07 am
por gerloxxx
Gracias por responder, ya uso la clase opensslkey y en el cambio que comentas es donde me marca el error:
antes:
System.Security.Cryptography.SHA1CryptoServiceProvider hasher = new System.Security.Cryptography.SHA1CryptoServiceProvider();
ahora:
System.Security.Cryptography.SHA256CryptoServiceProvider hasher = new System.Security.Cryptography.SHA256CryptoServiceProvider();

pero no entiendo porque no reconoce SHA256CryptoServiceProvider, ya lei la documentacion y algunos ejemplo que encontre que lo usan.

saludos

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 9:21 am
por gerloxxx
ahorita me acabo de encontrar esto:

byte[] bytesFirmados = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(strCadenaOriginal), System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));

donde:
System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));
en lugar de:
System.Security.Cryptography.SHA256CryptoServiceProvider hasher = new System.Security.Cryptography.SHA256CryptoServiceProvider();

espero me sirva

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 10:09 am
por RicJaver
Buenos días.

Pues si, en la función SignString que en en el artículo de CodeProject es:

public string SignString(string pKeyFile,string pPassword,string OriginalString)
{
string SignedString = "";
string filename = pKeyFile;
if (!File.Exists(filename))
{
return ".key file does not exist " + pKeyFile;
}

RSACryptoServiceProvider rsa=OpenKeyFile(filename, pPassword);
if (rsa != null)
{
byte[] CO=Encoding.UTF8.GetBytes(OriginalString);
byte[] SignedBytes=rsa.SignData(CO, new SHA1CryptoServiceProvider());
SignedString = Convert.ToBase64String(SignedBytes);
}
return SignedString;
}

Simplemente cambiar byte[] SignedBytes=rsa.SignData(CO, new SHA1CryptoServiceProvider()); por
byte[] SignedBytes=rsa.SignData(CO, new SHA256CryptoServiceProvider());
que entiendo que es lo que estas haciendo, asi que seguro funciona.

Saludos y suerte.

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 11:01 am
por gerloxxx
gracias por responder, creo que no me han entendido.... mi compilador dice que esto: "SHA256CryptoServiceProvider()" no existe :( (System.Security.Cryptography)

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 11:40 am
por RicJaver
Tienes razón, no entendía el problema.

En el hilo: http://www.validacfd.com/phpbb3/viewtopic.php?t=6699



robsgax
Mensajes: 1
Registrado: Lun Abr 10, 2017 8:18 pm
Re: Como crear el Sello con SHA256 en VBNET o C#
Mensajepor robsgax » Lun Abr 10, 2017 8:24 pm

este es el que uso yo, el del SHA256CryptoServiceProvider no funciona en librerias .net por un bug

CÓDIGO: SELECCIONAR TODO
Dim privateCert As New X509Certificate2(archivoPFX, clavePFX, X509KeyStorageFlags.Exportable)
Dim privateKey As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider)
Dim privateKey1 As New RSACryptoServiceProvider()
privateKey1.ImportParameters(privateKey.ExportParameters(True))

Dim signature As Byte() = privateKey1.SignData(stringCadenaOriginal, "SHA256")

dim sello256 as string = Convert.ToBase64String(signature)

para verificar el sello
Dim isValid As Boolean = privateKey1.VerifyData(stringCadenaOriginal, "SHA256", signature)

Entonces, el usuario robsgax señala "el del SHA256CryptoServiceProvider no funciona en librerias .net por un bug", pero da la solución.

Como comentario, yo uso VS Community 2017, y no tengo ningún problema.

Saludos.

Re: Generar SHA256 en C#

Publicado: Sab Jul 29, 2017 11:46 am
por gerloxxx
gracias, como comentario, estoy probando MapNameToOID("SHA256") en lugar de SHA256CryptoServiceProvider, el validador ValidaCfd de este foro me lo marca como correcto aunque aun no he timbrado

saludos

Re: Generar SHA256 en C#

Publicado: Mar Ago 22, 2017 10:38 pm
por jivra
Agradezco a:
RicJaver » Sab Jul 29, 2017 12:40 pm
y
robsgax » Lun Abr 10, 2017 8:24 pm

Aquí dejo esta rutina, la cual ya me devuelve un sello valido:

Código: Seleccionar todo

Public Function GeneraSelloDigitalSHA256(ByVal ArchivoP12 As String, ByVal LlavePrivada As String, ByVal CadenaOriginal As String) As String

        Dim privateCert As New X509Certificate2(ArchivoP12, LlavePrivada, X509KeyStorageFlags.Exportable)

        Dim privateKey As RSACryptoServiceProvider = DirectCast(privateCert.PrivateKey, RSACryptoServiceProvider)
        Dim privateKey1 As New RSACryptoServiceProvider()
        privateKey1.ImportParameters(privateKey.ExportParameters(True))

        Dim signature As Byte() = privateKey1.SignData(System.Text.Encoding.UTF8.GetBytes(CadenaOriginal), "SHA256")

        Dim sello256 As String = Convert.ToBase64String(signature)
        MsgBox("Sello: " & sello256)

        Dim isValid As Boolean = privateKey1.VerifyData(System.Text.Encoding.UTF8.GetBytes(CadenaOriginal), "SHA256", signature)
        MsgBox("Validacion: " & isValid)

        Return sello256

    End Function

Re: Generar SHA256 en C#

Publicado: Lun Nov 27, 2017 4:55 pm
por carlosph85
gerloxxx escribió:ahorita me acabo de encontrar esto:

byte[] bytesFirmados = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(strCadenaOriginal), System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));

donde:
System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));
en lugar de:
System.Security.Cryptography.SHA256CryptoServiceProvider hasher = new System.Security.Cryptography.SHA256CryptoServiceProvider();

espero me sirva
Hola Buenas tardes, lograste resolver este tema? Yo lo estoy haciendo sobre vb.net, si me funciona el SHA256CryptoServiceProvider sin embargo el sello que genera la validación me lo marca como incorrecto, no lo logro timbrar