Gestito blob SIMPLEBLOB non corrisponde SIMPLEBLOB non gestito (RSA -Cryptography)

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

  •  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é?

È stato utile?

Soluzione

  1. Il codice nel mio risposta originale non era corretta. Bisogna invertire i byte cifrati. Ho aggiornato la risposta per risolvere questo problema.

  2. 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.

  3. 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

valore Materiale chiave nella finestra di debug http://img19.imageshack.us/img19 /4138/keymaterialdebugwindow.jpg

valore

Materiale chiave che viene salvato nel file utilizzando il progetto di articolo codice

chiave valore materiale che viene salvato nel file utilizzando il codice del progetto articolo http: // img243.imageshack.us/img243/7936/keymaterialfile.jpg

Session valore di chiave da GetRC4SessionBlobFromKey () (valore intero di singoli byte separati da una virgola)

Sessione valore della chiave da GetRC4SessionBlobFromKey http://img206.imageshack.us/img206/ 5620 / sessionvaluefromgetrc4s.jpg

La ringrazio molto per la ricerca in questo e per favore fatemi sapere se c'è qualche ulteriori informazioni posso fornire.

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