Saltar al contenido

Encriptador de archivos de texto plano


digitalboy

Recommended Posts

publicado

Hola!

Primero que nada, una disculpa, ya que que este aporte no lo he desarrollado en VBA/Excel, trate pero no lo consegui.... eso quiere decir que no soy tan bueno como pensaba....

Se trata de un pequeño encriptador de archivos de texto, el cual desarrollo en C y para lo cual me vali de los operadores a nivel de bits que proporciona C, los cuales funcionan mas o menos asi:

Suponiendo que un archivo el primer caracter sea la letra a = 97 (en codigo ascii) = 1100001 (97 en binario), haciendo uso del operador not (que en C es: ~) convierto 1100001 a 0011110 (30 en ascii / decimal) y asi con todos los demas caracteres que conforman el archivo hasta haberlo encriptado.

¿Como funciona este ejecutable? Lo descomprimen y lo pegan en la unidad C, a partir de ahi abren la consola (simbolo del sistema), escriben: "cd\" para dezplazarse a raiz y ahi escriben:

codec ruta_archivo

en mi caso, escribiria algo asi para codificar un archivo de texto llamado terror.txt que esta raiz:

codec c:\terror.txt

con esto enseguida nos apareceran caracteres extraños, eso quiere decir que ya los invirtio, si quiero redireccionar la salida a un archivo, escribiria:

codec c:\terror.txt > c:\terrorcodificado.txt

ya no se muestra la salida, pero se envia al archivo terrorcodificado.txt, posteriormente podriamos descodificar el archivo para recuperar la informacion.

Esto puede ser de utilidad ya que se puede invocar al programa codec con la instruccion shell de vba y pasarla parametros!

Nota! Solo funciona con archivos de texto, no funciona para archivos binarios (mp3, xls. doc, etc)

Mas adelante espero mejorarlo y subir un ejemplo fusionandolo con VBA/Excel

[TABLE=width: 80]

[TR]

[TD=width: 80][/TD]

[/TR]

[/TABLE]

Dejo el codigo para que puedan darse una vaga idea de su funcionamiento y pos si alguien trata de adaptarlo a VBA/Excel, lo cual estoy dudoso de si es posible ya que de entrada creo que no hay operadores a nivel de bits en VBA y aun habiendolos queda el problema de la escritura de archivos... bueno yo me tope con esos dos problemas, pude resolver el de la negacion pero al escribir en el archivo el caracter codificado, me dio error!


/*
Fecha: 08/11/2012
Programador: Luis Cervantes

Un simple codificador de archivos de texto plano, usando el metodo de sustitucion
*/

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]) {
FILE *fp;
unsigned char c;
long tama, i = 0;

if(argc < 2) {
printf("Uso: %s [archivo a codificar/decodificar]", argv[0]);
exit(0);
}

if ((fp = fopen(argv[1], "r")) == NULL) {
puts("Error al intentar abrir el archivo!");
exit(0);
}

while((feof(fp)) == 0) {
c = fgetc(fp);
printf("%c", ~c);
}

fclose(fp);
return 0;
}
[/CODE]

Saludos!

codec.zip

publicado

Hola DigitalBoy, me ha traído buenos recuerdos ver tu código en C :P

Nunca he manipulado desde excel archivos en binario, solo decimal. Te paso una plantilla que me he hecho para no olvidar el uso de manejo de archivos ya que son tan pocas veces las que lo uso que siempre termino olvidándome. Trastea con ese código.

'For Output
'Crea (si no existe)/sobre escribe o reemplaza (si existe) un archivo
Sub EscrituraArchivo_Output()
Dim nCanal As Integer 'Numero de canal que vamos a usar para el OutPut
Dim RutaArchivo As String: RutaArchivo = "C:\PruebasInputOutput.txt"

nCanal = FreeFile() 'Asigna el primer canal libre

Open RutaArchivo For Output As #nCanal 'Abre archivo para escritura OverRide

'Se puede acceder al canal ya sea por su variable "#nCanal" o por el canal que usa "#1"
'El canal es #1 en este ejemplo, pero sería #2 si ya hubiera un canal abierto si estamos manejando más de 1 archivo simultáneamente.
Write #nCanal, "Escribe una línea completa terminado en salto de párrafo, todo envuelto en comillas"
Print #1, "Escribe una línea completa terminado en salto de párrafo, SIN envolver en comillas"

'Para concatenar texto en una sola línea, se agrega ";" al final
Print #1, "Ejemplo de concatenación: ";
Print #1, "Ver";
Print #1, "Zul";
Print #1, "San" 'Esta última línea, debería generar salto de párrafo _
(No es necesario pero es conveniente para su correcta lectura)

Close #nCanal 'Cierra el canal
End Sub


'For Append
'Crea (si no existe) un archivo/añade al final (si existe) un texto
Sub EscrituraArchivo_Append()
Dim nCanal As Integer 'Numero de canal que vamos a usar para el OutPut
Dim RutaArchivo As String: RutaArchivo = "C:\PruebasInputOutput.txt"

nCanal = FreeFile() 'Asigna el primer canal libre

Open RutaArchivo For Append As #nCanal 'Abre archivo para escritura OverRide

'Se puede acceder al canal ya sea por su variable "#nCanal" o por el canal que usa "#1"
'El canal es #1 en este ejemplo, pero sería #2 si ya hubiera un canal abierto si estamos manejando más de 1 archivo simultáneamente.
Write #nCanal, "Escribe una línea completa terminado en salto de párrafo, todo envuelto en comillas"
Print #1, "Escribe una línea completa terminado en salto de párrafo, SIN envolver en comillas"

'Para concatenar texto en una sola línea, se agrega ";" al final
Print #1, "Ejemplo de concatenación: ";
Print #1, "Ver";
Print #1, "Zul";
Print #1, "San" 'Esta última línea, debería generar salto de párrafo _
(No es necesario pero es conveniente para su correcta lectura)

Close #nCanal 'Cierra el canal
End Sub

'Lee un archivo.
Sub LecturaArchivo_Input()
Dim nCanal As Integer 'Numero de canal que vamos a usar para el OutPut
Dim RutaArchivo As String: RutaArchivo = "C:\PruebasInputOutput.txt"
Dim Bloque1 As String 'Guarda secuencialmente los bloques hasta fin de fichero (EOF)
Dim Bloque2 As String 'Variable extra, misma función que Bloque1, solo para ver funcionamiento

nCanal = FreeFile() 'Asigna el primer canal libre
Open RutaArchivo For Input As #nCanal 'Abre archivo para lectura por bloques

Do While Not (EOF(nCanal)) 'Recorre el archivo mientras que No sea fin de fichero (EOF)
Input #nCanal, Bloque1 'Indicamos que lea el siguiente bloque y lo guarde en la variable
MsgBox Bloque1

'Lectura de varios bloques simultáneamente: _
NOTA: Hay que tener cuidado con la lectura simultanea ya que _
si se ha llegado a EOF y aun quedan más variables, dará error. _
Las lecturas simultaneas suelen usarse para leer estructuras _
de datos que suelen tener la característica de una consistencia _
repetitiva fácil de leer por bloques, como una tabla.

Input #nCanal, Bloque1, Bloque2 'Indicamos que lea 2 bloques y lo asigne a dos variables
MsgBox "Bloque1: " & Bloque1 & ", Bloque2: " & Bloque2
Loop

Close #nCanal 'Cierra el canal
End Sub



'Ejemplo de escritura / lectura (Para entender el funcionamiento de los bloques)

'en el ejemplo, leeré los bloques de dos en dos, por eso el archivo que se va a generar
' consta de 10 bloques un numero "par" que garantiza que la última lectura leerá los
' dos últimos bloques.

Sub EjemploEscrituraLecturaBloques()
Dim nCanal As Integer 'Numero de canal que vamos a usar para el OutPut
Dim RutaArchivo As String: RutaArchivo = "C:\EjemploInputOutput.txt"
Dim Bloque1 As String, Bloque2 As String

nCanal = FreeFile() 'Asigna el primer canal libre
Open RutaArchivo For Output As #nCanal 'Abre archivo para escritura OverRide

'Para el ejemplo, la macro crea un archivo .txt con el siguiente contenido:
'********************************************************************
' "Bloque 1" Bloque 2, Bloque 3
' "Bloque
' 4"
' Bloque 5,,
' Bloque 8
' Blo "que" 9, "Blo
' que 10"
'********************************************************************
Print #1, "" & Chr(34) & "Bloque 1" & Chr(34) & " Bloque 2, Bloque 3"
Print #1, "" & Chr(34) & "Bloque "
Print #1, "4" & Chr(34) & ""
Print #1, "Bloque 5,,"
Print #1, "Bloque 8"
Print #1, "Blo " & Chr(34) & "que" & Chr(34) & " 9, " & Chr(34) & "Blo"
Print #1, " que 10" & Chr(34) & ""

Close #nCanal 'Cierra el canal
' Hasta este punto, el archivo ya ha sido creado en "C:\EjemploInputOutput.txt"
'******************************************************************************

'******************************************************************************
' Ahora abrimos el archivo y lo mostramos por mensajes

nCanal = FreeFile() 'Asigna el primer canal libre
Open RutaArchivo For Input As #nCanal 'Abre archivo para lectura por bloques

Do Until EOF(nCanal) 'Recorre el archivo mientras que No sea fin de fichero (EOF)

Input #nCanal, Bloque1, Bloque2 'Indicamos que lea 2 bloques y lo asigne a dos variables
MsgBox "-> " & Bloque1 & ", -> " & Bloque2
Loop
Close #nCanal 'Cierra el canal
End Sub[/CODE]

Adjunto tambien URL de una página donde dice que también puede usarse el modelo binario: Project: VBA Writing to a text file (MS Project, Excel).

Sobre el tema de la conversión, no sé si existe algo que te haga la conversión directamente como en C, pero así a pronto, se me ocurre algo como esto:

[CODE]Sub Macro1()
Dim num As Integer, cad As String
num = Asc("a")
cad = Application.Dec2Bin(num, 7)
cad = Replace(Replace(Replace(cad, 1, 2, 1, , 1), 0, 1, 1, , 1), 2, 0, 1, , 1)
MsgBox cad
End Sub[/CODE]

Ya nos iras comentando como sigue tu proyecto.

Saludos.

publicado

verzulsan...

gracias por tu aporte, le echare un ojo! ami al principio se me olvidaba la sintaxis para abrir archivos y como leer datos, por lo general los abro en modo lectura y leo linea por linea, este metodo es practico y sencillo pero sumamente lento y deficiente ante grandes archivos, pero hay otras alternativas para cargar todo el contenido de archivos de texto directo en memoria y desde ahi procesarlos, me pare que ya han escrito de esa forma, me prece que usando el FSO.

En cuanto a mi aportacion, ya estoy haciendo los ajustes necesarios para que encripte cualquier tipo de archivo y como usarlo junto con vba/excel!

Saludos

publicado

Hola amigos:

Primero que nada, gracias a DigitalBoy por compartir su creación ademas de hacerme recordar que debería repasar mi C++ :dejection:

Sobre el VBA y el VB (En sus distintas versiones) pues si tiene operadores a nivel de bits, solo que no hay algo exactamente igual al "NOT ~" de C:

Operadores lógicos y bit a bit en Visual Basic

Sobre la lectura y escritura de archivos de texto, pues ya Verzulsan dio algunos ejemplos asi como de el procedimiento para lograr lo que propones: 'Asc', 'Application.WorksheetFunction.Dec2Bin' y 'Replace'

Obvio que todo usando bucles para no dejar carácter sin cambiar y definitivamente esto serviría también para el texto de Word o Excel, claro que el modo de leerlo (párrafos, celdas) variaría.

Bueno, uses ese u otro método, no dejes de comentarnos

Saludos

Abraham

publicado

Pasaba por aquí y no he podido resistir la tentación:

Función que encripta y desencripta, o sea 2 en 1.



Function EncriptarDesencriptar(Caracter As String) As String

EncriptarDesencriptar = Chr(255 - Asc(Caracter))

End Function


[/CODE]

publicado


Function EncriptarDesencriptar(Caracter As String) As String
EncriptarDesencriptar = Chr(255 - Asc(Caracter))
End Function
[/CODE]

Sumamente practico y sencillo! jajaja... por que no se me ocurrio algo asi? Ya probe tu funcion y funciona (valga la redundancia) tendre que probarla con un archivo de texto, que estoy seguro que funcionara y despues para un archivo binario haber que tal.

Gracias por el aporte!

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

Primero que nada, gracias a DigitalBoy por compartir su creación ademas de hacerme recordar que debería repasar mi C++ :dejection:

Sobre el VBA y el VB (En sus distintas versiones) pues si tiene operadores a nivel de bits, solo que no hay algo exactamente igual al "NOT ~" de C:

Operadores lógicos y bit a bit en Visual Basic

Sobre la lectura y escritura de archivos de texto, pues ya Verzulsan dio algunos ejemplos asi como de el procedimiento para lograr lo que propones: 'Asc', 'Application.WorksheetFunction.Dec2Bin' y 'Replace'

Obvio que todo usando bucles para no dejar carácter sin cambiar y definitivamente esto serviría también para el texto de Word o Excel, claro que el modo de leerlo (párrafos, celdas) variaría.

Bueno, uses ese u otro método, no dejes de comentarnos

Saludos

Abraham

Avalencia si, investigue y descrubri que si se puede interactuar a nivel de bits...

http://www.excely.com/excel-vba/bit-operations.shtml

pero al probar el ejemplo del not a nivel de bits, no me da el 174, sino: -82, habre omitido algo, alguna idea de por que no me lo da, eso lo probe en la ventana de inmediato y nomas no.

Gracias!

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.