Análise de código da classe Communicator (CNG exemplo)

O arquivo Communicator.cs encapsula os métodos de criptografia e descriptografia para o exemplo de comunicação segura a CNG (Cryptography Next Generation).Ele consiste em apenas uma classe, que é nomeada Communicator. Essa classe contém os membros e os métodos abordados nas seções a seguir:

  • Membros de classe

  • Construtor de classe

  • Método Dispose

  • Método StoreDSKey

  • Método Send_or_Receive_PublicCryptoKey

  • Método SendMessage

  • Método ReceiveMessage

See Exemplo da Secure Communication Cryptography Next Generation (CNG) Para obter uma visão geral sobre o exemplo e as descrições das versões mencionadas neste tópico.

Membros de classe

The Communicator classe contém os seguintes membros particulares:

  • CngKey m_DSKey

    Esse membro é usado por Communicator.StoreDSKey para armazenar uma chave de assinatura digital.

  • ECDiffieHellmanCng m_ECDH_Cng

    Esse membro é usado pelo construtor para armazenar uma instância do ECDiffieHellmanCng classe. The ReceiveMessage e SendMessage métodos usam esse membro para derivar o material da chave.

  • string m_ECDH_local_publicKey_XML

    Esse membro é usado pelo construtor para armazenar uma representação de seqüência de caracteres XML do local ECDH (Diffie-Hellman de curva elíptica) chave criptográfica pública.Alice, Bob e Mallory usam o Send_or_Receive_PublicCryptoKey método para trocar essa string XML.

  • ECDiffieHellmanPublicKey m_ECDH_remote_publicKey

    Esse membro é usado pelo Send_or_Receive_PublicCryptoKey método para armazenar uma chave de criptografia de ECDH pública remota.

A classe Communicator também fornece o seguinte membro público:

  • ChannelManager ChMgr

    Esse membro é usado, Alice, Bob e Mallory para fornecer serviços de pipe nomeado.

Construtor de classe

public Communicator(string mode, string ChannelName)

O construtor cria três objetos a seguir:

  • Uma instância do ECDiffieHellmanCng classe com um emparelhar de chaves aleatório, usando um dimensionar de chave de bits 521:

    m_ECDH_Cng = new ECDiffieHellmanCng(521)
    

    O objeto resultante está limite à Communicator classe sistema autônomo um membro particular. Cada Communicator objeto cria uma única instância dessa classe.

    Alice e Bob crie um único Communicator objeto e pode cada acesso um único m_ECDH_Cng membro. Mallory cria dois Communicator objetos: um para uso com Ana Maria e Outros para uso com Bob.Portanto, Mallory pode acessar duas m_ECDH_Cng membros.

  • A chave pública ECDH sistema autônomo uma seqüência de caracteres XML particular:

    m_ECDH_XmlString = m_ECDH_CryptoKey.ToXmlString(ECKeyXmlFormat.Rfc4050)
    

    The ECDiffieHellmanCng.ToXmlString método serializa ECDH chave pública usando o ECKeyXmlFormat.Rfc4050 formato.

    Nas versões 2 a 5 do exemplo, Ana Maria envia a seqüência de caracteres XML resultante para Roberto no seu Run método usando a demonstrativo de código a seguir:

    Alice.Send_or_Receive_PublicCryptoKey("send", MyColor);
    
  • Uma instância pública do ChannelManager classe:

    ChMgr = new ChannelManager(mode, ChannelName)
    

    O construtor aceita dois parâmetros a seguir:

    • mode: Uma seqüência de caracteres que indica como criar o pipe nomeado. Este parâmetro pode ser "servidor" ou "cliente".

    • ChannelName: Uma seqüência de caracteres que fornece um nome para identificar o novo pipe nomeado.

Método Dispose

public void Dispose()

The Communicator classe herda o IDisposable interface e fornece o Dispose método para liberar recursos confidenciais imediatamente. Isso inclui o m_ECDH_Cng, m_ECDH_local_publicKey_XML, e ChMgr objetos.

Cada objeto é criado dentro de um translation from VPE for Csharp using demonstrativo para garantir que o objeto será lançado imediatamente quando ele sai do escopo.

Método StoreDSKey

public void StoreDSKey(byte[] DSKeyBlob)

Esse método aceita um objeto grande binário (BLOB) contidos em uma matriz de byte.Ele extrai uma chave de assinatura digital da chave de BLOB usando o CngKey.Import(array<Byte[], CngKeyBlobFormat) método. A chave é armazenada, em seguida, pelo seguinte código:

m_DSKey = CngKey.Import(DSKeyBlob,CngKeyBlobFormat.Pkcs8PrivateBlob);

The StoreDSKey método é chamado pelo Alice e Bob Mallory em seus Run métodos, as seguintes versões:

  • Nas versões 3 a 5, Alice e Bob Mallory usam esse método para armazenar a chave do mesma, publicamente transmitida.

  • Nas versões 4 e 5, Alice e Bob chama este método uma segunda vez e substituir o m_DSKey membro com uma chave em particular transmitido.

Método Send_or_Receive_PublicCryptoKey

Send_or_Receive_PublicCryptoKey(string mode, int color)

Esse método aceita dois parâmetros:

  • mode: Uma seqüência de caracteres que indica se deve criar um servidor de pipe para enviar uma chave ou criar um cliente de pipe para receber uma chave. Este parâmetro pode ser "servidor" ou "cliente".

  • color: Um número inteiro que especifica a cor é usada para exibir a chave.

The Send_or_Receive_PublicCryptoKey method is similar to the CommunicatorReceiveMessage and SendMessage methods, except that it sends or receives unencrypted cryptographic keys instead of encrypted messages.ReceiveMessage e SendMessage não pode ser usado para as chaves criptográficas porque esses métodos tentaria criptografar e descriptografar as chaves.

Depois que as chaves trocou, versões 3 a 5 do exemplo validam assinaturas digital as chaves.Versão 3 utiliza uma assinatura digital que é transmitida através de PublicChannel pipe nomeado. Esta assinatura é interceptada e usada pelo Mallory para assinar as chaves substituídas e as mensagens que ele envia para Ana Maria e Luís.Versão 3 sempre terá êxito na validação da assinatura porque Alice e Bob Mallory usam a mesma chave de assinatura digital.

Observação:

Versão s 4 e 5 usar uma assinatura digital particular para assinar mensagens e as chaves e exibir avisos de segurança.Th ESE version s são dado somente Alice e Bob .T herefore , Mallory não sabe que seu interceptions foram detectados.

Método SendMessage

public bool SendMessage(string plainTextMessage, bool fShowMsg)

Este método é chamado pelo Alice e Bob Mallory por seus Run métodos. Ele criptografa digitalmente assina e envia mensagens seguindo estas etapas:

  1. Exibe a mensagem de texto não criptografado se o fShowMsg o valor é true.

  2. Converte a mensagem em uma matriz de byte Unicode usando o código a seguir:

    byte[] UnicodeText = Encoding.Unicode.GetBytes(plainTextMessage);
    
  3. Determina se a mensagem deve ser enviada em texto não criptografado.Se estiver executando o exemplo a versão 1, SendMessage Retorna após enviar a mensagem usando o código a seguir:

    ChMgr.SendMessage(UnicodeText);
    
  4. Deriva de material de chave, chamando o ECDiffieHellmanCng.DeriveKeyMaterial(ECDiffieHellmanPublicKey) método:

    byte[] aesKey = m_ECDH_Cng.DeriveKeyMaterial(m_ECDH_remote_publicKey)
    
  5. Cria um temporária Aes objeto:

    Aes aes = new AesCryptoServiceProvider()
    
  6. Inicializa o Aes objeto com o material da chave que foi derivado na etapa 4:

    aes.Key = aesKey;
    
  7. Cria um temporária MemoryStream objeto Isenção uma seqüência de caracteres criptografada.

  8. Cria um temporária CryptoStream objeto e o usa para criptografar a mensagem e gravá-los para o MemoryStream objeto.

  9. Salva o vetor de inicialização e de texto codificado:

    iv = aes.IV
    ciphertext = ms.ToArray();
    
  10. Assina o texto codificado sistema autônomo a seguir se o exemplo está executando a versão 3, 4 ou 5:

    • Cria um temporária ECDsaCng.ECDsaCng(CngKey) objeto:

      ECDsaCng ecdsa = new ECDsaCng(m_DSKey)
      
    • Inicializa HashAlgorithm a propriedade sistema autônomo um Sha512 algoritmo de hash seguro:

      ecdsa.HashAlgorithm = CngAlgorithm.Sha512
      
    • Cria uma assinatura digital assinando o texto codificado:

      signature = ecdsa.SignData(ciphertext);
      
  11. Prepara a mensagem de saída sistema autônomo segue:

    • Cria uma matriz de três byte para Isenção comprimentos de vetor de inicialização, texto codificado e assinatura da mensagem.

    • Cria quatro System.Collections.Generic.List<T> objetos para manter a matriz de comprimento da etapa anterior, o vetor de inicialização, o texto codificado e a assinatura.

    • Concatena a quatro System.Collections.Generic.List<T> objetos e os converte em uma matriz de byte de mensagem de saída simples:

      byte[] message = list1.ToArray();
      
  12. Envia a mensagem de saída:

    ChMgr.SendMessage(message)
    

Método ReceiveMessage

public string ReceiveMessage()

Este método é chamado pelo Alice e Bob Mallory por seus Run métodos. Ele recebe e descriptografa mensagens e valida suas assinaturas digital.

Mensagens não são passados sistema autônomo parâmetros para este método.Em vez disso, a ChannelManager membro de Communicator classe lê a mensagem usando o código a seguir:

byteBuffer = ChMgr.ReadMessage();

The ReceiveMessage método executa as seguintes etapas:

  1. Determina se a mensagem foi enviada em texto não criptografado.Se estiver executando a versão 1 do exemplo, a mensagem está em texto não criptografado e descriptografia não é necessária.Nesse caso, a mensagem será retornada depois que ele for convertido em uma seqüência de caracteres ASCII usando o código a seguir:

    AsciiMessage = Encoding.Unicode.GetString(byteBuffer);
    
  2. Divide a mensagem em componentes.Nas versões 2 a 5, a mensagem será criptografada.Nesse caso, a mensagem é dividida em três matrizes de byte separado.A primeira matriz contém o vetor de inicialização, o segundo array com o texto cifrado e a terceira matriz contém assinatura digital do texto cifrado.

  3. Exibe o vetor de inicialização, o texto codificado e assinatura sistema autônomo texto ASCII se o fVerbose sinalizar está definido.

  4. Deriva o material de chave.particular ECDiffieHellmanCng membro, m_ECDH_Cng, da Communicator usos de classe a ECDiffieHellmanCng.DeriveKeyMaterial método para derivar compartilhadas material da chave, conforme mostrado pelo seguinte código:

    byte[] aesKey = m_ECDH_Cng.DeriveKeyMaterial(m_ECDH_remote_publicKey);
    
  5. Cria um Aes objeto pela instanciação de um AesCryptoServiceProvider objeto:

    Aes aes = new AesCryptoServiceProvider()
    
  6. Inicializa o Aes objeto com o vetor de material e de inicialização chave derivada de etapas anteriores.

  7. Descriptografa a mensagem usando System.IO.MemoryStream e System.Security.Cryptography.CryptoStream objetos.

  8. Exibe a mensagem descriptografada.

  9. Valida texto codificado da mensagem de em versões 3 a 5 usando a assinatura digital.Versão 3 não exibe avisos de segurança porque Alice e Bob Mallory usam a mesma assinatura.Versão 4 exibe avisos de segurança quando o texto cifrado da mensagem tem uma assinatura inválido.No entanto, apenas Ana Maria e Luís são fornecidos com a versão 4, para que Mallory nunca vê quaisquer avisos.Na versão 5, assinados invalidamente encerramento de programa causa chaves criptográficas antes todas as mensagens são transmitidas e validadas.

Consulte também

Conceitos

Exemplo da Secure Communication Cryptography Next Generation (CNG)

Communicator.cs fonte Code (CNG exemplo)

Visão geral do código fonte (CNG exemplo)

Passo a passo mensagem Exchange (CNG exemplo) e chave

Saída esperada (CNG exemplo)

Date

History

Motivo

Julho de 2008

Tópico adicional.

Aprimoramento de informações.