‘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
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
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!!!
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.
bueno tu ejemplo que esta amargado el de arriba xD
gracias(mi msn es pedrorico6338@hotmail.com)
xD
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?
oye me puedes decir que algoritmo utiliza la encriptada y desencriptada??
william_dj@latinmail.com
esta super buena la clase, me sirvio para mi proposito, muchas gracias
Excelente articulo, como dicen al principio, para los novatos (por ejemplo yo) me sirvio batante para.
Gracias por estas aportaciones