security cryptography smartcard javacard

security - JavaCard: implementación de software puro de ECC sobre GF(2 ^ n)



cryptography smartcard (2)

Las tarjetas inteligentes que pueden realizar criptografía asimétrica siempre lo hacen usando un coprocesador (que generalmente contiene un multiplicador de Montgomery). La mayoría de las tarjetas inteligentes (por ejemplo, los procesadores NXP SmartMX iniciales) aún funcionan con una CPU de 8 o 16 bits. Esas CPU no están diseñadas para realizar operaciones en grandes cantidades. Lamentablemente, Java Card no brinda soporte directo para las llamadas al multiplicador, si eso fuera de utilidad. La mayoría de las tarjetas (por ejemplo, el SmartMX) tampoco admiten operaciones de 32 bits (Java int ).

Por lo tanto, si desea realizar dichos cálculos, deberá programarlo usted mismo, utilizando primitivas de 16 bits firmadas y firmadas de 16 bits. Esto requerirá mucho trabajo y será muy lento. Agregue a esto la sobrecarga requerida para procesar el código byte de Java y tendrá una sorprendente cantidad de lentitud.

Tengo tarjetas inteligentes de NXP que admiten ECC sobre GF (p) y que no admiten ECC sobre GF (2 ^ n).

En mi proyecto necesito usar este tipo particular de tarjeta inteligente (ya se usan miles de instancias). Sin embargo, necesito agregar la verificación de la firma de la CE sobre el sect193r1, que es una curva sobre GF (2 ^ n).

El rendimiento no es un problema para mí. Puede llevar algo de tiempo. La verificación de firma no implica ninguna clave privada, por lo que la seguridad y la administración de claves tampoco son problemas. Lamentablemente, debo verificar la firma dentro de mi tarjeta inteligente, no en el dispositivo equipado con lector de tarjeta inteligente.

¿Hay alguna solución? ¿Existe algún código fuente existente de una implementación de software puro JavaCard de criptografía EC sobre GF (2 ^ n)?


Solo estoy actualizando con información adicional en caso de que alguien aún esté buscando una solución.

La librería OpenCryptoJC de hecho proporciona BigNumbers, operaciones primitivas de curva EC, etc. Así que debería poder cargar su propia curva y sus parámetros.

Sin embargo, si esta curva no es compatible de forma nativa con la tarjeta, use lib para implementar las operaciones en la curva usted mismo. Eso no es trivial ...

Alternativamente, si hay algún mapeo entre la curva GF (2 ^ n) que desea usar y otro GF (p) puede intentar hacer todas las operaciones en GF (p) y asignar los resultados a GF (2 ^ n) . Eso podría ser más fácil de hacer si asumimos que existe tal mapeo.

Descargo de responsabilidad: soy uno de los autores de lib . :)