Domanda

Ho un'applicazione esistente che è scritto in C++ per Windows.Questa applicazione utilizza Win32 CryptoAPI per generare un TripleDES chiave di sessione per la crittografia/decrittografia dei dati.Stiamo utilizzando il esponente di una mano per esportare la chiave di sessione come un blob, che permette il blob per essere memorizzato da qualche parte, in un formato decodificato.

La domanda è: come possiamo utilizzare questo nel nostro .NET application (C#).Il quadro incapsula/impacchi molto di ciò che la CryptoAPI sta facendo.Parte del problema è il CryptAPI afferma che il TripleDES algoritmo per il Microsoft Enhanced Cryptographic Provider 168 bit (3 chiavi di 56 bit).Tuttavia, l' .NET framework stati loro i tasti sono a 192 bit (3 chiavi a 64 bit).A quanto pare, il 3 byte in eccesso nel .NET framework è per la parità?

Comunque, abbiamo bisogno di leggere la parte di chiave di blob e in qualche modo essere in grado di utilizzare che nel nostro .NET applicazione.Attualmente non stiamo ottenendo i risultati attesi quando si tenta di utilizzare la chiave .NET.La decrittografia è fallendo miseramente.Qualsiasi aiuto sarebbe molto apprezzato.

Aggiornamento:

Ho lavorato sui modi per risolvere questo problema e hanno escogitato una soluzione che posterò nel tempo.Tuttavia, ancora, avrebbe apprezzare qualsiasi feedback dagli altri.

È stato utile?

Soluzione

Intro

Io sono Finalmente in giro a postare la soluzione.Spero che fornisce qualche aiuto anche a qualcun altro che potrebbe fare simili cose.Non c'è molto riferimento a farlo altrove.

Prerequisiti

In ordine per un sacco di questo per dare un senso è necessario leggere attentamente il esponente di una mano, che permette di esportare una chiave di sessione, un blob, un noto struttura del byte).Si può poi fare quello che vogliono con questo flusso di byte, ma contiene la chiave.

Documentazione di MSDN è Confusione

In questo particolare esempio, sto usando il Microsoft Enhanced Cryptographic Provider, con il Triple DES (CALG_3DES algoritmo.La prima cosa che mi ha buttato per un ciclo è stato il fatto che la lunghezza della chiave è quotata a 168 bit, con una lunghezza di blocco di 64 bit.Come può la chiave di lunghezza 168?Tre chiavi di 56 bit?Cosa succede per gli altri byte?

Quindi, con informazioni che ho iniziato a leggere altrove come l'ultimo byte è davvero la parità e per qualsiasi motivo CryptoAPI strisce che fuori.È davvero il caso?Sembra una specie di pazzo che si dovrebbe fare, ma OK.

Il consumo di Chiave .NET

Utilizzando il TripleDESCryptoServiceProvider, Ho notato il commento del docs indicato che:

Questo algoritmo supporta lunghezze di chiave da 128 bit a 192 bit, con incrementi di 64 bit.

Quindi, se CryptoAPI ha una lunghezza della chiave di 168, come ho capito che in .NET, che supporta solo multipli di 64?Pertanto, l' .NET lato delle API tiene conto della parità di account, dove la CryptoAPI non.Come si poteva immaginare... ero confuso.

Quindi, con tutto questo, sto cercando di capire come ricostruire la chiave .NET lato con le giuste informazioni di parità.Fattibile, ma non è molto divertente...facciamo solo lasciare che.Una volta ho avuto tutto questo posto, tutto è finito in mancanza di CAPITALE F.

Ancora con me?Bene, perché ho appena caduto il mio cavallo di nuovo.

Lampadine e Fuochi d'artificio

Basso ed ecco, come sto raschiando MSDN per ogni ultimo bit di informazioni che trovo in conflitto pezzo in Win32 CryptExportKey funzione.Basso ed ecco, trovo che questo pezzo di invaluble informazioni:

Per qualsiasi chiave DES permutazioni che utilizzano un PLAINTEXTKEYBLOB, solo la piena dimensione della chiave, incluso il bit di parità, possono essere esportati.La chiave seguenti formati sono supportati.

Algoritmo Supportato dimensione della chiave

CALG_DES 64 bit

CALG_3DES_112 128 bit

CALG_3DES 192 bit

In modo da esportare una chiave, che è un multiplo di 64 bit!Woohoo!Ora per correggere il codice sul .NET lato.

.NET Codice di Importazione Tweak

L'ordine dei byte è importante tenere a mente durante l'importazione di un flusso di byte che contiene una chiave che è stato esportato come un blob da CryptoAPI.Le due API non utilizzare lo stesso ordine di byte, quindi, come @nic-forte indica, invertendo la matrice di byte è essenziale prima di provare a utilizzare la chiave.Oltre a questo, le cose funzionano come previsto.Semplicemente risolto:

Array.Reverse( keyByteArray );

Conclusione

Spero che questo aiuta qualcuno là fuori.Ho passato troppo tempo a cercare di rintracciare.Lasciare commenti se avete ulteriori domande e posso tentare di contribuire a colmare le eventuali dettagli.

Felice Crypto!

Altri suggerimenti

Ok, dimenticate l'ultima risposta che non posso leggere :) Si lavora con 3Des chiavi non le chiavi RSA.

Ho lavorato su un sacco di codice per condividere le chiavi tra .NET, CryptoAPI e openssl.Trovato un sacco di buon esempio qui il codice per fare la chiave conversioni:

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

C'è qualche 3des roba in alcuni di questi esempi, ma era legata alla openssl -> .NET iirc.

Anche io ho appena guardato indietro sopra la chiave RSA codice e una cosa che ho notato sto facendo utilizzo di Array.Reverse() su tutte le parti chiave della chiave RSA (D,DP,DQ,InverseQ,Modulo,P,Q) credo che per la conversione endian.Ricordo che non è ovvio, quando prima di affrontare il problema.

Spero che alcuni dei che aiuta.Buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top