2009-04-01 4 views
1

Die einfache Blob, die erzeugt wird unter VerwendungManaged SIMPLEBLOB blob Unmanaged SIMPLEBLOB (RSA -Cryptography)

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

nicht entspricht nicht der aus dem folgenden Code erzeugt überein (beachten Sie, dass client.key die Ebene ist Text Schlüsselwert von hKey gefunden mit 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();    
}   
} 

Warum ist das?

Antwort

0
  1. Der Code in meinem original answer war nicht korrekt. Sie müssen die verschlüsselten Bytes umkehren. Ich habe die Antwort aktualisiert, um dieses Problem zu beheben.

  2. Der obige Code fehlt ein "w.Write((byte) 0x00); // Reserved". Es war kein Fehler, dass meine ursprüngliche Antwort diese Zeile wiederholte.

  3. RSA PKCS # 1-Verschlüsselung (die innerhalb des SIMPLEBLOB verwendet wird) ist nicht deterministisch. I.E. Sie erhalten nicht das gleiche Ergebnis, wenn Sie die gleichen Daten zweimal verschlüsseln.

So zusammenzufassen: Ändern Sie den Code oben:

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

und dann prüfen, ob sie unter Verwendung CryptImportKey() funktioniert die SIMPLEBLOB zu importieren, anstatt zu versuchen, das Ergebnis mit CryptExportKey zu vergleichen ().

+0

Meinen Sie den tatsächlichen SIMPLEBLOB-Inhalt anhängen oder kopieren? Ich kann das machen. –

+0

Ja, bitte fügen Sie den Inhalt des CryptExportKey() - Blobs und des GetRC4SessionBlobFromKey() - Blobs hinzu. (Hex-codiert oder Base64-codiert oder was auch immer). –

+0

Hallo Rasmus, Entschuldigung für die verzögerte Antwort und Danke für Ihre Antwort, ich war für eine Weile weg und schaute auf Ihren Kommentar bis heute. Das Kommentar-Textfeld erlaubt es nicht, mehr als 300 Zeichen einzugeben oder Dateien hochzuladen.Bitte lassen Sie mich wissen, wenn es eine andere Möglichkeit gibt, wie ich Sie erreichen kann (z. B. E-Mail). Danke –

0

ich nicht in der Lage bin meine eigene quesiton zu bearbeiten und deshalb bin Putting ich den Inhalt, den Sie wollte, dass ich hier in dieser Antwort befestigen, habe ich Bildschirm Aufnehmen der Bilder aus dem binären Editor/Direktfenster in Visual Studio unter

CryptExportKey - SIMPLEBLOB

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

keyMaterial Wert im Debug-Fenster

Key Material value in debug window http://img19.imageshack.us/img19/4138/keymaterialdebugwindow.jpg

Schlüsselmaterialwert, der in der Datei mit dem Code-Projekt Artikel

Key Material value that is saved in file using the code project article http://img243.imageshack.us/img243/7936/keymaterialfile.jpg

Sitzungsschlüsselwert von GetRC4SessionBlobFromKey() (Integer-Wert des einzelnen Bytes durch ein Komma getrennt)

Session key value from GetRC4SessionBlobFromKey http://img206.imageshack.us/img206/5620/sessionvaluefromgetrc4s.jpg

gespeichert

Vielen Dank für die Untersuchung und bitte lassen Sie mich wissen, wenn es weitere Informationen gibt, die ich zur Verfügung stellen kann.

+0

Sie sollten sich wirklich auf der Website registrieren. Sie erhalten viele Probleme, wenn Sie ein halbanonymes Profil verwenden. Davon abgesehen habe ich meine Antwort bearbeitet. Ich hoffe, das hilft. –