Ayuda con Crypto

Estoy un poco perdido con la función Crypto, lo que deseo es darle una codificación a una password que tenga un poco más de seguridad que base64, pienso que seria suficiente con 256, mi duda es como genero una función básica que lo Encripte y otro que lo Desencripte.

He revisado en el Foro pero no hay nada claro, me podrían dar una mano? para Xojo 2022r4 o superior.

Hello @Mauricio_Tanco ,

https://www.youtube.com/watch?v=tlFIuiT14as

https://www.youtube.com/watch?v=3whgd0zU7-w

Might help you

2 Likes

@brian_franco excelente, baje el codigo del RSA pero no hace nada (creo que le falta el codigo al botón) y del AES que es el que me interesa no vi código para bajar, sabes si existe algun link para bajarlo?.

Este es el código que se usa en el video:

var message as String = "Xojo is an awesome programming language!"
var encrypted as MemoryBlock 
var decrypted as MemoryBlock
var key as MemoryBlock 
var vector as MemoryBlock
// Create the key and the vector
key = Crypto.GenerateRandomBytes(16)
vector = Crypto. GenerateRandomBytes(16)
// Encrypt the message!
encrypted = Crypto.AESEncrypt(key, message, Crypto.BlockModes.CBC, vector)
// MessageBox(encrypted)
decrypted = Crypto.AESDecrypt(key, encrypted, Crypto.BlockModes.CBC, vector)
MessageBox(decrypted)
1 Like

@brian_franco muchas gracias con ese video lo codifique.

var message as String = “Mensaje en secreto de Xojo”

var encrypted as MemoryBlock
var decrypted as MemoryBlock

var key as MemoryBlock
var vector as MemoryBlock

key = Crypto.GenerateRandomBytes(16)
vector = Crypto.GenerateRandomBytes(16)

encrypted = Crypto.AESEncrypt(key, message, Crypto.BlockModes.CBC, vector)
print encrypted

decrypted = Crypto.AESDecrypt(key, encrypted, Crypto.BlockModes.CBC, vector)
print decrypted

MessageBox (decrypted)

Gracias! justo lo estaba pasando @AlbertoD
Soy nuevo en eso del Crypto, disculpas y gracias a ambos!

No hay por qué disculparse, mi mensaje sólo es indicar que no hay link para bajar el código porque es muy simple.

Gracias al ‘Live Text’ con Ventura pude copiar y pegar el código.

Interesante @AlbertoD yo también tengo Ventura voy a probarlo.

Acabo de agregar un nuevo tema:

Porque veo que los aportes de usuarios como tú son muy importantes y estaria bueno disponer de algún repositorio, solo al estilo vb6 donde se ponia un detalle y link para descargar el código, estaria bueno que xojo implementara algo asi para que todos podamos aportar.

Quiero generar una función donde se pase el mensaje (sea sin codificar o codificado) y haga la operación opuesta, en lo siguiente me da error:

Public Function CryptoSN(message as String, strSN as String) As string

var key as MemoryBlock
var vector as MemoryBlock
key = Crypto.GenerateRandomBytes(16)
vector = Crypto.GenerateRandomBytes(16)

var resultado as MemoryBlock
if strSN = “S” then
resultado = Crypto.AESEncrypt(key, message, Crypto.BlockModes.CBC, vector)
else
resultado = Crypto.AESDecrypt(key, message, Crypto.BlockModes.CBC, vector)
end if
return resultado

Encripta bien, el error es al desencriptar…
CryptoException:
StreamTransformationFilter: ciphertext length is not a multiple of block size

Un problema que veo es que cada vez que ejecutas esa función creas una nueva key/vector, así que cualquier cosa que encriptaste con anterioridad no podrá ser desencriptado ya que key/vector serán diferentes.

ah correcto, necesito el key, vector almacenarlo con la clave para luego poder desencriptar.
me queda la duda si puedo manejar el MemoryBlock como string sin problemas.

@AlbertoD una consulta quizás me puedas ayudar, tengo las variables Key y Resultado con el Encode, el Decode me funciona bien mientras lo tengo en variables, PERO cuando lo grabo a MySQL en campos Varchar y los vuelvo a leer el Decode me da error, puede ser que se pierda al guadarlo en mysql?

Error:

decryptAES with the incorrect key throws InvalidCiphertext(“StreamTransformationFilter: invalid PKCS #7 block padding found”

¿Cómo estás grabando al MySQL?
¿Cómo lo pasas del MySQL de regreso al key MemoryBlock?

Edito: tal vez te sirva usar EncodeHex y DecodeHex ?

Estoy grabando el string obtenido directamente con un insert en mysql en un campo varchar.
De igual forma lo leo como .StringValue , sospecho que hay una perdida ahi del valor obtenido anteriormente.

Me imagino que tienes problemas con el Encoding y por eso te indicaba el usar EncodeHex/DecodeHex para que el string del memoryblock pueda ser guardado en la base de datos.

Algo como esto:

Var key As MemoryBlock
key = Crypto.GenerateRandomBytes(16)

Dim s As String = key.StringValue(0, 16)

Dim s2 As String = EncodeHex(s)

//guardas s2 en la base de datos

Dim key2 As MemoryBlock
key2 = DecodeHex(s2)

Nota: yo no he trabajado con Crypto y tampoco grabado memoryblock keys en base de datos. La información que pongo es con la poca experiencia que tengo al respecto pero que tiene sentido (si he visto la documentación, el video que pusieron un link aquí y un par de los ejemplos que vienen con Xojo). Ojalá te funcione.

2 Likes

Muchas gracias, en base a eso solucione!