Partilhar via


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

O arquivo Communicator.cs encapsula os métodos de criptografia e descriptografia no exemplo de uma comunicação segura da CNG (Cryptography Próximo 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

  • Dispose method

  • Método StoreDSKey

  • Método Send_or_Receive_PublicCryptoKey

  • Método SendMessage

  • Método ReceiveMessage

Consulte Exemplo da comunicação segura, criptografia Próximo Generation (CNG)para obter uma visão geral do exemplo e as descrições das versões mencionadas neste tópico.

Membros de classe

O Communicatorclasse contém os seguintes membros privados:

  • CngKey m_DSKey

    Esse membro é Usado por Communicator.StoreDSKeypara armazenar uma chave de assinatura digital.

  • ECDiffieHellmanCng m_ECDH_Cng

    Esse membro é Usado por construtor para armazenar uma instância de ECDiffieHellmanCngclasse. O ReceiveMessagee SendMessagemétodos Usar esse membro para gerar material de chave.

  • string m_ECDH_local_publicKey_XML

    Esse membro é Usado por construtor para armazenar uma representação de sequência XML do local ECDH (Diffie-Hellman de curva elíptica) chave criptográfica Público. Alice e Bob Mallory Usar o Send_or_Receive_PublicCryptoKeymétodo para trocar essa sequência XML.

  • ECDiffieHellmanPublicKey m_ECDH_remote_publicKey

    Esse membro é Usado por Send_or_Receive_PublicCryptoKeymétodo para armazenar um remoto Público ECDH criptográfica chave.

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

  • ChannelManager ChMgr

    Esse membro é usado pela Alice e Bob 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 ECDiffieHellmanCngclasse com um emparelhar de chaves aleatório, usando um Dimensionar de chave de bits 521:

    m_ECDH_Cng = new ECDiffieHellmanCng(521)
    

    O objeto resultante é Limite à Communicatorclasse sistema autônomo um Membro privado. Cada Communicatorobjeto cria uma única instância dessa classe.

    Alice e Bob, crie um Simples Communicatorobjeto e pode cada Acesso um Simples m_ECDH_Cngmembro. Mallory cria dois Communicatorobjetos: um Usar com Ana Maria e Outros Usar com Bob. Portanto, podem acessar os Mallory dois m_ECDH_Cngmembros.

  • A chave Público ECDH sistema autônomo uma sequência XML particular:

    m_ECDH_XmlString = m_ECDH_CryptoKey.ToXmlString(ECKeyXmlFormat.Rfc4050)
    

    O ECDiffieHellmanCng.ToXmlStringmétodo serializa ECDH chave Público, usando o ECKeyXmlFormat.Rfc4050Formatar.

    Nas versões 2 a 5 do exemplo, Ana Maria envia a sequência XML resultante para Roberto no seu Runmétodo usando Declaração código a seguir:

    Alice.Send_or_Receive_PublicCryptoKey("send", MyColor);
    
  • Uma instância Público do ChannelManagerclasse:

    ChMgr = new ChannelManager(mode, ChannelName)
    

    O construtor aceita dois parâmetros a seguir:

    • mode: Uma sequência que indica como criar o pipe nomeado. Este parâmetro pode ser "Servidor" ou "cliente".

    • ChannelName: Uma sequência que fornece um nome para identificar o Nova chamado pipe.

Dispose Method

public void Dispose()

O Communicatorclasse herda o IDisposableda interface e fornece o Disposemétodo imediatamente liberar recursos confidenciais. Isso inclui o m_ECDH_Cng, m_ECDH_local_publicKey_XML, e ChMgrobjetos.

Cada objeto é Criado em em um C# usingDeclaração para garantir que o objeto será liberado imediatamente quando ela sai do escopo.

Método StoreDSKey

public void StoreDSKey(byte[] DSKeyBlob)

Esse método aceita um grande BLOB (objeto binário) que está contido em uma matriz de byte. Ele extrai uma chave de assinatura digital do BLOB de chave, 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);

O StoreDSKeymétodo é chamado pela Alice e Bob Mallory em seus Runmétodos, pelos seguintes versões:

  • Nas versões de 3 a 5, Alice e Bob Mallory usá-lo para armazenar a mesma chave transmitida ao público.

  • Nas versões 4 e 5, Ana Maria e Luís chamar esse método em uma segunda vez em Sobrescrever o m_DSKeymembro com uma chave em particular é transmitida.

Método Send_or_Receive_PublicCryptoKey

Send_or_Receive_PublicCryptoKey(string mode, int color)

Esse método aceita dois parâmetros:

  • mode: Uma sequência 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 Communicator ReceiveMessage and SendMessage methods, except that it sends or receives unencrypted cryptographic keys instead of encrypted messages. ReceiveMessageeSendMessagenão pode ser usado para as chaves criptográficas, pois esses métodos tentaria criptografar e descriptografar as chaves.

Depois que as chaves tenham sido trocadas, versões de 3 a 5 do exemplo validam de assinaturas digital das chaves. A versão 3 usa uma assinatura digital, que é transmitida através de PublicChannelchamado pipe. Essa assinatura é interceptada e Usado por Mallory para assinar a chaves substituídas e as mensagens que ele envia a Ana Maria e Luís. Versão 3 sempre tiver êxito em seu beca de validação de assinatura Usar Alice, Bob e Mallory Usar a mesma chave de assinatura digital.

Dica

As versões 4 e 5 Usar uma assinatura digital particular para assinar mensagens e as chaves e exibir avisos de segurança.Essas versões são fornecidas Apenas para Ana Maria e Luís.Portanto, Mallory não saberá que seu interceptions foram detectados.

Método SendMessage

public bool SendMessage(string plainTextMessage, bool fShowMsg)

Esse método De chamado pela Alice e Bob Mallory dos seus Runmétodos. Ele criptografa digitalmente assina e envia mensagens, seguindo estas etapas:

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

  2. Converte a mensagem para um Unicode Matriz de Bytes usando o código a seguir:

    byte[] UnicodeText = Encoding.Unicode.GetBytes(plainTextMessage);
    
  3. Determina se a mensagem deve ser Enviado em texto não criptografado. Se estiver executando o exemplo a versão 1, SendMessageDevoluções Depois 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ário Aesobjeto:

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

    aes.Key = aesKey;
    
  7. Cria um temporário MemoryStreamse opor ao Isenção uma sequência criptografada.

  8. Cria um temporário CryptoStreamde objeto e o usa para criptografar a mensagem e de escrevê-lo para o MemoryStreamobjeto.

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

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

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

      ECDsaCng ecdsa = new ECDsaCng(m_DSKey)
      
    • Inicializa HashAlgorithma propriedade sistema autônomo um Sha512algoritmo de hash seguro:

      ecdsa.HashAlgorithm = CngAlgorithm.Sha512
      
    • Cria uma Assinando digital, o texto cifrado de Assinando:

      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 os 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 cifrado 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()

Esse método De chamado pela Alice e Bob Mallory dos seus Runmétodos. Recebe e descriptografa mensagens e valida as assinaturas digital.

sistema autônomo mensagens não são passadas sistema autônomo parâmetros para este método. Em vez disso, o ChannelManagerMembro de o Communicatorclasse lê a mensagem usando o código a seguir:

byteBuffer = ChMgr.ReadMessage();

O ReceiveMessagemé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 a descriptografia não é será Necessário. Nesse caso, a mensagem é exibida depois que ele é convertido em uma sequência 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. Primeiro matriz contém o vetor de inicialização, a segunda matriz contém o texto cifrado e o terceiro conjunto contém de assinatura digital do texto cifrado.

  3. Exibe o vetor de inicialização, o texto cifrado e a assinatura sistema autônomo texto ASCII se fVerboseo Sinalizar será definido.

  4. Deriva de material de chave. De ECDiffieHellmanCngmembro, particular m_ECDH_Cng, da Communicatorusos da classe de ECDiffieHellmanCng.DeriveKeyMaterialmétodo derivar Compartilhado material da chave, conforme mostrado pelo seguinte código:

    byte[] aesKey = m_ECDH_Cng.DeriveKeyMaterial(m_ECDH_remote_publicKey);
    
  5. Cria um Aesobjeto instanciando um AesCryptoServiceProviderobjeto:

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

  7. Descriptografa a mensagem usando o System.IO.MemoryStreame System.Security.Cryptography.CryptoStreamobjetos.

  8. Exibe a mensagem descriptografada.

  9. Valida o texto cifrado da mensagem nas versões de 3 a 5 usando a assinatura digital. Versão 3 não exibe avisos de segurança como 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álida. No entanto, apenas Ana Maria e Luís são fornecidos com a versão 4, então, Mallory nunca vê Qualquer avisos. Na versão 5, Assinado invalidamente encerramento de programa chaves criptográficas causa antes de todas as mensagens são transmitidas e Validado.

Consulte também

Conceitos

Exemplo da comunicação segura, criptografia Próximo Generation (CNG)

Código de Fonte de Communicator.cs (exemplo CNG)

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

Etapa - por-Etapa chave e a troca de mensagens (CNG exemplo)

(Exemplo da CNG) de saída esperada