2011-06-02 49 views
5

Estoy escribiendo una aplicación web en ASP.Net que crea una clave de licencia para una aplicación de Windows escrita en Delphi. Para simplificar, voy a usar una dirección de correo electrónico y una fecha.Encriptar cadena en C# y descifrarla en Delphi

Quiero cifrarlo en C# y enviar esa información por correo electrónico a la persona, cuando la aplicación de Windows se inicia, la persona ingresa en la cadena cifrada.

Cada vez que se inicia la aplicación de Windows, comprueba esa licencia descifrándola y comparándola con la fecha de hoy.

¿Cómo puedo hacer esto para asegurarme de que el cifrado de C# se desarrolle satisfactoriamente en Delphi?

+10

Utilice un algoritmo estándar. – Nate

+1

Algún código de muestra podría ayudar – Jon

+5

Para este nivel de seguridad, también puede usar ROT-13. Existen conjuntos de herramientas de licencia en el mercado ([por ejemplo] (http://www.ionworx.com/icelicense.html)), para aquellos que deseen pagar por ellos. Pero si vas a desarrollar tu propio esquema, ¿por qué molestarse con una encriptación fuerte? No lo ayuda si el resto de la cadena de seguridad es débil. –

Respuesta

8

"the world was full of bad security systems designed by people who read Applied Cryptography"

Mientras que la respuesta trivial es 'utilizan el mismo algoritmo y asegúrese de que tiene las mismas claves y vector inicial', esta respuesta sólo expone el verdadero problema que se va tener: ¿Cómo va a proteger la clave de cifrado? Envíelo junto con la licencia? Incrustarlo en la aplicación? La verdad es que no existe un protocolo que pueda iniciarse automáticamente sin una raíz de confianza, ya sea una autoridad pública confiable o un secreto compartido. Un secreto compartido es fácil de codificar, pero en la práctica es inútil (lo que significa que AES, 3DES, XDES o cualquier otro cifrado similar es no), por lo que necesita un esquema que se base en criptografía de clave pública. Para eso, para encriptar algo para el beneficiario de la licencia, necesita la clave pública de dicho beneficiario, lo que dificultaría el aprovisionamiento (el sitio de licencia envía una clave pública, encripta la licencia, envía un correo electrónico, etc.). Es mucho mejor enviar la licencia en texto claro, pero firmó con su clave privada. Entonces su aplicación puede validar la firma en la licencia y usarla, si no se manipula.

S-MIME es un esquema así. PGP es igual de bueno. Escribir su propio código en C# y Delphi es posible, pero desaconsejable. Ver Cryptographic Signatures.

-1

Utilice el mismo algoritmo de cifrado/descifrado tanto en delphi como en C#.

Puede encontrar el código de un algoritmo de cifrado para C# y luego convertir el código en el algoritmo de descifrado en Delphi. Probablemente, si eliges un popular cifrado, podrás encontrar algoritmos de cifrado y descifrado que ya están en muchos idiomas diferentes.

+0

¿No hay uno estándar que pueda usar en ambos idiomas? No quiero escribir mi propio algoritmo – Jon

8
+2

Quizás le interese explicar cómo se supone que se intercambiará la clave de descifrado. –

2

Puede usar algoritmos de firma RSA o DSA estándar para hacer lo que desee. Para C#, estos son algoritmos estándar integrados en el tiempo de ejecución. Para Delphi, tienes algunas opciones. Ver Free Encryption library for Delphi.

Una vez que haya elegido una biblioteca de cifrado para Delphi, ahora se puede hacer lo siguiente:

  1. El C# servidor de firma dirección de correo electrónico y la fecha del usuario utilizando el algoritmo de firma elegida con su clave privada.
  2. El cliente de Delphi verifica la licencia utilizando el mismo algoritmo de firma.
  3. Una vez que el cliente de Delphi sabe que la firma es válida, puede probar la dirección de correo electrónico/fecha y decidir si permite la ejecución de su programa.

He hecho exactamente el tipo de verificación de firma que desea/necesita utilizando el algoritmo DSA, LockBox y C#.

Una cosa a tener en cuenta es que el cifrado C# usa números big-endian, mientras que LockBox/Windows CryptoAPI usa números little-endian. Esto probablemente significa que debe revertir la endianancia de las variables de clave pública y la firma misma antes de enviarla al cliente Delphi para su verificación. Verifique la documentación de su biblioteca crypto.

Una última nota: otros han propuesto usar algoritmos de encriptación simétrica como AES/3DES/etc. El problema con este enfoque es que su clave de cifrado "secreto" se comparte entre el servidor y el cliente. Es posible que alguien pueda recuperar la clave mediante la ingeniería inversa de su EXE compilado y luego crear un "generador de claves"; en el peor de los casos, un servidor de activación falso que transfiere licencias cifradas "auténticas". Al usar cifrado asimétrico y mantener la clave privada en secreto, no tendrá este problema. Los usuarios tendrían que descifrar cada nueva versión de su EXE o pasar las licencias auténticas firmadas, lo que es mucho más inconveniente.

+0

Lo has hecho en Delphi y C#? – Jon

+0

Más o menos. Lo usé para verificar firmas en archivos EXE para una función de actualización automática, para asegurarme de que las actualizaciones fueran auténticas. Los principios son los mismos y el código podría adaptarse fácilmente a su aplicación: simplemente firme/verifique la dirección de correo electrónico y la fecha en lugar del archivo EXE. Otra diferencia es que realmente utilicé C++ Builder en lugar de Delphi, pero la biblioteca que utilicé, LockBox, se puede usar con cualquiera de ellos y el código sería el mismo. –

Cuestiones relacionadas