Ayuda con función para encriptar información en la base de datos usando Power Builder

Sabes que encontré una función para encriptar pero no la comprendo muy bien
[function string of_encrypt(as_str)]
integer i, j
string ls_enctext = ""
CONSTANT string CRYPT_KEY = "$#@%&#%@&*"
j = len(as_str)
FOR i = 1 TO j
ls_enctext += mid(CRYPT_KEY , mod(i,10) + 1, 1)
ls_enctext += String(Char(255 - Asc(Mid(as_str, i, 1))))
NEXT
RETURN ls_enctext
Funciona pero
En mi base de datos guarda todo con estos caracteres $#@%&#%@&*
pero la momento de sacar los datos encriptados de la bd los diferencia perfectamente como sucede esto o sea como guarda la información en la base de datos siendo que visualmente es la misma

2 Respuestas

Respuesta
1
La función es una de tantas que permiten encriptar usando una llave de encriptación. Lo que hacen es obtener un nuevo valor para la cadena A encriptar usando para ello la llave y valores de la tabla ASCII.
Los resultados de estas fx de encriptación son muy buenos ya que es sumamente difícil de desencriptar SI NO se conoce la llave (esto por la gran cantidad de combinaciones posibles). Si bien en tu ej. es "$#@%&#%@&*", podría ser cualquier cosa.
Lo que si, vos me mandaste solamente la parte que encripta y no la que desencripta. En la que desencripta también debe hacer referencia a la llave, por lo tanto si quisieras cambiarla deberías hacerlo en los dos lugares.
Si quisieras mejorarla podrías hacer un objeto no visual con un par de métodos que encripten y desencripten, deberían tener la llave como variable de instancia (que no se pueda cambiar excepto por un método de la clase).
Podrías hacer que algún método que recibiera una llave y una cadena y la encripte y otro que desencripte (). También otros métodos que usen directamente la llave de la clase.
---
Te mando la función con algunas explicaciones y modificaciones para que puedas ponerla en el debugger y seguirla.
[function string of_encrypt(as_str)]
integer i, j , li_ascii
string ls_enctext = "", ls_strg
long ll_a
CONSTANT string CRYPT_KEY = "$#@%&#%@&*" //lave de encriptado
j = len(as_str) //longitud de la cadena A encriptar
FOR i = 1 TO j
ll_a = mod(i,10)//esto le permite obtener un número del 1 al 10 (para cada i) que representa una posición de la llave
ls_strg = Mid(as_str, i, 1)//va obteniendo las letras de la cadena A encriptar
li_ascii = Asc(Mid(as_str, i, 1))//transforma las letras a su valor ascii
//ahora intercala un elemento de la llave con uno de la cadena encriptada
ls_enctext += mid(CRYPT_KEY , mod(i,10) + 1, 1) //obtiene un caracter de la llave, la posición está dada por i
ls_enctext += String(Char(255 - Asc(Mid(as_str, i, 1)))) //convierte el valor ascii de la letra en curso a un nuevo caracter restandole el valor ascii a 255 y después a String para concatenarlo al resultado de la encriptación
NEXT
RETURN ls_enctext
Respuesta
1
Según lo que puedo ver en esta función, esto va de la siguiente manera
*- primero recibe como referencia la cadena a encriptar, en la variable as_str
*- luego basado en una constante CRYPT_KEY compone otra cadena la cual selecciona posiciones de caracteres de la cadena CRYPT_KEY, dependiendo del algoritmo indicado con el mod(), tomando una base de 10, la cual proviene del numero de caracteres integrados en CRYPT_KEY indicando asi la posicion de lectura de CRYPT_KEY
*- inmediatamente despues, lee la posicion correspondiente y secuencial de la cadena enviada en as_str, la cual va de caracter en caracter de izquierda a derecha, y se lo resta al numero 255, que corresponde a el último caracter de la tabla ascii casi que generando caracteres especiales los cuales a simple vista no pueden ser leidos, esto caracteres son en realidad la palabra que se esta encriptando, pero como referencia utiliza los caracteres basados en CRYPT_KEY.
*- el resultado a simple vista sera $#@%&#%@&*, pero a la derecha inmediata de cada caracter, se encuentra uno no visible, que corresponde a la cadena encriptada.
Resultado:
La desencriptación, la dará una segunda función la cual recompone por medio de un algoritmo reversivo, la cadena encriptada y la extrae encontrándolos me imagino restando de 255 el valor que tiene cada intentar secuencial saltando de 2 en 2 que corresponde a la derecha inmediata entre carácter visible, el resultado sera más o menos así
si encripto la letra A cuyo ascii es 65, por ejemplo, podría tener como mascara (que en definitivamente esto es lo que presenta con la constante CRYPT_KEY) podría ser # visualmente, pero inmediatamente después a su derecha sera el ascii 255 - 65 el cual es (¿? ) 190 y esto es lo que la función desencriptadora leerá imagino recuperando el numero ascii del carácter el cual sera otra vez 190 y a 255 le resta 190 y el resultado sera 65 al convertir este 65 a char aparecerá la letra A.
Insteresante...
Espero que esto pueda resolver tu problema
saludos
agdsys

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas