python

Implementación de SJCL (Stanford Javascript Crypto Library) en Python

Introducción

La librería SJCL es una librería para encriptar texto en Javascript. Fue creada por algunos estudiantes de la universidad de Stanford.

Funciona para, como su nombre lo dice, encriptar texto y datos en javascript y también para desencriptar los mismos. Es decir, encripta y desencripta usando una contraseña.

Ayer estaba implementando una API en Python, pero requería que los datos fueran encriptados con dicha librería. Así que buscando encontré una implementación que, aunque tenía algunos errores, los pude arreglar

Nota

Probé esto en Python versión 3, no sé cómo funcione en las versiones anteriores.

Implementación

La librería, como lo mencioné, ya existe y puede verse en este sitio, pero como se pueden dar cuenta está un poco desatendida. De todos modos la instalé usando:

pip install sjcl

Intenté probar y salía lo siguiente:

Así que me puse a investigar (la solución era muy, muy sencilla, pero cuesta encontrarla) un poco, y analicé la salida del error. Decía que la excepción se lanzó en la línea 170 del archivo sjcl.py. Fui al repositorio de GitHub y busqué la línea 170:

ciphertext = cipher.encrypt(plaintext)

Investigando me di cuenta de que el error esperaba datos de tipo byte, no strings simples. Y encontré una respuesta en stackoverflow que sugería codificar los datos. Así que descargué el archivo (ventajas del código abierto), lo guardé en un lugar accesible, desinstalé usando pip uninstall sjcl (para que no hubiera confusiones al hacer el import), y cambié la línea 170, así:

ciphertext = cipher.encrypt(plaintext.encode("utf-8"))

Guardé los cambios, y probé:

Ahora sí funciona. Y para desencriptar…

Por lo que ahora sí ya podemos encriptar y desencriptar a gusto.

Código de ejemplo

Aquí dejo el código que usé para probar:

from sjcl import SJCL
texto_cifrado = SJCL().encrypt("Hola, soy un mensaje secreto", "Yo soy la palabra secreta")
print("Texto cifrado: ")
print(texto_cifrado)
texto_descifrado = SJCL().decrypt(texto_cifrado, "Yo soy la palabra secreta")
print("Texto descifrado: ")
print(texto_descifrado)

Eso es todo por hoy. Investigué la implementación porque la API de binbox.io necesita que los datos vayan codificados de esta manera. Pronto escribiré una entrada sobre ello.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Tramitar acta de nacimiento en línea de manera instantánea

En este post te quiero compartir mi experiencia tramitando un acta de nacimiento de México…

1 hora hace

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 semanas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esta web usa cookies.