Gestito blob SIMPLEBLOB non corrisponde SIMPLEBLOB non gestito (RSA -Cryptography)
-
22-08-2019 - |
Domanda
La semplice blob che viene generato utilizzando
CryptExportKey(hKey, hPublicKey, SIMPLEBLOB, 0, lpData, &nSize);
non corrisponde a quello generato dal codice seguente (si noti che client.key è il testo valore della chiave piana di hKey trovato usando http://www.codeproject.com/KB/security/plaintextsessionkey.aspx )
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "Container Name";
cspParams.KeyNumber = (int)KeyNumber.Exchange;
cspParams.ProviderType = 1;
cspParams.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0"; cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsaClient = new RSACryptoServiceProvid(cspParams);
rsaClient.ImportCspBlob(File.ReadAllBytes(@"C:\client.key"));//Generate a SIMPLEBLOB session key
byte[] session = GetRC4SessionBlobFromKey(keyMaterial, rsaClient);//Encrypt a key using public key and write it in a SIMPLEBLOB format
public byte[] GetRC4SessionBlobFromKey(byte[] keyData, RSACryptoServiceProvider publicKey)
{
using(MemoryStream ms = new MemoryStream())
using(BinaryWriter w = new BinaryWriter(ms))
{
w.Write((byte) 0x01); // SIMPLEBLOB
w.Write((byte) 0x02); // Version 2
w.Write((byte) 0x00); // Reserved
w.Write(0x00006801); // ALG_ID = RC4 for the encrypted key.
w.Write(0x0000a400); // CALG_RSA_KEYX
w.Write(publicKey.Encrypt(keyData, false));
w.Flush();
return ms.ToArray();
}
}
Perché?
Soluzione
-
Il codice nel mio risposta originale non era corretta. Bisogna invertire i byte cifrati. Ho aggiornato la risposta per risolvere questo problema.
-
Il codice di cui sopra manca un "
w.Write((byte) 0x00); // Reserved
". Non è stato un errore che la mia risposta originale aveva ripetuto quella linea. -
RSA PKCS # 1 di crittografia (che viene utilizzato all'interno del SIMPLEBLOB) non è deterministico. OSSIA Non sarà possibile ottenere lo stesso risultato mediante la crittografia gli stessi dati due volte.
Quindi, per riassumere: Modificare il codice qui sopra per:
public byte[] GetRC4SessionBlobFromKey(byte[] keyData, RSACryptoServiceProvider publicKey)
{
using(MemoryStream ms = new MemoryStream())
using(BinaryWriter w = new BinaryWriter(ms))
{
w.Write((byte) 0x01); // SIMPLEBLOB
w.Write((byte) 0x02); // Version 2
w.Write((byte) 0x00); // Reserved
w.Write((byte) 0x00); // Reserved
w.Write(0x00006801); // ALG_ID = RC4 for the encrypted key.
w.Write(0x0000a400); // CALG_RSA_KEYX
byte[] encryptedKey = publicKey.Encrypt(key.Key);
byte[] reversedEncryptedKey = new byte[encryptedKey.Length];
for(int i=0;i<encryptedKey.Length;i++){
reversedEncryptedKey[i] = encryptedKey[encryptedKey.Length - 1 - i];
}
w.Write(reversedEncryptedKey); // encrypted key in LSB byte order
w.Flush();
return ms.ToArray();
}
}
e quindi controllare che funziona utilizzando CryptImportKey () per importare la SIMPLEBLOB invece di cercare di confrontare il risultato con CryptExportKey ().
Altri suggerimenti
Non sono in grado di modificare la mia quesiton e quindi mi sto mettendo il contenuto che volevi che allego qui in questa risposta, ho cattura dello schermo delle immagini dalla editor binario / finestra immediata in Visual Studio seguente
CryptExportKey - SIMPLEBLOB
CryptExportKey - SIMPLEBLOB http://img14.imageshack.us/img14/1926/ cryptoexportkeysimplebl.jpg
keymaterial valore nella Finestra Debug
valoreMateriale chiave che viene salvato nel file utilizzando il progetto di articolo codice
Session valore di chiave da GetRC4SessionBlobFromKey () (valore intero di singoli byte separati da una virgola)
La ringrazio molto per la ricerca in questo e per favore fatemi sapere se c'è qualche ulteriori informazioni posso fornire.