Clave Publica

16/01/2005 - 00:53 por MalekGNU | Informe spam
Hola a todos..
Tengo un pequeño problema.
TEngo un apalicacion que tiene q trasnmitir cierta informacion en forma
segura. Para lo cual he pensado en utlizar criptografia asimetrica.

Segun tengo entendido el concepto es el siguiente.

App A App B
Cifra informacion Descifra Informacion
Con clave Publica B Con clave Publica A
y clave privada de A y clave privada de B

Pero segun veo en las clases de seguridad de NET.. lo uqe hay es q la
clase crea automaticamente dos claves uns privada y otra publica y lo
que hace es cifrar con la publica de A y descrifrar con a privada de A o
viceversa, pero en ningun momento utlizada las claves del receptor... y
no estoy muy seguro de como eso pueda ayudar a al seguridad.

Agradeceria si alguien me pudiera exponer un ejemeplo de trasnmision de
informacion usando claves publicas... gracias.
 

Leer las respuestas

#1 SqlRanger
16/01/2005 - 23:16 | Informe spam
La cosa es así:

La aplicación AppA tiene un par de claves RSA: PCA, que consta de una clave
pública CPubA y una clave privada CPrivA.
La aplicación AppB tiene un par de claves RSA: PCB, que consta de una clave
pública CPubB y una clave privada CPrivB.

La aplicación AppA conoce CPubB.
La aplicación AppB conoce CPubA.

Eventualmente cualquiera podría conocer CPubB y CPubA, son claves públicas,
lo cual quiere decir que no son un secreto.

Sólo la aplicación AppA conoce CPrivA
Sólo la aplicación AppB conoce CPrivB.

Las claves privadas sí son un secreto. Permitir accesos no autorizados a una
clave privada es una violación de la seguridad.

Para cifrar una información con RSA es necesario conocer la clave pública.
Para descrifrar una información con RSA es necesario conocer la clave
privada.

Cuando AppA manda información a AppB usa CPubB para cifrar la información,
entonces AppB usa CPrivB para descifrarla.
Cuando AppB manda información a AppA usa CPubA para cifrar la información,
entonces AppA usa CPrivA para descifrarla.


Tanto AppA como AppB siempre usan el mismo par de claves, PCA y PCB
respectivamente, no generan sus par de claves cada vez. Ese par de claves lo
tienen almacenado en algún sitio dentro de la máquina donde se ejecutan, por
ejemplo en un archivo xml o en los propios recursos del ensamblado o en el
registro de windows o donde les parezca mejor. Cuando AppA y AppB arrancan,
leen el par de claves desde ese almacén para usarlos cuando sea necesario.
Evidentemente esos pares de claves hay que generarlos una única vez,
mientras que se leen múltiples veces.

La generación y almacenamiento de PCA y CPubA prodría hacerse con un código
como este:

Dim rsa As New RSACryptoServiceProvider(4096)
Dim PCA As String = rsa.ToXmlString(True)
Dim CPubA As String = rsa.ToXmlString(False)
Dim PCAwriter As New IO.StreamWriter("PCA.xml")
PCAwriter.Write(PCA)
PCAwriter.Close()
Dim CPubAwriter As New IO.StreamWriter("CPubA.xml")
CPubAwriter.Write(CPubA)
CPubAwriter.Close()

Este código genera un par de claves RSA de 4096 bits, guarda el par de
claves (pública y privada) en el archivo PCA.xml y la clave pública en el
archivo CPubA.xml. Este archivo CPubA.xml habrá que instalarlo en la máquina
donde se ejecuta AppB para que AppB pueda enviar información cifrada a AppA.

Repito que esto sólo habría que ejecutarlo una única vez y durante la fase
de desarrollo, luego, cuando los programas estén instalados, sólo se leerán
las claves. AppA necesitará leer el par de claves PCA para poder
desencriptar lo que le mande AppB, y necesitará leer CPubB para poder
encriptar lo que le mande a AppB. Por ejemplo, AppA podría cargar PCA con
un código como este (de forma similar podría cargar CPubB)

Dim rsa As New RSACryptoServiceProvider
Dim reader As New IO.StreamReader("PCA.xml")
Dim PCA As String = reader.ReadToEnd()
rsa.FromXmlString(PCA)
reader.Close()

Análogamente AppB podría cargar CPB y CPubA.

Sería recomendable que los objetos RSA fueran estáticos (Shared), de manera
que sólo se cargaran una vez en toda la ejecución de la aplicación.
Cargarlos cada vez que se necesite cifrar o descifrar algo sería bastante
ineficiente.

Debido a que el cifrado y descifrado usando RSA es bastante costoso (tarda
mucho), no se suele cifrar toda la información con este algoritmo, en su
lugar se genera una clave de sesión simétrica, cada vez que se envía
información, con la que se cifra la información y se manda esta clave
simétrica cifrada con RSA. Este sería el proceso cada vez que AppA envía
información a AppB

1) AppA generea una clave AES (Rindjael) de 128 bits, la llamamos CSS (clave
simétrica de sesión).
2) AppA usa CSS para cifrar IO (información original). La información
cifrada se guarda en IC (información cifrada)
3) AppA usa CPubB para cifrar CSS. La CSS cifrada se guarda en CSSC (clave
simétrica de sesión cifrada)
4) AppA concatena CSSC e IC en PC (paquete cifrado). O sea PC = CSSC + IC
5) AppA envía PC a AppB

6) AppB recibe PC
7) AppB descompone PC en CSSC e IC
8) AppB descifra CSSC usando CPrivB y obtiene CSS. Sólo AppB puede descifrar
CSSC puesto que es la única que conoce CPrivB.
9) AppB descifra IC usando CSS y obteniendo IO.

Generalmente, las claves simétricas de sesión no se cifran directamente,
sino que se usa RSAPKCS1KeyExchangeFormatter o RSAOAEPKeyExchangeFormatter.
Análogamente, para descifrarlas se suele usar
RSAPKCS1KeyExchangeDeformatter, RSAOAEPKeyExchangeDeformatter.

Aquí tienes un ejemplo de código bastante bueno (por lo simple y conciso) de
lo que sería cifrar y descifrar (pasos de 1 a 9) usando RSA e intercambio de
claves de sesión simétricas. Está en C#, pero básicamente es lo mismo en
VB.NET:

http://pages.infinit.net/ctech/crypt.cs

este artículo, te cuenta además más cosas, te recomiendo que lo leas:

http://www.c-sharpcorner.com/Code/2...nvelop.asp

Saludos:

Jesús López
MVP

PD: Agradecería saber si esta respuesta te ha servido

"MalekGNU" escribió en el mensaje
news:#3Ji011#
Hola a todos..
Tengo un pequeño problema.
TEngo un apalicacion que tiene q trasnmitir cierta informacion en forma
segura. Para lo cual he pensado en utlizar criptografia asimetrica.

Segun tengo entendido el concepto es el siguiente.

App A App B
Cifra informacion Descifra Informacion
Con clave Publica B Con clave Publica A
y clave privada de A y clave privada de B

Pero segun veo en las clases de seguridad de NET.. lo uqe hay es q la
clase crea automaticamente dos claves uns privada y otra publica y lo
que hace es cifrar con la publica de A y descrifrar con a privada de A o
viceversa, pero en ningun momento utlizada las claves del receptor... y
no estoy muy seguro de como eso pueda ayudar a al seguridad.

Agradeceria si alguien me pudiera exponer un ejemeplo de trasnmision de
informacion usando claves publicas... gracias.

Preguntas similares