Encriptación: Una clase que te puede simplificar las cosas

‘Este código que hoy os mando es fue desarrollado por mí y el amigo Elliott (dev4u.net@gmail.com) he dividido el trabajo de los 2 en Regiones, mi parte del trabajo es la región Contraseñas Hash y la de Elliott Encriptar/Desencriptar, yo comentaré mi parte, si tenéis alguna duda con su código contactad con él, o contactad conmigo para que os ponga en contacto con él.


 


‘Antes de que me olvide otra cosa, fue desarrollado con Visual Studio 2005, pero no tiene ningún problema en ser usado con Visual Studio .NET 2003 (a mi no me dio ningún conflicto).


 


Imports System


Imports System.IO


Imports System.Security


Imports System.Security.Cryptography


Imports System.Text


 


Public Class Criptologia



#Region «Contraseñas Hash»



    ‘Con esta función que tenemos aquí abajo, lo que haces es transformar la cadena en Bytes.


    Shared Function ConvertirCadenaEnMatrizDeTipoByte(ByVal Cadena As [String]) As [Byte]()


        Return (New UnicodeEncoding).GetBytes(Cadena)


        ‘Retornamos la cadena convertida.


    End Function



    ‘En esta función la cadena la convertiremos en Bytes con la función anterior, lo transformaremos en un valor Hash, encriptado con el algoritmo SHA512 y más tarde lo convertiremos en una cadena.



    Public Function EncriptarHash(ByVal ValorAEncriptar As String) As String


        Dim ValorToHash As [Byte]() = ConvertirCadenaEnMatrizDeTipoByte(ValorAEncriptar)


        ‘Declaramos la variable de tipo Byte y llamamos a ConvertirCadenaEnMatrizDeTipoByte y convertimos la cadena a encriptar en typo Byte


        Dim ValorHash As Byte() = CType(CryptoConfig.CreateFromName(«SHA512»), HashAlgorithm).ComputeHash(ValorToHash)


        ‘Encriptamos variable Byte en una cadena de tipo Byte, también.


        Return Convert.ToBase64String(ValorHash)


        ‘BitConverter.ToString(ValorHash)


        ‘Retornamos la variable de tipo Byte en String.


    End Function



    ‘Para comparar dos valores lo primero es enviar como parametros una cadena sin encriptar y otra cadena encriptada, con el mismo tipo de encriptación, y haciendo uso del mismo algoritmo, en nuestro caso usaremos Hash con el algoritmo SHA512. Luego encriptamos el valor si encriptar y comparamos los dos valores, retornando True si son iguales y False si son diferentes, esto lo podemos hacer con una simple sentencia IF.


    Public Function Comparar(ByVal ValorSinEncriptar As String, ByVal ValorEncriptado As String) As Boolean


        If EncriptarHash(ValorSinEncriptar) = ValorEncriptado Then


            Return True


        Else


            Return False


        End If


    End Function


#End Region


 


#Region «Encriptar/Desencriptar»


    Const StrClave As String = «EjemploDeCodigo»


    Public Function EncriptarTexto(ByVal CadenaAEncriptar As String, Optional ByVal Clave As String = StrClave, Optional ByVal MantenerMayusculas As Boolean = True)


        Dim i As Integer, C As Integer


        Dim CadenaEncriptada As String


        If MantenerMayusculas = False Then


            Clave = Clave.ToUpper()


            CadenaAEncriptar = CadenaAEncriptar.ToUpper()


        End If


        If Len(Clave) Then


            For i = 1 To Len(CadenaAEncriptar)


                C = Asc(Mid$(CadenaAEncriptar, i, 1))


                C = C + Asc(Mid$(Clave, (i Mod Len(Clave)) + 1, 1))


                CadenaEncriptada = CadenaEncriptada & Chr(C And &HFF)


            Next i


        Else


            CadenaEncriptada = CadenaAEncriptar


        End If


        Return CadenaEncriptada


    End Function


 


    Public Function DesencriptarTexto(ByVal CadenaADesencriptar As String, Optional ByVal Clave As String = StrClave, Optional ByVal MantenerMayusculas As Boolean = True)


        Dim i As Integer, C As Integer


        Dim CadenaDesencriptada As String


        If MantenerMayusculas = False Then


            Clave = Clave.ToUpper


        End If


        If Len(Clave) Then


            For i = 1 To Len(CadenaADesencriptar)


                C = Asc(Mid$(CadenaADesencriptar, i, 1))


                C = C – Asc(Mid$(Clave, (i Mod Len(Clave)) + 1, 1))


                CadenaDesencriptada += Chr(C And &HFF)


            Next i


        Else


            CadenaDesencriptada = CadenaADesencriptar


        End If


        Return CadenaDesencriptada


    End Function


#End Region


End Class

7 thoughts on “Encriptación: Una clase que te puede simplificar las cosas

  1. Hola Eugenio…

    Me gustaría que lo que voy a decir no sonase muy duro… pero el código que propones, es un compendio de malas prácticas en lo que a encriptación se refiere. 🙁

    La parte de contraseñas es más o menos correcta, pero sería mejorable añadiendo técnicas de ‘salteo’ del la contraseña.

    La parte de encriptación no hay por donde cojerla. Es el error más habitual, no distinguir entre encriptar y transformar los datos.

    Sin duda deberíais hechar un vistazo al excelente artículo:

    Desmitificando la Encriptación (I y II)
    http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/MTJ_2329.asp

    que repasa todos estos temas…

    Un saludo!!!

  2. Agradesco su colaboración ya que este ejemplo es muy util y facil de aplicar a programadores que se estan empesando a formar.

    Muchas gracias.

  3. disculpa nadamas queria saber que tipo de encriptologia usa o es una propia a lo que veo es criptologia simetrica pero me interesa usar tu trabajo para un programa que tenemos como proyecto habra algun problema?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *