El cifrado puede ayudar a proteger los datos para que no sean vistos ni modificados, y puede ayudar a proporcionar un medio de comunicación seguro a través de canales que de otro modo serían inseguros. Por ejemplo, los datos pueden cifrarse mediante un algoritmo de cifrado, transmitirse en un estado cifrado y luego el destinatario previsto los puede descifrar. Si un tercero intercepta datos cifrados, será difícil descifrarlos.
Para lograr estos objetivos, se crean esquemas de cifrado utilizando una combinación de algoritmos y convenciones, llamados primitivos de cifrado. Incluyendo cifrado de clave privada (cifrado simétrico), cifrado de clave pública (cifrado asimétrico), firmas criptográficas y hashes criptográficos.
Utilizamos cifrado de clave pública (cifrado asimétrico) para implementar el algoritmo del código de registro.
El cifrado de clave pública utiliza una clave privada que debe mantenerse en secreto para usuarios no autorizados y una clave pública que puede hacerse pública para cualquiera. Tanto la clave pública como la privada están relacionadas matemáticamente; los datos cifrados con la clave pública sólo se pueden descifrar con la clave privada, mientras que los datos firmados con la clave privada sólo se pueden verificar con la clave pública.
Para el código de registro, usamos la clave privada para firmar una cadena (nombre de usuario) y luego usamos la clave pública para verificar la firma (código de registro). Dado que la clave pública solo se puede usar para verificación, podemos distribuir la clave pública con confianza y la clave privada se usa para firmar, por lo que la clave privada debe mantenerse en manos del desarrollador. De esta forma se consigue el objetivo de la certificación del registro. Todo el software actualmente registrado utilizando el modo "nombre de usuario, código de registro" debe utilizar esta tecnología.
Primero generamos una clave pública y una clave privada que queremos usar.
Private rsa como nuevo Security.Cryptography.RSACryptoServiceProvider
La clase RSACryptoServiceProvider proporciona una implementación del algoritmo RSA para realizar cifrado y descifrado asimétrico. Las claves públicas y privadas que necesitamos se pueden generar a través de ToXMLString.
rsa.ToXmlString(False)
rsa.ToXmlString(True)
Cuando el parámetro es False, solo se generará la clave pública; cuando es True, se generarán tanto la clave pública como la privada; Generalmente obtenemos una cadena de clave pública a través de ToXmlString(False); obtenemos una cadena de clave privada a través de ToXmlString(True) (aunque contiene la clave pública). Podemos guardar estas dos claves en la máquina local, definirlas y usarlas a través de constantes de cadena. En otras palabras, nuestra información de registro utilizará claves públicas y privadas únicas.
Luego firmamos la cadena especificada con las claves pública y privada.
rsa.FromXmlString(PRIVATE_KEY)
Dim f como nueva seguridad.Cryptography.RSAPKCS1SignatureFormatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim source() como byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)
Dim sha como nueva seguridad .Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(resultado)
SerialNumber = Convert.ToBase64String(regkey)
Reinicialice el objeto rsa con la clave privada recién obtenida y luego la firma se realiza a través de la clase RSAPKCS1SignatureFormatter. Convertimos la cadena de entrada en una matriz de bytes (nuestro nombre de usuario predeterminado aquí solo puede estar compuesto por caracteres ASCII) y calculamos su valor hash mediante el algoritmo hash SHA1. Luego use el método CreateSignature para firmar el valor hash obtenido. Finalmente, convertimos la matriz de bytes obtenida en una cadena como código de registro. Este es el proceso de generación de un código de registro. Podemos reutilizar este programa para firmar diferentes nombres de usuario para obtener diferentes códigos de registro correspondientes a ellos.
Finalmente, verificamos el nombre de usuario y el código de registro que acabamos de obtener.
rsa.FromXmlString(PUBLIC_KEY)
Dim f como nuevo Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() como byte = Convert.FromBase64String(SerialNumber)
Dim sha como nuevo Security.Cryptography.SHA1Managed
Dim nombre () As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Resultado = f.VerifySignature(nombre, clave)
Esta vez usamos la clave pública para inicializar el objeto rsa y luego verificar la firma a través de la clase RSAPKCS1SignatureDeformatter. Convertimos a la inversa el código de registro obtenido en una matriz de bytes y realizamos un cálculo hash en el nombre de usuario para obtener el valor hash. Finalmente, verifíquelo a través de VerifySignature.
Como se puede ver en el programa anterior, se requiere una clave privada para generar un código de registro (la clave privada va acompañada de información de clave pública) y se puede generar cualquier número de pares de nombre de usuario y código de registro. Con la clave pública solo podemos verificar pero no generar. Por lo tanto, la clave pública se puede distribuir de forma segura a todos los usuarios para su verificación, pero la clave privada no. Por lo tanto, la clave pública y el algoritmo de verificación se pueden incluir en la versión publicada. Porque incluso si el usuario obtiene la clave pública y el algoritmo de verificación, no se pueden descifrar fácilmente.
Las populares máquinas de registro en Internet hoy en día descifran en gran medida la clave privada del software, logrando así una generación ilimitada de la información de registro requerida. Pero si los usuarios descompilan su producto y modifican el código intermedio, omitirán la lógica de juicio de registro. Este no es un problema que este artículo pueda resolver. Porque incluso si utiliza la tecnología de servicio web para la activación o el registro en línea, aún puede analizar la información del servidor mediante la escucha de la red y simular un servidor falso.
http://www.cnblogs.com/farrio/archive/2006/12/01/579296.html