Pregunta

Estoy buscando un algoritmo Cypher asimétrico rápido para usar en el programa C ++. Nuestra aplicación accede a datos de solo lectura almacenados en Archivo (formato personalizado, algo similar al TAR), y me gustaría evitar cualquier modificación de ese archivo mediante un índice de archivo de cifrado asimétrico (soy consciente de que esta no es una solución perfecta y Los datos aún se pueden extraer y reempaquetarse utilizando ciertas técnicas).

Alguno Los archivos individuales dentro del archivo están encriptados con cypher simétrico y las claves de cifrado para ellos se almacenan dentro del índice de archivo (encabezado). Es por eso que quiero cifrar el encabezado de archivo asimétricamente.

Requisitos de Cypher:
1) La implementación del algoritmo debe ser independiente de la plataforma.
2) El algoritmo debe ser fácil de implementarme o debe estar disponible en la biblioteca (con código fuente) que permite estático Vinculación con una aplicación patentada, lo que significa que no se pueden utilizar licencias GPL/LGPL/virales. El código de MIT/BSD o el código de dominio público es aceptable.
3) Si Cypher está disponible en la biblioteca, idealmente debe tener una pequeña huella de memoria, y la implementación debe ser compacta. Preferiría usar una biblioteca C/C ++ que implementa solo un cifrado en lugar de la colección de cifrado de uso total en toda regla.

Originalmente quería usar RSA, pero parece que es simplemente demasiado lento para ser útil, y no hay muchas alternativas.

Entonces, ¿algún consejo sobre qué puedo usar?

¿Fue útil?

Solución

De acuerdo, he encontrado lo que he estado buscando, y creo que es mejor que OpenSSL (al menos para mis propósitos).

Hay dos bibliotecas:
libtomcrypt, que implementa varios cifras (incluido RSA) y libtommath, que implementa aritmética Bignum. Ambas bibliotecas están en dominio público, fáciles de piratear y tienen una interfaz de programación más simple que OpenSSL, y (mucha) mejor documentación que OpenSSL.
A diferencia del código RSA de dominio público anterior que encontré antes, LibtomCrypt puede generar nuevas claves muy rápidamente, puede importar claves generadas por OpenSSL y admite el relleno. Otra cosa buena de LBTomCrypt es que no tiene dependencias adicionales (OpenSSL para Windows quiere GDI32, por ejemplo) y es más pequeño que OpenSSL.

He decidido usar RSA para el cifrado, después de todo, porque (para mí parece) no hay alternativas verdaderamente asimétricas. Parece que la mayoría de los otros cifrados (curvas elgamal, elípticas) son más adecuadas para el cifrado simétrico donde la clave de sesión se está cifre asimétricamente. Lo cual no es adecuado para mí. Tales cifrados son adecuados para comunicaciones de red/claves de sesión, pero no sería bueno usarlo para datos estáticos sin cambios en el disco.

En cuanto a "RSA que es lento", he cambiado un poco el formato de archivo, por lo que ahora solo una pequeña parte de los datos se está cifrando asimétricamente. No descifrar este fragmento hará que el índice de archivo de lectura sea completamente difícil, si no imposible. Además, debo admitir que la lentitud de RSA fue parcialmente una impresión equivocada por código anterior He intentado usar antes.

Lo que significa, pregunta resuelta. La solución es RSA + libtomcrypt. RSA, porque no hay muchas alternativas a RSA y LibtomCrypt, porque es pequeño y en dominio público.

Otros consejos

OpenSSL debe hacer el trabajo por usted. Es de código abierto (licencia Apache, por lo que cumple con los requisitos de su licencia).

Es ampliamente utilizado y bien probado.

Use un RSA personalizado para firmar el archivo. Almacene la clave pública en la aplicación y mantenga la llave privada en casa. Ahora cualquiera podría modificar el archivo solo de lectura, pero su aplicación se negaría a cargar el archivo modificado.

Echa un vistazo a Curve25519, que es la crytpografía de la curva elíptica implementada de manera eficiente y en torno a problemas de patentes.

Cumple con todos sus requisitos. Mira aquí.

Puede usarlo para cifrar o simplemente firmar.

Como nota al margen:

Para la verificación de integridad, una Mac debería ser suficiente a menos que realmente necesite cifrado asimétrico.

¿Qué tal MD5?

Sí, soy consciente de que MD5 se ha roto; - Pero la mayoría de las aplicaciones prácticas esto es irrelevante.
Especialmente si los datos modificados también tendrían que ser válidos en el formato de datos particular y tener el MD5 correcto

EDITAR:
MD5 es apropiado si solo desea asegurarse de que los datos almacenados no se puedan cambiar (o al menos puede detectarlos) pero no oculta los datos. Tenga en cuenta que si debe tener la clave en su aplicación junto con los datos, siempre se puede extraer. Hay técnicas para ocultar la clave: una popular es simplemente ponerla dentro de un recurso estático, como un icono que se puede vincular fácilmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top