En criptografía , una firma en anillo es un tipo de firma digital que puede ser realizada por cualquier miembro de un conjunto de usuarios que tengan claves . Por lo tanto, un mensaje firmado con una firma en anillo está respaldado por alguien de un conjunto particular de personas. Una de las propiedades de seguridad de una firma en anillo es que debería ser computacionalmente inviable determinar cuál de las claves de los miembros del conjunto se utilizó para producir la firma. Las firmas en anillo son similares a las firmas de grupo , pero difieren en dos aspectos clave: primero, no hay forma de revocar el anonimato de una firma individual; y segundo, cualquier conjunto de usuarios puede usarse como un conjunto de firma sin configuración adicional.
Las firmas de anillo fueron inventadas por Ron Rivest , Adi Shamir y Yael Tauman Kalai , y presentadas en ASIACRYPT en 2001. [1] El nombre, firma de anillo , proviene de la estructura similar a un anillo del algoritmo de firma .
Supongamos que un conjunto de entidades tiene pares de claves pública/privada, ( P 1 , S 1 ), ( P 2 , S 2 ), ..., ( P n , S n ). La parte i puede calcular una firma de anillo σ en un mensaje m , en la entrada ( m , S i , P 1 , ..., P n ). Cualquiera puede comprobar la validez de una firma de anillo dados σ, m , y las claves públicas involucradas, P 1 , ..., P n . Si una firma de anillo se calcula correctamente, debería pasar la comprobación. Por otro lado, debería ser difícil para cualquiera crear una firma de anillo válida en cualquier mensaje para cualquier conjunto sin conocer ninguna de las claves privadas para ese conjunto. [2]
En el artículo original, Rivest, Shamir y Tauman describieron las firmas de anillo como una forma de filtrar un secreto. Por ejemplo, una firma de anillo podría usarse para proporcionar una firma anónima de "un funcionario de alto rango de la Casa Blanca ", sin revelar qué funcionario firmó el mensaje. Las firmas de anillo son adecuadas para esta aplicación porque el anonimato de una firma de anillo no se puede revocar y porque el grupo para una firma de anillo se puede improvisar.
Otra aplicación, también descrita en el artículo original, es la de las firmas negables. En este caso, el remitente y el destinatario de un mensaje forman un grupo para la firma en anillo; la firma es válida para el destinatario, pero nadie más estará seguro de si el destinatario o el remitente fue el firmante real. Por lo tanto, una firma de este tipo es convincente, pero no puede transferirse más allá de su destinatario previsto.
Se realizaron diversos trabajos, introduciendo novedades y partiendo de diferentes supuestos:
La mayoría de los algoritmos propuestos tienen un tamaño de salida asintótico ; es decir, el tamaño de la firma resultante aumenta linealmente con el tamaño de la entrada (número de claves públicas). Eso significa que tales esquemas son impracticables para casos de uso reales con un tamaño suficientemente grande (por ejemplo, una votación electrónica con millones de participantes). Pero para algunas aplicaciones con un tamaño de entrada medio relativamente pequeño , dicha estimación puede ser aceptable. CryptoNote implementa el esquema de firma en anillo de Fujisaki y Suzuki [5] en pagos p2p para lograr la imposibilidad de rastrear al remitente.
Recientemente han aparecido algoritmos más eficientes. Existen esquemas con un tamaño de firma sublineal [6] , así como con un tamaño constante [7] .
El artículo original describe un esquema de firma de anillo basado en RSA , así como uno basado en firmas de Rabin . Definen una "función de combinación" con clave que toma una clave , un valor de inicialización y una lista de valores arbitrarios . se define como , donde es una función de trampa (es decir, una clave pública RSA en el caso de firmas de anillo basadas en RSA).
La función se denomina ecuación de anillo y se define a continuación. La ecuación se basa en una función de cifrado simétrico :
Produce un único valor que se fuerza a ser igual a . La ecuación se puede resolver siempre que se pueda elegir libremente al menos un , y por extensión . Bajo los supuestos de RSA, esto implica el conocimiento de al menos una de las inversas de las funciones de la trampilla (es decir, una clave privada), ya que .
La generación de una firma de anillo implica seis pasos. El texto simple se representa mediante , las claves públicas del anillo mediante .
La verificación de la firma implica tres pasos.
A continuación se muestra una implementación en Python del artículo original utilizando RSA . Requiere el módulo de terceros PyCryptodome.
importar sistema operativo importar hashlib importar aleatorio importar Crypto.PublicKey.RSAImportar herramientas de funciónclase Ring : "Implementación RSA." def __init__ ( self , k , L : int = 1024 ) -> Ninguno : self . k = k self . l = L self . n = len ( k ) self . q = 1 << ( L - 1 ) def sign_message ( self , m : str , z : int ) : self._permut ( m ) s = [ Ninguno ] * self.n u = random.randint ( 0 , self.q ) c = v = self._E ( u ) primer_rango = lista ( rango ( z + 1 , self . n )) segundo_rango = lista ( rango ( z )) rango_completo = primer_rango + segundo_rango para i en todo el rango : s [ i ] = random.randint ( 0 , self.q ) e = self._g ( s [ i ] , self.k [ i ] .e , self.k [ i ] .n ) v = self._E ( v ^ e ) si ( i + 1 ) % self.n == 0 : c = v s [ z ] = self._g ( v ^ u , self.k [ z ] .d , self.k [ z ] .n ) devuelve [ c ] + s def verificar_mensaje ( self , m : str , X ) - > bool : self._permut ( m ) def _f ( i ): devuelve self . _g ( X [ i + 1 ], self . k [ i ] . e , self . k [ i ] . n ) y = mapa ( _f , rango ( len ( X ) - 1 )) y = lista ( y ) def _g ( x , i ): devuelve self . _E ( x ^ y [ i ]) r = functools . reduce ( _g , range ( self . n ), X [ 0 ]) devuelve r == X [ 0 ] def _permut ( self , m ) : msg = m.encode ( " utf - 8 " ) self.p = int ( hashlib.sha1 ( msg ) .hexdigest ( ) , 16 ) def _E ( self , x ) : msg = f " { x }{ self.p } " . encode ( " utf -8" ) return int ( hashlib.sha1 ( msg ) .hexdigest ( ) , 16 ) def _g ( self , x , e , n ): q , r = divmod ( x , n ) if (( q + 1 ) * n ) <= (( 1 << self . l ) - 1 ): resultado = q * n + pow ( r , e , n ) else : resultado = x return resultado
Para firmar y verificar 2 mensajes en un anillo de 4 usuarios:
tamaño = 4 msg1 , msg2 = "hola" , "¡mundo!"def _rn ( _ ): devuelve Crypto . PublicKey . RSA . generate ( 1024 , os . urandom )clave = mapa ( _rn , rango ( tamaño )) clave = lista ( clave )r = Anillo ( llave )para i en rango ( tamaño ): firma_1 = r . signo_mensaje ( msg1 , i ) firma_2 = r . signo_mensaje ( msg2 , i ) afirmar r . verificar_mensaje ( msg1 , firma_1 ) y r . verificar_mensaje ( msg2 , firma_2 ) y no r . verificar_mensaje ( msg1 , firma_2 )
Monero y otras criptomonedas utilizan esta tecnología. [ cita requerida ]
Este artículo incorpora texto disponible bajo la licencia CC BY-SA 4.0.
{{cite book}}
: |journal=
ignorado ( ayuda )