blob SIMPLEBLOB géré ne correspond pas à Unmanaged SIMPLEBLOB (RSA -Cryptography)

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

  •  22-08-2019
  •  | 
  •  

Question

Le blob simple qui est généré en utilisant

CryptExportKey(hKey, hPublicKey, SIMPLEBLOB, 0, lpData, &nSize);

ne correspond pas à celui généré par le code suivant (notez que client.key est la valeur de texte brut de hKey trouvé à l'aide 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();              
}        
}

Pourquoi?

Était-ce utile?

La solution

  1. Le code dans mon réponse originale n'a pas été correcte. Vous devez inverser les octets chiffrés. Je l'ai mis à jour la réponse pour résoudre ce problème.

  2. Le code ci-dessus manque un "w.Write((byte) 0x00); // Reserved". Ce ne fut pas une erreur que ma réponse initiale avait cette ligne répétée.

  3. RSA PKCS # 1 chiffrement (qui est utilisé à l'intérieur du SIMPLEBLOB) n'est pas déterministe. C'EST À DIRE. Vous n'obtiendrez le même résultat en chiffrant les mêmes données deux fois.

Donc, pour résumer: Modifiez le code ci-dessus:

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();              
  }        
}

et vérifiez que cela fonctionne à l'aide CryptImportKey () pour importer le SIMPLEBLOB au lieu d'essayer de comparer le résultat avec CryptExportKey ().

Autres conseils

Je ne peux pas modifier mon propre quesiton et donc je mets le contenu que vous me vouliez Accrocher ici dans cette réponse, je capture d'écran des images de l'éditeur binaire / fenêtre immédiate en studio visuel ci-dessous

CryptExportKey - SIMPLEBLOB

CryptExportKey - SIMPLEBLOB http://img14.imageshack.us/img14/1926/ cryptoexportkeysimplebl.jpg

KeyMaterial valeur dans la fenêtre de débogage

valeur matériau clé fenêtre de débogage http://img19.imageshack.us/img19 /4138/keymaterialdebugwindow.jpg

Clé valeur matériel qui est enregistré dans le fichier en utilisant l'article du projet de code

valeur Matériel clé qui est enregistré dans le fichier en utilisant le projet de code article http: // img243.imageshack.us/img243/7936/keymaterialfile.jpg

Session valeur de clé de GetRC4SessionBlobFromKey () (valeur de nombre entier d'octets individuels séparés par une virgule)

SESSION.WAIT_TIMEOUT clé GetRC4SessionBlobFromKey http://img206.imageshack.us/img206/ 5620 / sessionvaluefromgetrc4s.jpg

Merci beaucoup pour regarder dans cela et s'il vous plaît laissez-moi savoir s'il y a des informations plus loin, je peux fournir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top