CSPRNG de una sola línea en su amigable consola Linux

Lo primero es lo primero: ¿qué es un CSPRNG ? El acrónimo significa Cryptographically Secure Pseudo-Random Number Generator . Es un pariente avanzado del PRNG – Generador de números pseudoaleatorios. La diferencia crítica entre los dos es la naturaleza determinista del último algoritmo. Normalmente, PRNG comenzará a partir de algún valor de inicialización y luego procederá, de manera determinista, a producir bits de “apariencia aleatoria”. Es lo suficientemente bueno para experimentos estadísticos en matemáticas y física, pero no lo suficientemente bueno para criptografía, que debe ser aleatoria y segura .

Este último requisito r descalifica el uso de la función random () que se proporciona lista para usar en la mayoría de los lenguajes: java.util.Random de Java, Math.random () de Javascript o funciones similares en contextos sensibles a la seguridad.

En el espacio de las criptomonedas, los CSPRNG se utilizan para generar claves privadas. Por ejemplo, en el protocolo Bitcoin, una clave privada es una secuencia de 256 bits (o 64 dígitos hexadecimales), supuestamente derivada de una manera que no puede ser adivinada por un atacante malintencionado. Entonces, ¿cómo obtenemos un generador de números aleatorios compatible con CSPRNG?

Resulta ser una tarea bastante fácil en Linux. Abra su consola de shell favorita y pegue lo siguiente:

cat / dev / urandom | head -n 50 | od -x | cut -b 8–12,14–18 | xargs | sed ‘s / // g’ | cortar -b 1–64

La salida de este comando debe ser una cadena de dígitos hexadecimales que se parezca a esto:

f421494c6a2f9671717eab46c2f6eccba853e7b11a90818fd8201811a6b8e9d4

Vuelva a escribirlo y obtendrá una cadena completamente diferente, pero no solo diferente y aleatoria, sino que tiene propiedades criptográficamente seguras muy sólidas. ¡Ahí está tu clave privada!

Entonces, echemos un vistazo debajo del capó para ver cómo funciona y por qué es seguro.

/ dev / urandom es un puntero de archivo al flujo binario sin bloqueo proporcionado por el sistema operativo Linux subyacente. Esta secuencia sirve como un & quot; grupo de entropía & quot; – una fuente de aleatoriedad formada por las distintas partes del estado del sistema operativo en cualquier momento, incluidas las configuraciones del dispositivo, la memoria, la CPU, el tiempo desde el último reinicio, etc. La idea es que es imposible reproducir de forma determinista porque hay suficiente aleatoriedad subyacente integrada en los procesos del sistema operativo. Un atacante puede observar miles de llamadas a / dev / urandom sin acercarse más a adivinar cuál será la próxima salida. Por lo tanto, posee la característica crítica de un verdadero CSPRNG. Muchos lenguajes de programación de nivel superior, el más notable Java, utilizan el / dev / urandom subyacente para sembrar sus funciones criptográficas integradas, como la clase SecureRandom de Java.

Dado que / dev / urandom es un flujo binario, llamar a cat en él produjo muchos galimatías en la pantalla, y para analizar primero tomamos una línea de 50 córtelo y ejecútelo a través de od – volcado octal – que puede tomar un flujo binario y convertirlo a formatos legibles por humanos, en nuestro caso – hexadecimal. El resto de la magia consiste en extraer campos de la salida con cut , convertir la salida de varias líneas en una sola línea con xargs , eliminar espacios con sed , y finalmente extrayendo una parte de los bytes que nos interesan, nuevamente usando cut . ¡Voila!