cifrar/codificar datos
{_The_Alwar_}:
Hola
Estoy haciendo una aplicacion cliente/servidor y queria saber como puedo o que tengo que hacer para codificar o cifrar los datos que van de uno a otro, no se si uso bien los terminos, en definitiva yo quiero proteger los datos.
sch3m4:
Aquí te pongo dos funciones ;)
Código:
'//////////////////////////////////////////////////////////////////////////////////
'Pequeña función para cifrar una string
'//////////////////////////////////////////////////////////////////////////////////
'
Public Function cifrar(Texto As String) As String
Dim i As Integer
For i = 1 To Len(Texto)
cifrar = cifrar & Chr(Asc(Mid(Texto, i, 1)) - 18)
Next i
End Function
Código:
'//////////////////////////////////////////////////////////////////////////////////
'Pequeña función para descifrar una string
'//////////////////////////////////////////////////////////////////////////////////
'
Public Function descifrar(Texto As String) As String
Dim i As Integer
For i = 1 To Len(Texto)
descifrar = descifrar & Chr(Asc(Mid(Texto, i, 1)) + 18)
Next i
End Function
Básicamente lo que hace es ir transformando los caracteres, les coje el código ascii y lo convierte en 18 caracteres ascii menos para cifrar, y les suma esos 18 para descifrar. Es un algoritmo muy básico pero espero que te sirva.
coolbrain:
Aqui te mando un ejemplo que hice para un grupo de news de programacion. Es un modulo de clase y aqui se gestiona tanto envio como recepción. En el código completo escribi otro modulo para desmontar un archivo y transmitirlo por bloques de 64 bits, convertia los caracteres a hex, para poder usar codigos de retorno y dividir los bloques. Cada vez que enviaba un bloque, antes del bloque iba la posicion del archivo, asi pues puedes resumir el archivo y reanudarlo posteriormente. Con este modulo de echo ya estas cifrando la transmisión puesto que no la mandas en el formato que usan normalmente los servidores ftp. Pero siempre puedes hacer un XOR del valor con una cadena que seria la clave de encriptacion. Si tienes alguna duda o quieres verlo completo, tendreis que decirme donde lo subo , para que otros puedan ver el codigo completo, ni tengo web ni servidor ftp (solo pa mi :) )
Código:
' ..................................................................
' . .
' . Un ejemplo para enviar y recibir archivos atraves de Winsock .
' . con posibilidad de cancelar transferencia y resumir datos .
' . .
' . Escrito por: coolbrain Para:www.elhacker.net
' . .
' . mod:CLS_TRANSMISION .
' ...................................................................
Option Explicit
Public IP As String
Public Port As String
Public Cancelar As Boolean
Public PathDownload As String
Private esServidor As Boolean ' se usuara para saber si la clase va a ser servidor o cliente
Private WithEvents WS As Winsock
Private MiForm As Form ' Para instanciar Winsock
Private IMensaje ' Mensajes internos
Private FPuntero As Long ' Puntero donde se este leyendo actualmente del fichero hex
Private TamañoArchivoS As Long ' Tamaño del archivo recibido
Private iFichero As String ' Nombre del fichero a recibir
Public Event Error(Numero As Double, Descripcion As String)
Public Event Conexion(Establecida As Boolean)
Public Event Completado()
Public Event Mensaje(Estado As String)
Public Event Progreso(Pos As Integer)
Public Event RecibiendoDatos(NombreFichero, TotalBytes As Long) ' Evento que indica al servidor que esta recibiendo datos
Private FHex As cls_Hex
'
' Inicializar clase
'
Private Sub Class_Initialize()
Set MiForm = New FC
Load MiForm
Set WS = MiForm.WS
Set FHex = New cls_Hex
End Sub
'
' Establecer Parametros
'
' Parametro para establecer si trabajara como servidor
Public Property Let Servidor(ByVal valor As Boolean)
esServidor = valor
FHex.Servidor = valor
End Property
' La ruta del fichero a trabajar
Public Function RutaFichero(ByVal valor As String)
Dim NombreDirs() As String
NombreDirs = Split(valor, "\")
iFichero = NombreDirs(UBound(NombreDirs()))
If esServidor Then ' si es servidor establecera la ruta en el path configurado
'y solo toma el nombre del archivo
If Dir(PathDownload & iFichero) = "" Then ' Como no existe el fichero
Dim IFF As Integer ' creamos un fichero vacio
IFF = FreeFile
Open PathDownload & iFichero For Output As #IFF
Close #IFF
End If
FHex.RutaArchivo = PathDownload & iFichero
If FHex.TArchivo > 0 Then RaiseEvent Mensaje("Recuperacion de fichero incompleto. Bloque:" & CStr(FHex.TArchivo \ 8))
Else
FHex.RutaArchivo = valor
RaiseEvent Mensaje("Fichero de envio = " & CStr(FHex.TArchivo) & " bytes")
End If
End Function
'
' Llaman a la puerta :)
'
Private Sub WS_ConnectionRequest(ByVal requestID As Long)
If WS.State = 2 Then ' como esta escuchando
WS.Close ' se tiene que cerrar
WS.Accept requestID ' para aceptar la nueva conexion
RaiseEvent Conexion(True)
WS.SendData "ESPERANDODATOS" & vbCrLf ' Enviamos al cliente un mensaje
End If ' diciendo que estamos listos
End Sub
'
' La conexion se pierde
'
Private Sub WS_Close()
WS.Close
If esServidor Then
RaiseEvent Mensaje("Conexion finalizada")
FHex.RutaArchivo = iFichero
If TamañoArchivoS <> FHex.TArchivo Then
RaiseEvent Mensaje("El archivo esta incompleto.")
End If
WS.Listen
Else
RaiseEvent Conexion(False)
End If
End Sub
'
' Conectar
'
Public Function Conectar()
On Error GoTo Errores
WS.Close
Cancelar = False
If esServidor Then ' Segun trabaje como servidor o cliente, establecemos
WS.LocalPort = Port ' unos parametros u otros
WS.Listen
RaiseEvent Conexion(True)
Else
WS.RemoteHost = IP
WS.RemotePort = Port
WS.Connect
End If
Errores:
If Err.Number <> 0 Then RaiseEvent Error(Err.Number, Err.Description)
End Function
'
' Desconectar
'
Public Function Desconectar()
WS.Close ' Para desconectar manualmente
RaiseEvent Conexion(False) ' lo normal es usarlo al trabajar
If esServidor Then ' en modo servidor
RaiseEvent Conexion(False)
End If
End Function
'
' Recibir Datos
'
Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Dim Datos As String, bucle As Integer, Comandos() As String, SubComando() As String
Dim CadenaEnviar As String
WS.GetData Datos, vbString
Comandos = Split(Datos, vbCrLf)
For bucle = 1 To UBound(Comandos())
SubComando = Split(Comandos(bucle - 1), "=")
Select Case esServidor
Case True ' ES SERVIDOR
Select Case SubComando(0)
Case "FICHERO"
RutaFichero SubComando(1)
TamañoArchivoS = SubComando(2)
RaiseEvent RecibiendoDatos(iFichero, TamañoArchivoS)
WS.SendData "EMPEZAR=" & CStr(FHex.TArchivo \ 8) & vbCrLf ' manda el bloque
'donde debe empezar a transmitir
Case Else
RaiseEvent Progreso(CInt(CLng((SubComando(0)) * 100) / TamañoArchivoS))
If Not FHex.Fichero(CLng(SubComando(0)), SubComando(1)) Then
RaiseEvent Completado
End If
End Select
Case False ' NO ES SERVIDOR
Select Case SubComando(0)
Case "ESPERANDODATOS"
RaiseEvent Conexion(True)
WS.SendData "FICHERO=" & FHex.RutaArchivo & "=" & FHex.TArchivo & vbCrLf
Case "EMPEZAR"
FPuntero = CLng(SubComando(1)) * 8 ' pone el puntero donde va a empezar
Do While FHex.Fichero(FPuntero, CadenaEnviar)
If WS.State <> 7 Then Cancelar = True: Exit Do
WS.SendData CStr(FPuntero) & "=" & CadenaEnviar & vbCrLf
FPuntero = FPuntero + 8
RaiseEvent Progreso(CInt((FPuntero * 100) / FHex.TArchivo))
If Cancelar Then Exit Do
DoEvents
Loop
If Not Cancelar Then
WS.SendData CStr(FPuntero) & "=" & CadenaEnviar & vbCrLf
RaiseEvent Completado
Else
RaiseEvent Mensaje("Cancelado por el usuario")
WS.Close
RaiseEvent Conexion(False)
End If
End Select
End Select
Next
End Sub
coolbrain:
Lympex:
Citar
Básicamente lo que hace es ir transformando los caracteres, les coje el código ascii y lo convierte en 18 caracteres ascii menos para cifrar, y les suma esos 18 para descifrar. Es un algoritmo muy básico pero espero que te sirva
Lympex, esa funcion que usas para cifrar y descifrar no creo que sirva si vas a transferir datos que no sean alfanumericos. Piensa en el caso de que vayas a transferir un caracter ASCII de valor 0 que seria (a parte del 13) el vbcrlf o retorno de carro. Provocaria que el resultado fuese -18 y petaria. A mi me gusta mas la idea de usar XOR si conoceis el sistema binario XOR lo que hace es la negación de OR y el resultado es perfecta combinacion para cifrar. Por ejemplo:
Un codigo a OJO!!, podria ser:
Código:
' cuidado que esto lo estoy haciendo sobre la marcha
public function cifrar(byRef Cadena as string)
dim BCadena as integer, BClave as integer
const Clave="1X3fxpqw823"
for BCadena =1 to len(Cadena)
BClave=BClave+1
If BClave>len(Clave) then BClave=1
cifrar=cifrar & chr( asc(mid(cadena,BCadena,1)) XOR asc(mid(Clave,BClave,1)))
next BCadena
End function
Si ponemos:
Código:
dim mipass as string
mipass="HOLA"
cifrar mipass
debug.print mipass
pues ya no saldra "HOLA" saldra un churro de caracteres que no se entiende. Lo bueno del asunto esque si usamos ese churro y lo volvemos a pasar por la funcion cifrar, devolvera otra vez "HOLA".
Ya digo que lo hago a ojo, asi os lo currais vosotros, si necesitais que lo pruebe me lo decis. Un saludo
{_The_Alwar_}:
um.. Interesante, ya tengo para rato, el ejemplo de restar 18, es verdad que dara error si es un caracter cuyo ascii es menor a 18, yo eso ya lo utilizaba, pero como mucho le ponia 3 y rara vez petaba, pero una vez mi hermano vio un texto cifrado y el mismo texto descifrado, cogio lapiz y papel y lo revento :( espero que estos no los reviente nadie... jejej (dificil creo). Coolbrain, me podrias explicar tu codigo? esque no entiendo muy bien que cadena cojes para cifrar y que password
Navegación
[#] Página Siguiente