none
Error al desencriptar RRS feed

  • Pregunta

  • Hola!

    Tengo proyecto en el cual al guardar los usuarios encripta la contraseña.

    Si modifico ciertos campos del usuario(no la contraseña) al momento de que querer ingresar mediante un login a ese usuario me aparece el siguiente error en la función desencriptar.

    Estuve buscando información y no encontré mucha por eso les pregunto a ustedes si saben alguna solución.

    Saludos

    viernes, 12 de mayo de 2017 16:48

Respuestas

  • "Federico32113" escribió:

    > Pero así es como quieres que capture el error? Llamo a una clase en "Encrip.Desencriptar"
    >
    >    Try
    >        Me.txt2.Text = Encrip.Desencriptar(Me.txt1.Text)
    >    Catch ex As Exception
    >        ' Aquí capturamos el error
    >        MessageBox.Show(ex.Message)
    >
    >    End Try
    >
    > Por favor si no es así como se busca el mensaje de error decirme como hacerlo.

    Efectivamente, así es como normalmente se captura o se busca el error que se ha podido producir en alguna función a la cual hemos llamado, en tu caso, a la función Encrip.Desencriptar.

    La captura de la excepción la puedes incluir dentro de la propia función Encrip.Desencriptar, pero eso estaría bien cuando vayas a generar una nueva excepción PERSONALIZANDO el mensaje de error. Si no es así, lo correcto es capturar la excepción FUERA de cualquier función o procedimiento.

    Y en cuanto al mensaje de error "Datos incorrectos" (que dicho sea de paso no es ningún error personalizado por tu parte, de ahí que también se produzca el mismo error cuando capturas la excepción dentro de la función Encrip.Desencriptar), no me queda más que pensar que se pueda deber a dos motivos:

        1. Que no existen datos para desencriptar, es decir, el valor del parámetro Input de la función Desencriptar es una cadena de longitud cero ("" o String.Empty), o bien

        2. Que el valor de la propiedad Key del algoritmo TripleDes sea diferente a aquel que se utilizo a la hora de encriptar el contenido.

    En estos casos el método TransformFinalBlock es el "culpable" de generar el mensaje de error "Datos incorrectos".

    > Public Function Desencriptar(ByVal Input As String) As String
    >
    >    Try
    >        Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("...")
    >        Dim EncryptionKey() As Byte = Convert.FromBase64String("...")
    >        Dim buffer() As Byte = Convert.FromBase64String(Input)
    >        Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
    >        des.Key = EncryptionKey
    >        des.IV = IV
    >        Return Encoding.UTF8.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()))
    >    Catch ex As Exception
    >        MessageBox.Show(ex.Message)
    >
    >    End Try
    > End Function

    Desde luego, observando el código que se ejecuta en la función Desencriptar, ahí puede pasar de todo menos desencriptar el contenido especificado. ;-)

    Si también tienes una función llamada Encriptar con parecido código para obtener el valor de las propiedades Key e IV del algoritmo simétrico TripleDes, me parece a mí que cualquiera va a poder desencriptar el contenido encriptado. ;-)

    Si quieres encriptar algo, al menos obliga a que el usuario establezca una contraseña con la que puedas derivar el valor de la propiedad Key, de ésta manera, no se podrá desencriptar el contenido encriptado salvo que alguien conozca la contraseña utilizada, claro está.

    Mira a ver si te sirve la adaptación que he hecho de tu función Desencriptar, a la que añadido la correspondiente función Encriptar:

    Imports System.Security.Cryptography
    Imports System.Text

    Public Function Desencriptar(input As String, password As String) As String If (String.IsNullOrWhiteSpace(input)) Then Throw New ArgumentException("No se han especificado datos para descifrar.") End If
            Dim buffer() As Byte = Convert.FromBase64String(input)
    Using des As New TripleDESCryptoServiceProvider() des.IV = GetDeriveBytes(password, des.IV.Length) des.Key = GetDeriveBytes(password, des.Key.Length) buffer = des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()) End Using
    Return Encoding.UTF8.GetString(buffer)

    End Function Public Function Encriptar(input As String, password As String) As String If (String.IsNullOrWhiteSpace(input)) Then Throw New ArgumentException("No se han especificado datos para cifrar.") End If
    Dim buffer() As Byte = Encoding.UTF8.GetBytes(input)

    Using des As New TripleDESCryptoServiceProvider() des.IV = GetDeriveBytes(password, des.IV.Length) des.Key = GetDeriveBytes(password, des.Key.Length) buffer = des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length()) End Using

            Return Convert.ToBase64String(buffer) End Function Private Shared Function GetDeriveBytes(password As String, size As Integer) As Byte() If (String.IsNullOrWhiteSpace(password)) Then Throw New ArgumentException("No se ha especificado una contraseña válida.") End If If ((size < 1) OrElse (size > 128)) Then Throw New ArgumentOutOfRangeException("size", "El tamaño debe estar comprendido entre 1 y 128.") End If Dim buffer As Byte() = Encoding.UTF8.GetBytes(password) ' Derivar la contraseña para obtener una matriz de bytes con el tamaño especificado. ' Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000) Return bytes.GetBytes(size) End Using End Function


    Cuando quieras encriptar el contenido existente en un control de texto llamado 'txt1' ejecutarías lo siguiente:

        Private Sub btnEncrypt_Click(sender As Object, e As EventArgs) Handles btnEncrypt.Click
    
            Try
                txt2.Text = Encriptar(txt1.Text, "contraseña")
                txt1.Clear()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub


    Y cuando quieras desencriptar el contenido existente en otro control de texto llamado 'txt2' ejecutaría esto otro:

        Private Sub btnDecrypt_Click(sender As Object, e As EventArgs) Handles btnDecrypt.Click
    
            Try
                txt1.Text = Desencriptar(txt2.Text, "contraseña")
                txt2.Clear()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si a la hora de querer desencriptar un valor se le pasa a la función Desencriptar una cadena de longitud cero, en lugar de obtener el mensaje de error "Datos incorrectos" el usuario obtendrá ahora el mensaje de error "No se han especificado datos para descifrar", que digamos es un poco más descriptivo que el anterior.

    Observa que tendrás que especificar una contraseña para llamar a las funciones Encriptar y Desencriptar, cuyo valor tendrá que ser el mismo. Es decir, que si has encriptado un contenido utilizando la contraseña "12345678", ese mismo valor tendrás que utilizar cuando quieras desencriptarlo. ¿Me explico? ;-)

    Adapta el ejemplo a tus necesidades.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 13 de mayo de 2017 7:00
    Moderador
  • "Federico32113" escribió:

    > -Me sigue quedando este error:
    >
    > Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)
    >    Return bytes.GetBytes(size)
    > End Using
    >
    > El operador 'Using' de tipo 'System.Security.Cryptography.Rfc2898DeriveBytes'
    > debe implementar 'System.IDisposable'.

    Nuevamente te indico que estaría enormemente agradecido que me respondieras a las preguntas que te efectúo, aunque ya no es necesario que me digas la versión de .NET con la que estás compilando tu proyecto, porque si obtienes ese mensaje de error, se debe a que estás utilizando una versión de .NET inferior a la 4.0, ya que fue a partir de ésta versión cuando a la clase Rfc2898DeriveBytes se le implementó la interfaz IDisposable.

    Sustituye el bloque Using ... End Using por las siguientes líneas:

            ' Derivar la contraseña para obtener una matriz de bytes con el tamaño especificado.
            '
            Dim bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)
            Return bytes.GetBytes(size)


    Pero que no se te olvide que, cuando alguien que te quiere ayudar te haga una pregunta, respóndela por favor, porque entonces no avanzamos nada. ¿OK?

    > -Otro error es el siguiente que me lo marca donde trato de utilizar la función "Encriptar"
    >
    > txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar)

    El mismo mensaje de error te está diciendo lo que falta, que no es más que indicar un valor al parámetro 'password', es decir, que tienes que especificar también la contraseña:

        txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar, "contraseña")

    Se comprende que ValorAEncriptar es una variable alfanumérica (String) que contiene el texto que deseas encriptar, porque si no es así, obtendrás otra excepción.

    > La solución a este error puede ser la siguiente?
    > Function Encriptar(ByVal cadena As Object) As String
    >    Throw New NotImplementedException
    > End Function

    Esa NO ES LA SOLUCIÓN, porque entonces cada vez que llames a la función Encriptar obtendrás una excepción (error) del tipo NotImplementedException, con un mensaje de error parecido a que el método no está implementado.

    La solución es pasarle todos los valores que espera el procedimiento, que para el caso de las funciones Encriptar y Desencriptar son dos: el texto que se quiere encriptar o desencriptar, y la contraseña.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 13 de mayo de 2017 18:43
    Moderador

Todas las respuestas

  • "Federico32113" escribió:

    > Si modifico ciertos campos del usuario(no la contraseña) al momento de que querer
    > ingresar mediante un login a ese usuario me aparece el siguiente error en la
    > función desencriptar.

    El mensaje de error te está diciendo que NO HAS CONTROLADO la excepción que se ha producido, por tanto, ni tú ni nadie puede saber exactamente lo que ha ocurrido para que se desencadene una CryptographicException, la cual se puede deber a multitud de causas.

    Lo primero que tienes que hacer es controlar la excepción, sea una CryptographicException o cualquier otra, encerrando la llamada a ese procedimiento entre un bloque Try ... Catch ... End Try:

        Try
            ' Llamar al método que desencadena el error
    Dim valor As String = FuncionDesencriptar(lista de parámetros)
    Catch ex As Exception ' Aquí capturamos el error MessageBox.Show(ex.Message) End Try

    Una vez que sepas lo que realmente ha ocurrido, lo mismo podrás solucionarlo. Pero sin saber lo que ha ocurrido, va a ser bastante complicado que lo puedas solucionar. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 12 de mayo de 2017 19:01
    Moderador
  • Perdona mi ignorancia...

    Pero así es como quieres que capture el error? Llamo a una clase en "Encrip.Desencriptar"

    viernes, 12 de mayo de 2017 19:48
  • Hola Federico32113

    Lo que sucede es que en Encrip.Desencriptar, estás capturando el error y lo estás personalizando como "Datos incorrectos", necesitaríamos que coloques el try catch en dicha función, pero recuperes el valor de ex.Message. Con dicho mensaje podríamos ayudarte mejor.

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    viernes, 12 de mayo de 2017 19:57
  • Coloque try catch  en la función Desencriptar pero aparece el mismo mensaje de error.

    Por favor si no es así como se busca el mensaje de error decirme como hacerlo. Gracias

    Public Function Desencriptar(ByVal Input As String) As String
    
            Try
            Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("...") 'La clave debe ser de 8 caracteres
            Dim EncryptionKey() As Byte = Convert.FromBase64String("...") 'No se puede alterar la cantidad de caracteres pero si la clave
            Dim buffer() As Byte = Convert.FromBase64String(Input)
            Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
            des.Key = EncryptionKey
            des.IV = IV
            Return Encoding.UTF8.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()))
            Catch ex As Exception
            MessageBox.Show(ex.Message)
    
            End Try
        End Function


    viernes, 12 de mayo de 2017 20:06
  • "Federico32113" escribió:

    > Pero así es como quieres que capture el error? Llamo a una clase en "Encrip.Desencriptar"
    >
    >    Try
    >        Me.txt2.Text = Encrip.Desencriptar(Me.txt1.Text)
    >    Catch ex As Exception
    >        ' Aquí capturamos el error
    >        MessageBox.Show(ex.Message)
    >
    >    End Try
    >
    > Por favor si no es así como se busca el mensaje de error decirme como hacerlo.

    Efectivamente, así es como normalmente se captura o se busca el error que se ha podido producir en alguna función a la cual hemos llamado, en tu caso, a la función Encrip.Desencriptar.

    La captura de la excepción la puedes incluir dentro de la propia función Encrip.Desencriptar, pero eso estaría bien cuando vayas a generar una nueva excepción PERSONALIZANDO el mensaje de error. Si no es así, lo correcto es capturar la excepción FUERA de cualquier función o procedimiento.

    Y en cuanto al mensaje de error "Datos incorrectos" (que dicho sea de paso no es ningún error personalizado por tu parte, de ahí que también se produzca el mismo error cuando capturas la excepción dentro de la función Encrip.Desencriptar), no me queda más que pensar que se pueda deber a dos motivos:

        1. Que no existen datos para desencriptar, es decir, el valor del parámetro Input de la función Desencriptar es una cadena de longitud cero ("" o String.Empty), o bien

        2. Que el valor de la propiedad Key del algoritmo TripleDes sea diferente a aquel que se utilizo a la hora de encriptar el contenido.

    En estos casos el método TransformFinalBlock es el "culpable" de generar el mensaje de error "Datos incorrectos".

    > Public Function Desencriptar(ByVal Input As String) As String
    >
    >    Try
    >        Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("...")
    >        Dim EncryptionKey() As Byte = Convert.FromBase64String("...")
    >        Dim buffer() As Byte = Convert.FromBase64String(Input)
    >        Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
    >        des.Key = EncryptionKey
    >        des.IV = IV
    >        Return Encoding.UTF8.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()))
    >    Catch ex As Exception
    >        MessageBox.Show(ex.Message)
    >
    >    End Try
    > End Function

    Desde luego, observando el código que se ejecuta en la función Desencriptar, ahí puede pasar de todo menos desencriptar el contenido especificado. ;-)

    Si también tienes una función llamada Encriptar con parecido código para obtener el valor de las propiedades Key e IV del algoritmo simétrico TripleDes, me parece a mí que cualquiera va a poder desencriptar el contenido encriptado. ;-)

    Si quieres encriptar algo, al menos obliga a que el usuario establezca una contraseña con la que puedas derivar el valor de la propiedad Key, de ésta manera, no se podrá desencriptar el contenido encriptado salvo que alguien conozca la contraseña utilizada, claro está.

    Mira a ver si te sirve la adaptación que he hecho de tu función Desencriptar, a la que añadido la correspondiente función Encriptar:

    Imports System.Security.Cryptography
    Imports System.Text

    Public Function Desencriptar(input As String, password As String) As String If (String.IsNullOrWhiteSpace(input)) Then Throw New ArgumentException("No se han especificado datos para descifrar.") End If
            Dim buffer() As Byte = Convert.FromBase64String(input)
    Using des As New TripleDESCryptoServiceProvider() des.IV = GetDeriveBytes(password, des.IV.Length) des.Key = GetDeriveBytes(password, des.Key.Length) buffer = des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()) End Using
    Return Encoding.UTF8.GetString(buffer)

    End Function Public Function Encriptar(input As String, password As String) As String If (String.IsNullOrWhiteSpace(input)) Then Throw New ArgumentException("No se han especificado datos para cifrar.") End If
    Dim buffer() As Byte = Encoding.UTF8.GetBytes(input)

    Using des As New TripleDESCryptoServiceProvider() des.IV = GetDeriveBytes(password, des.IV.Length) des.Key = GetDeriveBytes(password, des.Key.Length) buffer = des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length()) End Using

            Return Convert.ToBase64String(buffer) End Function Private Shared Function GetDeriveBytes(password As String, size As Integer) As Byte() If (String.IsNullOrWhiteSpace(password)) Then Throw New ArgumentException("No se ha especificado una contraseña válida.") End If If ((size < 1) OrElse (size > 128)) Then Throw New ArgumentOutOfRangeException("size", "El tamaño debe estar comprendido entre 1 y 128.") End If Dim buffer As Byte() = Encoding.UTF8.GetBytes(password) ' Derivar la contraseña para obtener una matriz de bytes con el tamaño especificado. ' Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000) Return bytes.GetBytes(size) End Using End Function


    Cuando quieras encriptar el contenido existente en un control de texto llamado 'txt1' ejecutarías lo siguiente:

        Private Sub btnEncrypt_Click(sender As Object, e As EventArgs) Handles btnEncrypt.Click
    
            Try
                txt2.Text = Encriptar(txt1.Text, "contraseña")
                txt1.Clear()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub


    Y cuando quieras desencriptar el contenido existente en otro control de texto llamado 'txt2' ejecutaría esto otro:

        Private Sub btnDecrypt_Click(sender As Object, e As EventArgs) Handles btnDecrypt.Click
    
            Try
                txt1.Text = Desencriptar(txt2.Text, "contraseña")
                txt2.Clear()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si a la hora de querer desencriptar un valor se le pasa a la función Desencriptar una cadena de longitud cero, en lugar de obtener el mensaje de error "Datos incorrectos" el usuario obtendrá ahora el mensaje de error "No se han especificado datos para descifrar", que digamos es un poco más descriptivo que el anterior.

    Observa que tendrás que especificar una contraseña para llamar a las funciones Encriptar y Desencriptar, cuyo valor tendrá que ser el mismo. Es decir, que si has encriptado un contenido utilizando la contraseña "12345678", ese mismo valor tendrás que utilizar cuando quieras desencriptarlo. ¿Me explico? ;-)

    Adapta el ejemplo a tus necesidades.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 13 de mayo de 2017 7:00
    Moderador
  • Voy a utilizar tus funciones de encriptar y desencriptar propuestas para las contraseñas del usuario y un código que uso para la activación del sistema.

    Pero al agregarlas a una clase me marca error en 

    (String.IsNullOrWhiteSpace(input))
    
    (String.IsNullOrWhiteSpace(input))
    
    (String.IsNullOrWhiteSpace
    
    Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)

    Me marca como el String vació. Como puedo solucionarlo?

    Como siempre digo perdona que molestes en cosas que para ti pueden ser obvias.

    Agregue los 2 imports al inicio.

    sábado, 13 de mayo de 2017 15:20
  • "Federico32113" preguntó:

    > Pero al agregarlas a una clase me marca error en
    >
    > (String.IsNullOrWhiteSpace(input))
    >
    > (String.IsNullOrWhiteSpace(input))
    >
    > (String.IsNullOrWhiteSpace
    >
    > Me marca como el String vació. Como puedo solucionarlo?

    Te agradecería enormemente que indicaras exactamente en qué línea de código se produce el error.

    ¡Vamos a ver! Si tanto en la función Desencriptar como en la función Encriptar que te he indicado anteriormente obtienes el mensaje de error No se han especificado datos para cifrar/descifrar, creo que el mensaje de error lo dice todo, y significa que NO HAS ESCRITO DATOS en los correspondientes controles TextBox, o en aquellos otros donde tomes los datos para encriptar/desencriptar.

    Es igual que el mensaje de error que obtenías con tu función Desencriptar (Datos incorrectos), pero como te he comentado en mi respuesta anterior, yo he querido mostrar un mensaje de error más descriptivo, pero parece ser que no he tenido éxito. :-(

    > Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)

    Este bloque solamente se ejecutará al final de la función GetDeriveBytes, donde tienes que especificar, te guste o no, una contraseña, porque de lo contrario obtendrás una ArgumentException con el mensaje de error No se ha especificado una contraseña válida, que también creo que es un mensaje de error bastante descriptivo, porque de lo contrario no llegará a crearse la instancia de la clase Rfc2898DeriveBytes.

    Ahora bien, si no deseas especificar contraseña alguna, cosa que yo no te voy a recomendar en absoluto, entonces olvídate de la función GetDeriveBytes, y por tanto, de la manera en que se obtienen los valores de las propiedades Key e IV del algoritmo simétrico TripleDes, y continúa con tu función Desencriptar, pero siendo consciente de que si obtienes el mensaje de error Datos incorrectos, se puede deber a los dos motivos que te he indicado anteriormente:

        1. Que no existen datos para desencriptar, es decir, el valor del parámetro Input de la función Desencriptar es una cadena de longitud cero ("" o String.Empty), o bien

        2. Que el valor de la propiedad Key del algoritmo TripleDes sea diferente a aquel que se utilizo a la hora de encriptar el contenido.

    > Como siempre digo perdona que molestes en cosas que para ti pueden ser obvias.

    Yo perdono todo, y soy consciente de que no dispones de los conocimientos y experiencia que yo pueda tener. Pero lo que yo me pregunto es si de verdad quieres o no aprender, porque las funciones que te he indicado NO TIENEN POR QUÉ DARTE ERROR ALGUNO, salvo que tú mismo provoques el error al no especificar, bien una contraseña, bien los datos que deseas encriptar o desencriptar. Si te limitas a llamar a las funciones pasándole los datos que éstas esperan, observarás que se encripta/desencripta correctamente. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 13 de mayo de 2017 17:15
    Moderador
  • No fui detallado en mi comentario anterior.

    Los errores se producen en las siguientes lineas de las funciones respectivamente. Te destaco que los errores me los produce antes de empezar a ejecutar el proyecto

        Public Function Desencriptar(ByVal input As String, ByVal password As String) As String
    
            If (String.IsNullOrWhiteSpace(input)) Then
    Public Function Encriptar(ByVal input As String, ByVal password As String) As String
    
            If (String.IsNullOrWhiteSpace(input)) Then

    Private Shared Function GetDeriveBytes(ByVal password As String, ByVal size As Integer) As Byte() If (String.IsNullOrWhiteSpace(password)) Then

    Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)

    Este es un ejemplo de como trato de usar la función pero no la puedo ejecutar debido a los errores que tiene el proyecto antes de empezar a ejecutarlo.

    txt2.Text = Encrip.Encriptar(txtclave.Text, "contraseña")

    .Clave = Me.txt2.Text

    PD: por la dudas estoy utilizando VB 2010


    sábado, 13 de mayo de 2017 17:26
  • "Federico32113" escribió:

    > Los errores se producen en las siguientes lineas de las funciones respectivamente
    > Te destaco que los errores me los produce antes de empezar a ejecutar el proyecto
    >
    > PD: por la dudas estoy utilizando VB 2010

    ¿Quieres decir que los errores se producen a la hora de COMPILAR el proyecto? Si es así, y dices que estás utilizando Visual Basic 2010, ¿qué versión de .NET estás utilizando en tu proyecto?

    Desde luego, tiene que ser alguna muy antigua, anterior a la 4.0, para que no te reconozca la función String.IsNullOrWhiteSpace. Sustitúyela por la función String.IsNullOrEmpty. O mejor aún, por ésta línea de código:

        If ((input Is Nothing) OrElse (input.Trim().Length = 0)) Then

    De ésta manera actuará como la función IsNullOrWhiteSpace, para que no se tengan en cuenta aquellas cadenas alfanuméricas que contienen solamente espacios en blanco.

    > Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)

    Ahora bien, en cuanto a la clase Rfc2898DeriveBytes, no sé ya qué decirte, porque la misma es compatible con .NET 2.0 en adelante.

    ¿Qué versión del marco de trabajo de .NET (no la versión de Visual Studio) estás utilizando en tu proyecto?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 13 de mayo de 2017 17:47
    Moderador
  • -Ya reemplace donde me marcaba error con la linea de código mencionada.

    -Me sigue quedando este error:

    Agregue Imports System.IDisposable a la clase donde tengo la funciones pero el error persiste. Puede ser que sea necesario el agregado de alguna referencia? porque busque y no encontré nada salvo el agregado de mas código.

    -Otro error es el siguiente que me lo marca donde trato de utilizar la función "Encriptar"

    La solución a este error puede ser la siguiente?

    Function Encriptar(ByVal cadena As Object) As String
            Throw New NotImplementedException
        End Function

    sábado, 13 de mayo de 2017 18:15
  • "Federico32113" escribió:

    > -Me sigue quedando este error:
    >
    > Using bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)
    >    Return bytes.GetBytes(size)
    > End Using
    >
    > El operador 'Using' de tipo 'System.Security.Cryptography.Rfc2898DeriveBytes'
    > debe implementar 'System.IDisposable'.

    Nuevamente te indico que estaría enormemente agradecido que me respondieras a las preguntas que te efectúo, aunque ya no es necesario que me digas la versión de .NET con la que estás compilando tu proyecto, porque si obtienes ese mensaje de error, se debe a que estás utilizando una versión de .NET inferior a la 4.0, ya que fue a partir de ésta versión cuando a la clase Rfc2898DeriveBytes se le implementó la interfaz IDisposable.

    Sustituye el bloque Using ... End Using por las siguientes líneas:

            ' Derivar la contraseña para obtener una matriz de bytes con el tamaño especificado.
            '
            Dim bytes As New Rfc2898DeriveBytes(buffer, buffer, 1000)
            Return bytes.GetBytes(size)


    Pero que no se te olvide que, cuando alguien que te quiere ayudar te haga una pregunta, respóndela por favor, porque entonces no avanzamos nada. ¿OK?

    > -Otro error es el siguiente que me lo marca donde trato de utilizar la función "Encriptar"
    >
    > txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar)

    El mismo mensaje de error te está diciendo lo que falta, que no es más que indicar un valor al parámetro 'password', es decir, que tienes que especificar también la contraseña:

        txtsucodigo.Text = Encrip.Encriptar(ValorAEncriptar, "contraseña")

    Se comprende que ValorAEncriptar es una variable alfanumérica (String) que contiene el texto que deseas encriptar, porque si no es así, obtendrás otra excepción.

    > La solución a este error puede ser la siguiente?
    > Function Encriptar(ByVal cadena As Object) As String
    >    Throw New NotImplementedException
    > End Function

    Esa NO ES LA SOLUCIÓN, porque entonces cada vez que llames a la función Encriptar obtendrás una excepción (error) del tipo NotImplementedException, con un mensaje de error parecido a que el método no está implementado.

    La solución es pasarle todos los valores que espera el procedimiento, que para el caso de las funciones Encriptar y Desencriptar son dos: el texto que se quiere encriptar o desencriptar, y la contraseña.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 13 de mayo de 2017 18:43
    Moderador
  • Gracias por la ayuda y la paciencia pude solucionar todo!

    Ahora utilizo el encriptar/desencriptar para la clave de los usuarios y un código que utilizo para "activar" el sistema.

    sábado, 13 de mayo de 2017 20:51