Lenguaje de implementación para crypto

2

Voy a implementar un pequeño crypto lib / tool. La regla "no implementar criptografía por ti mismo" no se aplica aquí, ya que este sistema de criptografía es nuevo y aún no está implementado. ;) Así que el primer paso es la elección del lenguaje de implementación. Y mi pregunta aquí es, si hay razones para preferir una sobre otra.

Ya que tiene que ser eficiente, simpatizo con C o C ++. Y con C o C ++ debería ser fácil crear enlaces para otros lenguajes como Java o Python, más adelante.

Entonces, si estás de acuerdo conmigo, que C o C ++ es bueno para este propósito, concentrémonos en C vs. C ++.

C puede ser un poco más simple y la falta de cosas como objetos podría ayudar a evitar errores críticos. Por otro lado, C ++ podría ofrecer la capacidad de hacer algunas cosas de una manera más fácil. Como el uso del dispositivo aleatorio C ++ 11 para números aleatorios criptográficamente seguros (por ejemplo, desde / dev / urandom). O manejo de excepciones, etc.

Probablemente hay más puntos. Pero tal vez la elección no es tan importante ?!

¿Cuáles son tus pensamientos?

    
pregunta firefexx 02.02.2014 - 20:11
fuente

1 respuesta

13

La elección del lenguaje de programación para criptografía depende de muchos parámetros, que incluyen (pero no se limitan a) los siguientes:

  • Si el objetivo es respaldar la investigación (por ejemplo, probar variaciones), el idioma debe ser el más dominado por quienes realizarán la investigación. Por ejemplo, las personas que quieren "investigar criptografía" y se sienten más cómodos con Python usarán Python.

  • Si el objetivo es servir como una herramienta pedagógica, por ejemplo. para una implementación de un nuevo algoritmo de referencia , debe preferirse un lenguaje amplio con semántica clara. Los criptógrafos han usado C durante mucho tiempo para ese trabajo, pero, posiblemente, Java o C # serían mejores opciones, ya que tienen mucho menos "rincones oscuros".

  • Si el objetivo es la eficiencia, entonces la arquitectura objetivo es de suma importancia; por ejemplo, muchas plataformas integradas solo admiten (un subconjunto de) C, y cualquier implementación deberá implementarse de forma más o menos directa en C (la traducción automática de otros idiomas es posible pero requiere trabajo). Si tiene la opción, entonces compile los idiomas (por ejemplo, C) y los idiomas con compiladores JIT eficientes (por ejemplo, Java , C #) son apropiados.

  • Si el objetivo es la eficiencia máxima y desea ejecutar el menor número posible de ciclos de reloj, entonces será necesario realizar algunos ensamblajes. Esto casi no importa en la práctica, aparte de los microbicarcos (en la mayoría de las aplicaciones prácticas, la memoria y el ancho de banda de la red son el cuello de botella, no la criptografía), pero es un ejercicio divertido.

  • La mayoría de los algoritmos criptográficos procesan elementos secretos (por ejemplo, claves) y pueden ser vulnerables a ataques de canal lateral . La prevención de tales ataques requiere un conocimiento íntimo de toda la gestión arcana de la memoria caché, la predicción de saltos y otros detalles sutiles. Las implementaciones que son robustas contra tales ataques son muy difíciles de construir, pero el problema se vuelve más fácil (no es fácil, es más fácil) con un lenguaje de nivel inferior. Por lo tanto, ensamblado o C (con C, todavía tiene que entender lo que está sucediendo en el nivel del ensamblaje). Podría decirse que si sabe lo suficiente como para implementar una implementación criptográfica sin canal lateral, entonces ya sabe que ...

  • Si estás cansado de la vida, usa C ++.

Personalmente, he implementado algoritmos criptográficos para varios objetivos, que incluyen investigación, pedagogía y código de nivel de producción eficiente (actualmente implementado en el campo) en C, Java, C #, Forth, una docena de dialectos de ensamblaje y algunos otros idiomas Ninguno de estos idiomas era "mejor" que los otros de manera absoluta; todo es cuestión de contexto.

    
respondido por el Tom Leek 02.02.2014 - 20:34
fuente

Lea otras preguntas en las etiquetas