Gestionado burbuja SIMPLEBLOB no coincide SIMPLEBLOB no administrados (RSA -Cryptography)

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

  •  22-08-2019
  •  | 
  •  

Pregunta

El simple blob que se genera utilizando

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

no coincide con la generada a partir de la siguiente código (tenga en cuenta que client.key es el valor de la clave de texto sin formato de hKey encontrar 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();              
}        
}

¿Por qué?

¿Fue útil?

Solución

  1. El código en mi respuesta original no era correcta. Usted tiene que invertir los bytes cifrados. He actualizado la respuesta a solucionar ese problema.

  2. El código anterior no se encuentra un "w.Write((byte) 0x00); // Reserved". No fue un error que mi respuesta original tenía esa línea repite.

  3. RSA PKCS # 1 de cifrado (que se utiliza dentro de la SIMPLEBLOB) no es determinista. ES DECIR. Usted no recibirá el mismo resultado mediante la encriptación de los mismos datos dos veces.

Para resumir: Cambiar el código de arriba a:

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

y compruebe que funciona mediante el uso de CryptImportKey () para importar el SIMPLEBLOB en lugar de tratar de comparar el resultado con CryptExportKey ().

Otros consejos

No puedo editar mi propio quesiton y por lo tanto estoy poniendo el contenido que querías que adjunto aquí en esta respuesta, tengo captura de pantalla de las imágenes del editor binario / ventana inmediata en el estudio visual a continuación

CryptExportKey - SIMPLEBLOB

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

KeyMaterial valor en la ventana de depuración

valor material clave en la ventana de depuración http://img19.imageshack.us/img19 /4138/keymaterialdebugwindow.jpg

valor

Clave material que se guarda en el archivo con el artículo del proyecto de código

Clave valor material que se guarda en el archivo usando el código de proyecto del artículo http: // img243.imageshack.us/img243/7936/keymaterialfile.jpg

Sesión valor de clave de GetRC4SessionBlobFromKey () (valor entero de bytes individuales separados por una coma)

valor de la clave de sesión de GetRC4SessionBlobFromKey http://img206.imageshack.us/img206/ 5620 / sessionvaluefromgetrc4s.jpg

Muchas gracias por mirar en esto y por favor hágamelo saber si hay alguna información adicional que puede proporcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top