Skip to content

MCYP-UniversidadReyJuanCarlos/20-21_saluhe

Repository files navigation

GENERACIÓN VERIFICABLE DE CLAVES CRIPTOGRÁFICAS

Los protocolos criptográficos se diseñan comúnmente bajo el supuesto de que las diferentes partes de este tienen acceso a la aleatoriedad perfecta (es decir, uniforme). Sin embargo, las fuentes aleatorias utilizadas en implementaciones prácticas rara vez cumplen con esta suposición y proporcionan solo un flujo de bits con un cierto "nivel de aleatoriedad". La calidad de los números aleatorios determina directamente la solidez de la seguridad de los sistemas que los utilizan.

Cuando la generación de claves criptográficas (por ejemplo, para firma digital) se hace maliciosamente, es posible “sustituir” valores presumiblemente elegidos al azar por otros, con distintos fines (vulnerar la seguridad de la firma, insertar canales encubiertos de comunicación.). En consecuencia, en este proyecto se lleva a cabo una implementación de un esquema RSA con aleatoriedad verificable, documentada por el protocolo genérico de claves descrito por Blazy et al.

Indice

Características

Proyecto desarrollado en lenguaje Python, concretamente en la version Python 3.10.4.

Como ejecutar

Ejecutar el archivo ejecutable dist/20-21_saluhe.exe disponible en este proyecto. La ejecucion del mismo generara, en esa misma carpeta, un fichero de salida.

Uso básico

Obtencion de colecciones de primos generados con cierta aleatoriedad verificable.

Documentación de desarrollo

En esta seccion se proporciona el esquema del protocolo asi como el listado de las diversas tecnologías empleadas en el mismo.

Tecnologías empleadas en el protocolo implementado son las siguientes:

El esquema del protocolo es el siguiente:

USER'S ACTIONS CA'S ACTIONS

PRF Dodis Yampolsky

PRF HMAC

Dada una entrada 'text':

Pasos Descripcion de los pasos
1 Si la longitud de K=B, entonces K0= K. Salto al paso 4
2 Si la longitud de K>B, calculo el hash de K para obtener un string de L Bytes, despues añade al final (B-L) ceros para crear un string de B-Bytes K0. Es decir, K0 = H(K) || 00...00. Salto al paso 4
3 Si la longitud de K es menor que B, añade B-K ceros para crear un string K0 de longitud B-Bytes. Es decir, si la longitud de K es 20 bytes y la longitud de B es 64 bytes, entonces se añadiran 44 bytes cero x’00’ para formar K0
4 K0 ⊕ ipad
5 Añadir el parametro de entrada text: (K0 ⊕ ipad) || text
6 Se aplica la funcion hash a la salida del paso 5: H((K0 ⊕ ipad) || text)
7 K0 ⊕ opad
8 Se añade el resultado del paso 7 al resultado del paso 6: (K0 ⊕ opad) || H((K0 ⊕ ipad) || text)
9 Se aplica el hash al resultado del paso 8: H((K0 ⊕ opad )|| H((K0 ⊕ ipad) || text))

Miller Rabin Prime Test

Input : n (n is the number to be tested for primality)
Output : whether n is prime or not

NIZK Golberg et al

El esquema de la prueba de conocimiento cero se encuentra descrito en el anexo C (Detailed Specification for the NIZK of Permutations over Zn) del documento Efficient noninteractive certification of RSA moduli and beyond.

Pedersen Commitment Scheme

Algoritmo 2

Necesita PrimeTestW, enteros T; b; e, Dodis-Yampolsky PRF, seed s.
Devuelve una coleccion de numeros pseudo-aleatorios a y el entero i. Este entero i apunta al primer numero primo de la coleccion y el segundo numero primo esta en la ultima posicion de esta coleccion devuelta. En caso de no encontrar 2 numeros primos, i vale -1.

Arquitectura

Arquitectura del codigo

Estructura del proyecto

20-21_saluhe

src

main.py Fichero con el principal codigo de los hilos que representan usuario y CA. Asi como la inicializacion de los mismos.

algorithm_2.py Implementacion del algoritmo 2 descrito.

dodis_yampolsky.py Implementacion de la PRF de Dodis-Yampolsky descrita.

exception_text_to_file.py Clase cuya funcionalidad es la escritura de excepciones en el fichero de salida generado.

fastModularExp.py Implementacion del algoritmo de exponenciacion modular rapida.

golberg.py Definicion de la prueba de conocimiento cero de Golberg et al. descrita.

hashSha256.py Implementacion del algoritmo de hash.

hmac_c.py Implementacion del esquema HMAC.

millerRabin_primetest.py Implementacion del test de primalidad de Miller Rabin descrito.

models.py Clase para la definicion de tipos auxiliares.

nonce.py Metodos necesarios para la generacion de valores NONCE.

perdersen.py Implementacion del esquema de compromiso de Pedersen.

sieve_of_erastosthenes.py Implementacion del algoritmo de sieve of eratosthenes, encargado de buscar la coleccion de numeros primos desde 2 a n, siendo n un parametro de entrada.

Ficheros de salida Carpeta con ejemplos de salidas de la aplicacion.

Documentation Carpeta con los principales documentos usados durante la fase de investigacion.

Entorno para desarrollo y ejecución

  • Visual Studio Code como IDE para el desarrollo de este proyecto.
    • Es necesario instalar Python y Pylance para el uso de este IDE.
  • Las librerias necesarias son las siguientes: pyasn1, rsa.asn1, Crypto, gmpy2, pkcs1
    • pyasn1 py -m pip install pyasn1
    • rsa.asn1 py -m pip install rsa
    • Crypto py -m pip install pycryptodome
    • gmpy2 py -m pip install gmpy2
    • pkcs1 py -m pip install pkcs1
  • Al instalar las librerias es posible que necesite cerrar y volver a abrir el IDE para que el error de falta de dependencias desaparezca

Para la creacion del fichero exe con todas las dependencias:

  • (Si no se dispone del modulo pyinstaller, es necesario ejecutar lo siguiente: - pyinstaller py -m pip install PyInstaller)
  • python -O -m PyInstaller -F "<ruta-del-proyecto>"\src\main.py -n "<nombre-del-ejecutable-final>"
  • La opcion -F del comando se usa para la encapsulacion de las dependencias en un solo fichero ejecutable.

Bibliografía

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published