Visual Basic - Dudas con Encriptacion por Sustitucion

Life is soft - evento anual de software empresarial
 
Vista:

Dudas con Encriptacion por Sustitucion

Publicado por Francisco (3 intervenciones) el 14/12/2008 04:07:13
Duda con encriptacion por sustitucion
[email protected]

Buenas noches, tengo una duda para desencriptar
la funcion Cifrado va muy bien
el problema se presenta al descifrar la encriptacion
que es la funcion posterior que se llama Descifrado
'----------------------------------------------------------
'ESTA FUNCIONA TRABAJA CORRECTAMENTE
'----------------------------------------------------------

Public Function Cifrado(ByVal Entrada As String, _
Optional CodigoOriginal As String = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 #$%.-,+*)(_", _
Optional CodigoCifrado As String = "3E3D3C3B3A393837363534333231AE302F2E2D2C2B2A29282726254F4E4D4C4B4A494847465F4F2F1F5152535455565720") As String
Dim i As Long
Dim j As Long
Dim retStr As String
Dim c As String * 1
Entrada = UCase(Entrada)
For i = 1 To Len(Entrada)
c = Mid(Entrada, i, 1)
j = InStr(1, CodigoOriginal, c)
If j > 0 Then
retStr = retStr & Mid(CodigoCifrado, ((j * 2) - 1), 2)
Else
retStr = retStr & c
End If
Next i
Cifrado = retStr
End Function

'----------------------------------------------------------
'ESTA ES DONDE TENGO LA DUDA
'----------------------------------------------------------
Public Function Descifrado(ByVal Entrada As String, _
Optional CodigoOriginal As String = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 #$%.-,+*)(_", _
Optional CodigoCifrado As String = "3E3D3C3B3A393837363534333231AE302F2E2D2C2B2A29282726254F4E4D4C4B4A494847465F4F2F1F5152535455565720") As String
Dim i As Long
Dim j As Long
Dim retStr As String
Dim c As String * 1
Entrada = UCase(Entrada)
For i = 1 To Len(Entrada)
c = Mid(Entrada, i, 1)
j = InStr(1, CodigoCifrado, c)
If j > 0 Then
retStr = retStr & Mid(CodigoOriginal, ((j * 2) - 1), 2)
Else
retStr = retStr & c
End If
Next i
Descifrado = retStr
End Function
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dudas con Encriptacion por Sustitucion

Publicado por igor (633 intervenciones) el 14/12/2008 12:30:31
Me equivoco o las 2 funciones son las mismas??????????

Yo ya te ayudé una vez y ya veo para que te sirvió. Aqui se biene a aprender, no a pedir que te hagan los deberes.

Si tienes alguna pregunta puedes plantearla, sino dejanos en paz!!!!!!!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con Encriptacion por Sustitucion

Publicado por P3L30N (699 intervenciones) el 14/12/2008 13:47:06
Pues no!
Te equivocas, las dos funciones no son las mismas!

Antes de responder con esa galantería que te caracteriza, lee bien lo que preguntan:

Cifrado:
For i = 1 To Len(Entrada)
c = Mid(Entrada, i, 1)
j = InStr(1, CodigoOriginal, c)
If j > 0 Then
retStr = retStr & Mid(CodigoCifrado, ((j * 2) - 1), 2)

Descifrado:
For i = 1 To Len(Entrada)
c = Mid(Entrada, i, 1)
j = InStr(1, CodigoCifrado, c)
If j > 0 Then
retStr = retStr & Mid(CodigoOriginal, ((j * 2) - 1), 2)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con Encriptacion por Sustitucion

Publicado por Francisco Camacho (3 intervenciones) el 14/12/2008 14:34:08
Muy buenos dias a todos los miembros de la Comunidad, Gracias P3L30N por Interceder, y si tienes razon, no son las mismas funciones, Igor, reconozco en ti un gran talento para programar, pero reclamo un poco de respeto a la ignorancia de tus semejantes, recuerdo haberte dado las gracias muy fervorosamente, precisamente por tener la duda es que recurro a este medio por que se que aqui se congregan los mejores, si no querias ayudar pues simplemente podias obviar la pregunta pero no creo ni veo la necesidad de responder de ese modo, Sin mas que agregar, nuevamente Un Millon de Gracias, estimado amigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con Encriptacion por Sustitucion

Publicado por igor (633 intervenciones) el 14/12/2008 16:49:55
Disculpame por los modos. Yo leo el código y veo 2 funciones iguales, será que veo mal?

Llendo a lo que interesa, cual es la duda?

No sabes como hacer la función de Descifrado?

Yo llego a la siguiente conclusión, no sabes como hacerlo pero has pensado que tiene que ser similar a la de Cifrado y has creado otra función con el mísmo código y has modificado las entradas CodigoOriginal y CodigoCifrado intercambiandolas, pero no tienes ni idea de como conseguir la operación inversa de Cifrado.

Igual es que me creo mas listo que nadie, aunque no lo sea, pero creo que mi exposición no está muy lejos de la realidad, tu podrás confirmarlo.

Programar no consiste solo en conocer el lenguaje, variables, funciones, etc, sino ser capaz de inventar, de pensar y ser creativo, de transformar las ideas en código.

Para resolver tu problema debes pensar en lo que quieres conseguir. Quieres que de cada 2 caracteres cifrados obtener 1 caracter descifrado. Esto lo realizas comparando los caracteres con la cadena de código cifrado, consigues la posición de dicho caracter dentro de la cadena y proporcionas el caracter de código original correspondiente. El problema es que de cada 2 caracteres cifrados tienes 1 original. Si piensas un poco sabrás lo que debes hacer.

Lo que no puedes pedirme en ningún caso es que te lo haga yo, porque entonces no aprendes nada.

Y por cierto, no des mucho las gracias a P3L30N, que ese seguro que no te ayuda en nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con Encriptacion por Sustitucion

Publicado por Francisco Camacho (3 intervenciones) el 14/12/2008 17:17:40
Ok te agradezco tu ayuda, reconozco que para ello se debe desarrollar el ingenio, gracias por hacerme abrir los ojos, eres un gran maestro, vamos a ver si entiendo:

Public Function Cifrado(ByVal Entrada As String, _
Optional CodigoOriginal As String = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 #$%.-,+*)(_", _
Optional CodigoCifrado As String = "3E3D3C3B3A393837363534333231AE302F2E2D2C2B2A29282726254F4E4D4C4B4A494847465F4F2F1F5152535455565720") As String
Dim i As Long
Dim j As Long
Dim retStr As String
Dim c As String * 1
Entrada = UCase(Entrada)
For i = 1 To Len(Entrada)
c = Mid(Entrada, i, 1)
j = InStr(1, CodigoOriginal, c)
If j > 0 Then
retStr = retStr & Mid(CodigoCifrado, ((j * 2) - 1), 2) 'aqui es donde se compara el cifrado con el original para obtener dos caracteres por cada caracter, en la funcion de encriptacion se supone es el inverso, ahora bien, si es el inverso debo comparar la cadena j que en este caso deberia pasar a ser la variable CodigoCifrado en lugar de ser CodigoOriginal, y supongo que debo sustituir la cantidad de caracteres a leer es decir creo que debe quedar algo como esto

' j = InStr(2, CodigoCifrado, c) creo que de este modo le estoy diciendo que lea dos caracteres del codigo cifrado para luego ordenar la comparacion con la sentencia mid que supongo debe ser modificada con algo como
' retStr = retStr & Mid(CodigoCifrado, ((j / 2) +1), 1) pero ahi es donde tengo la duda ya que al realizar la comparacion me detecta correctamente algunos caracteres pero otros me los deja sin asignarles un valor correcto

Else
retStr = retStr & c
End If
Next i
Cifrado = retStr
End Function

Gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con Encriptacion por Sustitucion

Publicado por igor (633 intervenciones) el 14/12/2008 18:53:38
Me da la impresión de que no conoces muy bien las funciones que estás usando. Lo explico un poco:

j = InStr(1, CodigoOriginal, c) '

Buscamos en CodigoOriginal el caracter c desde la posición 1, que en este caso es la letra "A"

retStr = retStr & Mid(CodigoCifrado, ((j * 2) - 1), 2)

CodigoCifrado es la cadena de donde obtenemos el caracter cifrado.
((j*2)-1) proporciona la posición del caracter cifrado que es un doble caracter.
Por eso debemos multiplicar por 2 y restar 1, porque las posiciones de caracteres son:
Original Cifrado
1 1 ((1*2)-1)=1
2 3 ((2*2)-1)=3
3 5 ((3*2)-1)=5
4 7 ((4*2)-1)=7
el 2 del final es para indicar que mid debe retornar 2 caracteres, si ponemos esto:

retStr = retStr & Mid(CodigoCifrado, ((j * 2) - 1), 5)

nos retornaría 5 caracteres desde la posición ((j * 2) - 1).

Ahora para lo que queremos conseguir es:

retStr = retStr & Mid(CodigoCifrado, ((j / 2) +1), 1)

Cifrado Original
1 1 ((1/2)+1)=1
3 2 ((3/2)+1)=2
5 3 ((5/2)+1)=3
7 4 ((7/2)+1)=4

Si estos resultados no se corresponden sería conveniente utilizar (int(j / 2) +1)

En cuanto a:

j = InStr(2, CodigoCifrado, c)

Buscamos en CodigoCifrado el caracter c desde la posición 2, que en este caso es la letra "E" pero queremos obtener el "3E" así que la posición debe ser 1 como antes. Además:

Dim c As String * 1

Supone una limitación, porque solo tendremos c="3" en vez de c="3E". Yo me olvidaría de limitar los string, VB6 se encarga muy bien de gestionar estas cosas.

Espero haberte aclarado cosas, para cualquier duda ya sabes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar