none
encriptar y desencriptar un txt con visual basic .net RRS feed

  • Pregunta

  • Hola, buenas noches, me podrían apoyar por favor?

    Realicé una solución que encripta y desencripta un archivo TXT con Xor, funciona sin problemas pero quiero saber si existe una forma de desencriptar SIN necesidad de utilizar la caja de texto openfiledialog.

    Mi código para encriptar es este:

        Private Sub mnu_Encriptar_Click(sender As Object, e As EventArgs) Handles mnu_Encriptar.Click
            SaveFileDialog1.Filter = "Archivos de texto (*.txt)|*.txt"
            SaveFileDialog1.ShowDialog()
            If SaveFileDialog1.FileName <> "" Then
                codigo_xor = InputBox("Escribir el código de cifrado")
                If codigo_xor = "" Then Exit Sub 'Si se hace clic en "Cancelar" en el InputBox
                REM Asigna el texto encriptado
                codigo = CShort(codigo_xor)
                caracteres_del_archivo = TextBox1.Text.Length
                FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output)
                For i = 0 To caracteres_del_archivo - 1
                    letra = TextBox1.Text.Substring(i, 1)
                    REM Convierte a un caracter en número Asc y a continuación utilizar
                    REM Xor para encriptar y guardar los datos encriptados en un archivo
                    Print(1, Asc(letra) Xor codigo)
                Next
                FileClose(1)
                mnu_Cerrar.Enabled = True
            End If
        End Sub

    Y el código para desencriptar es este:

     

        Private Sub mnu_Abrir_Encriptado_Click(sender As Object, e As EventArgs) Handles mnu_Abrir_Encriptado.Click
            OpenFileDialog1.Filter = "Text files (*.TXT)|*.TXT"
            OpenFileDialog1.ShowDialog()                    'Mostrar el cuadro de diálogo Abrir
            If OpenFileDialog1.FileName <> "" Then
                Try                                         'Abrir el archivo y atrapar cualquier excepción que se genere
                    codigo_xor = InputBox("Escribir el código de cifrado")
                    If codigo_xor = "" Then Exit Sub 'Si se hace clic en "Cancelar" en el InputBox
                    codigo = CShort(codigo_xor)
                    FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
                    Do Until EOF(1)                         'Leer las líneas del archivo hasta el final del mismo
                        Input(1, numero)                    'Leer los números encriptados
                        caracter = Chr(numero Xor codigo)   'Desencriptar los números con Xor
                        REM Genera las cadenas de datos
                        desencriptar = desencriptar & caracter
                    Loop
                    TextBox1.Text = desencriptar            'Muestra el texto desencriptado
                    Label1.Text = OpenFileDialog1.FileName
                    TextBox1.Select(1, 0)                   'Elimina la selección de texto
                    TextBox1.Enabled = True                 'Permitir el cursor en el texto
                    mnu_Cerrar.Enabled = True               'Activar el menú Archivo/Cerrar
                    mnu_Abrir.Enabled = False               'Desactiva el menú Archivo/Abrir
                Catch
                    MsgBox("Se ha producido un error abriendo el archivo.")
                Finally
                    FileClose(1)                            'Cierra el archivo
                End Try
            End If
        End Sub

    Mi pregunta concreta es: como puedo desencriptar un archivo que está encriptado con un código que yo di, pero sin utilizar el apoyo de OpenFileDialog, es decir, decirle la ruta y el nombre del archivo a desencriptar directamente desde el código?

    La ruta del archivo a desencriptar la declaro en una variable Dim ruta As String = "filesyrcs\T1FL_moc.txt".

    Tengo el archivo sin encriptar, lo ubico y asigno su contenido en un Label o en un TextBox, pero cuando se trata de hacerlo con el archivo encriptado no logro desencriptarlo porque quiero abrirlo sin el mencionado OpenFileDialog

    Ojala puedan ayudarme

    También, últimamente he tenido problemas para poder accesar a esta comunidad, cambiaron la plataforma?, como puedo volver a accesar?, en esta ocasión lo hice gracias al enlace de una busqueda de Google.

    Gracias por su amable apoyo

    Anubis II

    viernes, 1 de enero de 2021 1:21

Respuestas

Todas las respuestas

  • Importamos

    Imports System.IO
    Imports System.Security.Cryptography
    Imports System.Text

    Declaramos

    Public DefaultCryptoKey As String = "ACdXtioqqwMvkaoMCt44hqDcdp8vZE"

    Creamos las funciones para encriptar y desencriptar

    Encriptar

        Friend Shared Sub Encrypt(inStream As Stream, outStream As Stream, pwd As String)
            Try
                Dim aes As New AesCryptoServiceProvider()
                aes.Mode = CipherMode.CFB
                aes.Key() = GetDeriveBytes(pwd, 32)
                aes.IV = GetDeriveBytes(pwd, 16)
                Dim stream As New CryptoStream(outStream, aes.CreateEncryptor(), CryptoStreamMode.Write)
                Dim length As Integer = 2048
                Dim buffer As Byte() = New Byte(length - 1) {}
                Try
                    Dim i As Integer = inStream.Read(buffer, 0, length)
                    Do While (i > 0)
                        stream.Write(buffer, 0, i)
                        i = inStream.Read(buffer, 0, length)
                    Loop
                Finally
                    stream.FlushFinalBlock()
                    aes.Dispose()
                    buffer = Nothing
                End Try
            Catch ex As Exception
                Console.WriteLine("[CryptoActions@Encrypt]Error: " & ex.Message)
            End Try
        End Sub

    Desencriptar

        Friend Shared Sub Decrypt(inStream As Stream, outStream As Stream, pwd As String)
            Try
                Dim aes As New AesCryptoServiceProvider()
                aes.Mode = CipherMode.CFB
                aes.Key() = GetDeriveBytes(pwd, 32)
                aes.IV = GetDeriveBytes(pwd, 16)
                Dim stream As New CryptoStream(inStream, aes.CreateDecryptor(), CryptoStreamMode.Read)
                Dim length As Integer = 2048
                Dim buffer As Byte() = New Byte(length - 1) {}
                Try
                    Dim i As Integer = stream.Read(buffer, 0, length)
                    Do While (i > 0)
                        outStream.Write(buffer, 0, i)
                        i = stream.Read(buffer, 0, length)
                    Loop
                Finally
                    aes.Dispose()
                    buffer = Nothing
                End Try
            Catch ex As Exception
                Console.WriteLine("[CryptoActions@Decrypt]Error: " & ex.Message)
            End Try
        End Sub

    Tambien necesitamos esta cosa

        Friend Shared Function GetDeriveBytes(password As String, size As Integer) As Byte()
            If ((String.IsNullOrWhiteSpace(password)) OrElse (password.Length < 8)) Then
                MsgBox("Error en el Modulo 'GetDeriveBytes'" & vbCrLf & "La llave criptografica debe tener mas de 8 caracteres")
            End If
            If ((size < 1) OrElse (size > 128)) Then
                MsgBox("Error en el Modulo 'GetDeriveBytes'" & vbCrLf & "El tamaño tiene que estar comprendido entre 1 y 128.")
            End If
            Dim pwd As Byte() = UTF8Encoding.UTF8.GetBytes(password)
            Dim salt As Byte() = UTF8Encoding.UTF8.GetBytes(Convert.ToBase64String(pwd))
            Using bytes As New Rfc2898DeriveBytes(pwd, salt, 1000)
                ' Devolver la clave pseudoaletoria.
                Return bytes.GetBytes(size)
            End Using
        End Function

    Luego creamos los SUbs que llamaran a nuestras funciones

    EJ de uso

    Valor FileIN -> C:\Users\MrProVB\Desktop\Video132.mp4

    Valor FileOUT -> C:\Users\MrProVB\Desktop\Video132Cifrado.mp4

    (El FileOUT se creara cifrado (recuerda que no podremos sobre-escribir el archivo que pasa por FileIN))

    Para encriptar

    	Sub CallEncrypt(ByVal FileIN As String, ByVal FileOUT As String)
            Try
                Dim buffer As Byte()
                Using fs As New FileStream(FileIN, FileMode.Open, FileAccess.Read)
                    Using ms As New MemoryStream()
                        Encrypt(fs, ms, DefaultCryptoKey)
                        buffer = ms.ToArray()
                    End Using
                End Using
                Using fs As New FileStream(FileOUT, FileMode.CreateNew, FileAccess.Write)
                    fs.Write(buffer, 0, buffer.Length)
                End Using
            Catch ex As Exception
                Console.WriteLine("[CryptoActions@CallEncrypt]Error: " & ex.Message)
            End Try
        End Sub

    Desencriptar (Lo mismo que el ejemplo pero al reves)

        Sub CallDecrypt(ByVal FileIN As String, ByVal FileOUT As String)
            Try
                Dim buffer As Byte() = Nothing
                Using fs As New FileStream(FileIN, FileMode.Open, FileAccess.Read)
                    Using ms As New MemoryStream()
                        Decrypt(fs, ms, DefaultCryptoKey)
                        buffer = ms.ToArray()
                    End Using
                End Using
                Using fs As New FileStream(FileOUT, FileMode.CreateNew, FileAccess.Write)
                    fs.Write(buffer, 0, buffer.Length)
                End Using
            Catch ex As Exception
                Console.WriteLine("[CryptoActions@CallDecrypt]Error: " & ex.Message)
            End Try
        End Sub
    y esto es lo que utilizo yo, asi que, Funciona en mi maquina (certificado).


    --- Cristopher Cáceres | Hola! | Worcome Studios ---

    viernes, 1 de enero de 2021 5:32
  • Gracias Cristopher Cáceres, déjame lo trabajo y te comento como voy y marcar la respuesta
    • Marcado como respuesta Anubis II viernes, 8 de enero de 2021 14:25
    sábado, 2 de enero de 2021 0:59