¿Puedo usar el PublicKey asambleas para descifrar una cadena cifrada con la correspondiente PrivateKey?

StackOverflow https://stackoverflow.com/questions/1847357

Pregunta

La firma de un ensamblaje en .NET consiste en un par de claves pública / privada. Por lo que yo puedo decir por lo que he leído .NET utiliza el algoritmo RSA y la clave privada para firmar el ensamblado, comprobando con la clave pública incrustado.

Yo sé cómo recuperar la clave pública (Assembly.PublicKey). Me preguntaba, si esa clave podría ser usada para descifrar una cadena corta que contiene algunos datos cifrados con la clave privada.

Los documentos que he leído hasta ahora ( por ejemplo ) parecen dar a entender que sólo a la inversa, es posible: eso tendría que usar la clave pública para cifrar y la clave privada para descifrar - pero realmente no quieren incluir eso en la Asamblea, I.

supongo que estaría bien, si acabo de firmar la cadena. Pero, ¿cómo?

Estoy un poco en una pérdida de cómo empezar esto. ¿Alguien tiene un fragmento de código?

Además, el cifrado / firma de la pequeña cadena idealmente suceda en PHP, ya que quiero sacar datos que a un servidor web y todo lo que tenemos hasta ahora es su PHP genérico / MySQL alojada sitio web.

Caso de Uso : Estoy tratando de llegar a un sistema de licencias ligero para un software que vamos a liberar a los probadores beta. Puesto que el software será probablemente software gratuito, todo lo que realmente queremos lograr es

  1. saber quién tiene el software instalado (correo electrónico)
  2. dejar que el software expiran después de un período determinado, después de lo cual el usuario tendrá que obtener una nueva licencia
    • esto es tan fácil como rellenar un formulario y la espera de un correo electrónico automático con la llave para llegar
    • estamos tratando de reducir el likelyhood de versiones antiguas que vuelven a morder nuestra reputación / perseguirnos

Ser capaz de cifrar una tupla (fecha de caducidad, huella digital) y descifrar que en el arranque haría un módulo de licencias fácil: La primera vez que se inicia la aplicación, se le pide al usuario para la dirección de correo electrónico, nombre, organización. Esta información se ha publicado en el servidor web junto con una huella digital MD5 de algo de información del sistema (nic, nombre del equipo, el conjunto mayor y la versión secundaria). El servidor web respuestas por correo electrónico (cheques de validez de dirección de correo electrónico) con una versión encriptada de la tupla (fecha de caducidad, huella digital), que luego se guarda en disco. En el inicio, esto puede ser descifrado y la comparación con la fecha actual y la huella digital regenerada.

editar : OK, así que no tengo todas las respuestas a mi pregunta todavía. Pero parece que .NET no hará que sea fácil de utilizar la clave privada para el cifrado (si eso es posible, las respuestas realmente no están de acuerdo en eso).

La ruta voy a tomar es la siguiente (basado en mi caso de uso):

  • Voy a utilizar la clave privada para firmar la licencia.
  • Voy a utilizar la clave pública para verificar la licencia fue firmado por la clave privada
  • Voy a publicar otra pregunta dirigida a desarrolladores de PHP sobre el uso de las teclas de .NET (producido por sn.exe) para firmar un texto
  • No estoy realmente preocupado por el usuario vea la licencia, ya que es un hash de todos modos y calcula a partir de las cosas que noté sabe. Todo lo que quiero es que sea demasiado duro para ser la pena cualquier molestia para su arquitecto edificio típico para copiar el software sin conocerme (recuerda, el software será gratuito - todo lo que quiero es un rastro de papel de quien ha instalado ... )

Muchas gracias por sus respuestas.

¿Fue útil?

Solución

No en .NET.

En muchas algoritmo tradicional de cifrado de clave pública, como RSA, puede cifrar y descifrar en ambos sentidos, por lo general de una manera se llama "cifrado" y la otra "firma", a pesar de que en realidad se termina con una versión cifrada de algo en ambos sentidos.

Sin embargo, en la implementación .NET RSA se ha paralizado, y cuando la firma sólo producirá resúmenes de la entrada, no la información procesada completa.

Parece que hay cierto desacuerdo sobre lo que puede y no se puede hacer con RSA, por lo que me permite modificar mi respuesta para ser más específico.

Estoy hablando de RSA matemáticas, no una implementación particular de RSA.

RSA matemáticas le permite codificar información de cualquiera de las dos teclas (privadas o públicas), y los datos codificados sólo puede ser decodificada con la otra de las dos llaves.

Por lo general, se codifica con una clave pública, la encriptación de la información, y decodificarlo con la clave privada, el descifrado de la información. O bien, se toma un hash de la información, codificar con la clave privada, firma el hash, y descifrar el hash con la clave pública, con el fin de comparar y verificar la firma.

Las implementaciones típicas no permite a uno hacer completa la codificación de los datos del sector privado al público, sólo por el hash de los datos, pero las matemáticas detrás de RSA permite plenamente este .

Otros consejos

No se puede descifrar utilizando la clave pública. De esta manera, todo el punto de "público" se perdería.

(Es posible, sin embargo, ser capaz de firmar algo utilizando la clave privada, a continuación, comprobar la firma usando la clave pública que es lo que el marco utiliza las teclas de -. La Asamblea está firmado, y la clave pública se utiliza para verificar la firma.)

Esto se puede hacer usando SignedXml http://msdn.microsoft.com /en-us/library/ms229745.aspx. En un nivel inferior se puede prob uso RSAPKCS1SignatureDeformatter y RSAPKCS1SignatureFormatter. Estos funcionan mediante el cifrado de un hash de los datos a continuación, comparar los datos con el hash (descifrado) el otro extremo. Creo que el hash se utiliza porque el cifrado de clave privada sólo puede manejar datos pequeños. No estoy seguro sobre la reutilización de la clave pública de montaje, si está causando problemas sólo tiene que utilizar un par de claves por separado.

Una palabra de advertencia, echa un vistazo a esto como estas clases puede dar lugar a 20 segundos colgar ups! http://www.pcreview.co.uk/forums/thread-3428177. php

Este enfoque es vulnerable al código de verificación de firmas pudieran ser alteradas usando Reflexil pero eso es otra cuestión.

escribí lo siguiente, pero releyendo Creo que ya tienes esto: Usted no está realmente tratando de cifrar u ocultar los datos del usuario, que desea que dejen de crear o alterar la licencia. Tienes razón en que un algoritmo de cifrado de clave pública y privada se puede utilizar para esto. Esto se conoce como Acceso utilizando una clave privada (generación de la licencia del lado del servidor). Y la verificación de la firma usando una clave pública (licencia de comprobación en la aplicación). Menciono esta terminología, ya que va a ayudar con la investigación.

En las llaves RSA públicas se utilizan para el cifrado, claves privadas se utilizan para el descifrado. No se puede utilizar una clave pública para descifrar nada ...

En RSA, la única diferencia real entre una clave pública y una clave privada es la que uno se mantiene en secreto.

Así que usted puede utilizar una clave pública como la clave de cifrado y descifrar con la clave privada, o utilizar la clave privada como la clave de cifrado y descifrar con la clave pública.

El cifrado con la clave privada se utiliza para las firmas digitales (cualquiera puede descifrar con la clave pública).

Pero como @Lasse V. Karlsen señaló, .Net puede hacer que sea más difícil de lo que debería ser ...

Creo que ambas direcciones son posibles con cifrar y descifrar pública con privada y cifrar con la clave privada. La segunda es la forma en cómo funciona la firma digital de.

¡Atención! Esta respuesta es incorrecta, pero voy a dejarlo aquí ninguno de los de menos porque la serie de comentarios adjuntos son, creo que de suficiente interés para otras personas para evitar la respuesta alrededor. Bien que me hace ver como un idiota, pero eso es nada nuevo para mí;.) Voto como desee

Una clave pública se puede utilizar para: -

  • Cifrar algo que sólo puede ser descifrado con la clave privada
  • Autenticar algo firmado con la clave privada

No se puede utilizar para descifrar algo que encriptado por una clave privada. Su por esta razón que el sistema de clave pública / privada es referido como un sistema asimétrico.

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