¿Cómo puedo utilizar una clave de blob generados a partir de CryptoAPI de Win32 en mi .NETO de la aplicación?

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

Pregunta

Tengo una aplicación existente que está escrito en C++ para Windows.Esta aplicación utiliza la CryptoAPI de Win32 para generar un TripleDES clave de sesión para cifrar/descifrar los datos.Estamos usando el exponente de un truco para exportar la clave de sesión como un blob, que permite que el blob para ser almacenado en algún lugar de descifrado formato.

La pregunta es ¿cómo podemos usar esto en nuestro .RED de aplicación (C#).El marco encapsula/envolturas mucho de lo que la CryptoAPI está haciendo.Parte del problema es la CryptAPI indica que el algoritmo TripleDES para la Microsoft Enhanced Cryptographic Provider es de 168 bits (3 claves de 56 bits).Sin embargo, la .NET framework estados de sus teclas son de 192 bits (3 claves de 64 bits).Al parecer, el 3 bytes adicionales en el .NET framework es para la paridad?

De todos modos, tenemos que leer la parte clave de la nota y de alguna manera ser capaz de utilizar que en la nuestra .NETO de la aplicación.Actualmente no estamos obteniendo los resultados esperados cuando se intenta utilizar la clave .NET.El descifrado es fallando miserablemente.Cualquier ayuda sería muy apreciada.

Actualización:

He estado trabajando en maneras de resolver esto y he llegado a una solución que voy a publicar en el tiempo.Sin embargo, todavía agradecería cualquier retroalimentación de los demás.

¿Fue útil?

Solución

Intro

Por fin estoy consiguiendo en torno a la publicación de la solución.Espero que les de un poco de ayuda para otras personas por ahí que podría estar haciendo similar tipo de cosas.Realmente no hay mucho de referencia para hacer esto en otros lugares.

Requisitos previos

En orden para una gran cantidad de este para hacer sentido, es necesario leer el exponente de un truco, que permite exportar una clave de sesión a un blob (un conocido de bytes de la estructura).Entonces, uno puede hacer lo que quiera con esta secuencia de bytes, pero se mantiene la importancia de la clave.

Documentación de MSDN es Confuso

En este ejemplo en particular, estoy usando el Microsoft Enhanced Cryptographic Provider, con la Triple DES (CALG_3DES) algoritmo.La primera cosa que me tiró un bucle fue el hecho de que la longitud de la clave aparece en el 168 bits, con una longitud de bloque de 64 bits.¿Cómo puede la longitud de la clave de ser 168?Tres claves de 56 bits?¿Qué sucede con el otro byte?

Por lo que con la información que he empezado a leer en otros lugares cómo el último byte es realmente la paridad y por la razón que sea CryptoAPI tiras que fuera.Es que realmente el caso?Parece una locura que iban a hacer eso, pero bueno.

El consumo de Clave .NET

El uso de la TripleDESCryptoServiceProvider, Me di cuenta de las observaciones que figuran en los documentos se indica que:

Este algoritmo admite longitudes de clave de 128 bits a 192 bits, en incrementos de 64 bits.

Así que si CryptoAPI ha longitudes de clave de 168, ¿cómo voy a conseguir que en .NET, que únicamente admite múltiplos de 64?Por lo tanto, el .NET lado de la API toma de paridad en cuenta, donde la CryptoAPI no.Como uno podría imaginar... confundido era yo.

Así que con todo esto, estoy tratando de averiguar cómo reconstruir la clave en la .NET lado con la adecuada información de paridad.Factible, pero no es muy divertido...vamos a dejarlo en eso.Una vez que tengo todo este en su lugar, todo terminó fallando con un CAPITAL F.

Aún así conmigo?Bueno, ya que sólo se cayó de mi caballo de nuevo.

Bombillas de luz y Fuegos artificiales

Bajo y he aquí, como estoy raspado de MSDN para cada bit de información puedo encontrar un conflicto pieza en Win32 CryptExportKey la función.Baja y he aquí que me encuentro con este pedazo de invaluble información:

Para cualquiera de la clave DES permutaciones que el uso de un PLAINTEXTKEYBLOB, sólo el pleno del tamaño de la clave, incluyendo el bit de paridad, se puede exportar.Los siguientes tamaños de clave son compatibles.

Algoritmo Admite el tamaño de la clave

CALG_DES de 64 bits

CALG_3DES_112 de 128 bits

CALG_3DES 192 bits

Por lo que hace exportar una clave que es un múltiplo de 64 bits!Woohoo!Ahora a corregir el código en el .NET lado.

.Importación NETA de Código Tweak

El orden de los bytes es importante tener en cuenta que al importar una secuencia de bytes que contiene una clave que se ha exportado como un blob de la CryptoAPI.Los dos de la API de no utilizar el mismo orden de byte, por lo tanto, como @nic-fuerte indica, la inversión de la matriz de bytes es esencial antes de tratar de usar la clave.Aparte de eso, las cosas funcionan como se esperaba.Simplemente resuelto:

Array.Reverse( keyByteArray );

Conclusión

Espero que esto ayude a alguien por ahí.Pasé mucho tiempo tratando de hacer un seguimiento de esto.Dejar cualquier comentario si usted tiene más preguntas y que puedo intento ayudar a llenar en todos los detalles.

Feliz Crypto!

Otros consejos

Ok, olviden la última respuesta que yo no puedo leer :) está trabajando con 3Des llaves no las claves RSA.

He trabajado en un montón de código para compartir claves entre .NET, CryptoAPI y openssl.Se encontró una gran cantidad de buen ejemplo aquí el código para hacer la clave de conversiones:

http://www.jensign.com/JavaScience/cryptoutils/index.html

Hay algunos 3des cosas en algunos de esos ejemplos, pero estaba relacionado con openssl -> .NET iirc.

También he mirado hacia atrás encima de la clave RSA de código y una cosa, veo que estoy haciendo es usar la Matriz.Reverse() en todas las partes clave de la clave RSA (D,DP,DQ,InverseQ,Módulo,P,Q), supongo que para convertir endian.Recuerdo que de no ser obvio cuando los primeros en abordar el problema.

Esperanza de que algunos de los que ayuda.La buena suerte.

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