Autor
|
Tema: cifrar/codificar datos (Leído 10,717 veces)
|
{_The_Alwar_}
Desconectado
Mensajes: 711
Who dares win
|
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.
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
Aquí te pongo dos funciones '////////////////////////////////////////////////////////////////////////////////// '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
'////////////////////////////////////////////////////////////////////////////////// '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.
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
coolbrain
Desconectado
Mensajes: 19
|
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 ) ' .................................................................. ' . . ' . 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
|
|
|
En línea
|
|
|
|
coolbrain
Desconectado
Mensajes: 19
|
Lympex: 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: ' 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: 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
|
|
|
En línea
|
|
|
|
{_The_Alwar_}
Desconectado
Mensajes: 711
Who dares win
|
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
|
|
« Última modificación: 17 Mayo 2005, 22:20 pm por alwar »
|
En línea
|
|
|
|
Unravel
BlueHack Team
Ex-Staff
Desconectado
Mensajes: 1.016
|
Usa el CAPICOM, A diferencia de los anteriores algoritmos propuestos, con CAPICOM puedes elegir entre los que hay "profesionales", que ya no son juguetitos (RC4, RC5, DES, 3DES, 3DES112, etc.), y las funciones ya vienen implementadas. Private Sub btncifrar_Click() Dim EncryptedData Set EncryptedData = CreateObject("CAPICOM.EncryptedData")
EncryptedData.Algorithm = 3 'TripleDES EncryptedData.SetSecret "TUPASSWORD" EncryptedData.Content = tbstring.Text
cifradoB64.Text = EncryptedData.Encrypt
End Sub Private Sub btndescifrar_click() Dim EncryptedData Set EncryptedData = CreateObject("CAPICOM.EncryptedData")
EncryptedData.Algorithm = 3 'TripleDES EncryptedData.SetSecret "TUPASSWORD" EncryptedData.Decrypt cifradoB64.Text
tbstring.Text = EncryptedData.Content
End Sub Acuédate de instalar capicom.dll.
|
|
|
En línea
|
"La verdad es un ácido corrosivo que salpica casi siempre al que la maneja". Santiago Ramón y Cajal.
|
|
|
coolbrain
Desconectado
Mensajes: 19
|
Separemos el codigo en el evento DataArrival y nos centramos en el caso de que no sea servidor. En este caso lo que hara sera ir leyendo el archivo hasta que llegue al final, y lo ira enviando por bloques (en esta caso de 8 bytes pero es a gusto del consumidor) . Para cifrar estos datos deberiamos recorrer la cadena 'CadenaEnviar' con la funcion que te pase de cifrar o la que mas te guste, asi pues la convertiria y pasaria a estar cifrada. 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
Luego en el caso de que sea servidor hay que hacer la operacion inversa: 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
Lo que es diferente es que la cadena que recibimos viene en una array 'SubComando' pues al recibir los datos se divide dos veces la cadena para saber varias cosas. Si los datos recibidos acaban de llegar o ya estaban llegando y tengo que resumirlos y tambien la posicion del archivo donde tengo que pegar ese bloque. Tendriamos que descifrar 'SubComando(1)'. Los datos para que veas un ejemplo practico seria asi: Supongamos que queremos enviar el archivoA y es un texto plano:
ArchivoA:"HOLA"
El envio seria asi mas o menos:
Se envia "FICHERO" Nombre y tamaño se envia "EMPEZAR" Do while not FinArchivo se van enviando los caracteres "HOLA" convertidos a hex loop
Espero haberme explicado bien. Piensa que el tema de los eventos es complicado. Se ha de estructurar y pensar muy bien cuando haces una aplicacion cliente / servidor. Porque sino podrias perder eventos y volverte loco
|
|
|
En línea
|
|
|
|
sch3m4
Ex-Staff
Desconectado
Mensajes: 1.608
Nihil est in intelectu quod prius not fuerit insen
|
Claro que peta :p pero si no se especifica qué tipo de caracteres se va a introducir...
|
|
|
En línea
|
SafetyBits
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
|
|
|
coolbrain
Desconectado
Mensajes: 19
|
Ya vamos, pues si resulta que al final si que se van a usar el que use la funcion acabara como tu avatar, dandose cabezazos contra el pc A mi me gusta pulir bien las cosas y aun asi siempre hay algo que o queda mal o no funciona como esperas, pero hay que ser cuidadoso con estas cosas , porque si el programa se hace cada vez mas y mas grande, imaginate para encontrar el bug.
|
|
|
En línea
|
|
|
|
{_The_Alwar_}
Desconectado
Mensajes: 711
Who dares win
|
jaja espero no acabar asi con este codigo... haber si este finde consigo algo... que con los examenes ay poco tiempo para practicar!
|
|
|
En línea
|
|
|
|
|
|