Share via


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

Esta visão geral fornece uma descrição de alto nível das interações entre os Diversos elementos de código no exemplo de uma comunicação segura a CNG (criptografia Próximo Generation).

Ele aborda os seguintes aspectos do exemplo:

  • Aplicativos

  • Files

  • Classes

  • Versões de segurança

  • Visão geral da sessão

  • Chaves de criptografia (versões 2 a 5)

  • Assinaturas digital trocadas pelo canal público (versão 3)

  • Assinaturas digital trocadas pelo canal particular (versão 4)

  • Finalização da sessão (versão 5)

  • Observações Adicional

  • Limitações do exemplo CNG

Aplicativos

O exemplo consiste em três aplicativos de console separado, Alice de Bob, e Mallory. Cada aplicativo é criado sistema autônomo um projeto do Visual Studio separado e consiste em um arquivo principal e três arquivos compartilhados. A tabela a seguir mostra os aplicativos e seus arquivos.

Nome do aplicativo (projeto)

Files

Alice

  • Alice.cs (arquivo principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Bob

  • Bob.cs (arquivo principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Mallory

  • Mallory.cs (arquivo principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Files

As tabelas nas seções a seguir resumem as classes e métodos que são usados por cada aplicativo, na ordem em que aparecem no código-fonte.

Alice.cs Bob.cs e Mallory.cs

Classe, método, ou

Nome de Variável global

Uso

CNG_SecureCommunicationExample

Classe de Projectwide parcial.

MyColor

OtherColor

fDisplaySendMessage

Variáveis global.

Main

Ponto de entrada de programa para cada aplicativo. Esse método lida com o seguinte:

  • Quando chamado por Ana Maria, carrega automaticamente Bob.exe e Mallory.exe.

  • Cria um loop de Processando.

  • Chama o InitConsolemétodo para Conjunto o Dimensionar do console, posição e título.

  • Chama o método Run.

Run

Método chama o InitializeOptionsmétodo e criará o cenário de segurança selecionado.

Utilities.cs

Classe, método, ou

Nome de Variável global

Uso

CNG_SecureCommunicationExample

Todo o projeto classe parcial.

Version

fVerbose

fMallory

Variáveis global.

Autoloader

Método Alice liga para carregar os aplicativos Bob.exe e Mallory.exe.

InitConsole

Método que manipula o menu de Interface do usuário e mensagens de nível de aplicativo.

SplashScreen

Método que fornece os títulos de janelas do console.

ReadALine

Método de utilitário que lê uma linha inserido pelo usuário a partir do console.

ReadAChar

Método de utilitário que exibe uma pergunta e solicita ao usuário uma resposta Sim ou não.

InitializeOptions

Método que exibe opções e solicita ao usuário uma seleção. Esse método também define o Version, fVerbose, e fMallorysinalizadores global.

Display(string s)

Primeiro de dois Displaymétodos. Esse método transmite a sequência e o MyColorvariável para a segunda Displaymétodo.

Display(string DisplayString, int color)

Segundo de dois Displaymétodos. Este método envolve Console.WriteLineinstruções e fornece suporte de cor para linhas de saída.

Para obter mais Informação sobre essas classes, métodos e variáveis, consulte Análise de código de que as classes de utilitário (CNG exemplo).

ChannelManager.cs

Classe, método, ou

Nome de Variável global

Uso

CNG_SecureCommunicationExample

Todo o projeto classe parcial.

AppControl

Método que fornece um controle interno do aplicativo e sincroniza os aplicativos de três console.

Ana Maria utiliza esse método para enviar as opções do programa (Versione de fVerbosesinalizadores) para Bob e Mallory

AppControlnão é um sistema de mensagens método. Seu conteúdo não é é criptografado ou assinado. Não chamar o Communicatorclasse.

SendChannelName

ReceiveChannelName

Métodos são usados para alternar entre o PublicChannelchamado pipe para o AliceAndBobChannele AliceAndBobChannel1denominado pipes. Esses métodos permitem que a violação de segurança deliberado descrita a Visão geral sobre o exemplo a CNG .

ChannelManager

Classe que fornece a estrutura de comunicação entre processos do aplicativo.

Para obter mais Informação sobre essas classes e métodos, consulte Análise de código da classe ChannelManager (exemplo CNG).

Communicator.cs

Classe, método, ou

Nome de Variável global

Uso

CNG_SecureCommunicationExample

Todo o projeto classe parcial.

Communicator

Classe que encapsula todas as funções de criptografia. Essa classe processa todas as mensagens entre Mallory de Alice e Bob. It does not process messages sent by the ChannelManager AppControl method.

m_DSKey

m_ECDH_Cng

m_ECDH_local_publicKey_XML

m_ECDH_remote_publicKey

ChMgr

Variáveis de classe.

Communicator

Método constrói um Communicatorobjeto.

Dispose

Método que lança mantidas em particular os recursos.

StoreDSKey

Método que armazena uma chave de assinatura digital.

Send_or_Receive_PublicCryptoKey

Método que fornece suporte de troca de chaves.

iv

ciphertext

signature

Variáveis de classe privada usadas para criptografar mensagens de texto não criptografado. Essas variáveis são declaradas perto de ReceiveMessage()método.

ReceiveMessage

Método que recebe mensagens criptografadas, dependendo da versão de segurança ou de texto não criptografado.

SendMessage

Método que aceite uma mensagem de texto não criptografado e envia-o para fora em texto sem formatação ou em Formatar criptografado, dependendo da versão de segurança.

Para obter mais Informação sobre essas classes, métodos e variáveis, consulte Análise de código da classe Communicator (CNG exemplo).

Classes

Cada projeto contém três classes:

  • public partial class CNG_SecureCommunicationExample

    Essa classe estende-se a Todas arquivos de projeto quatro incluídos nos aplicativos Mallory de Alice e Bob. Depois a compilação, CNG_SecureCommunicationExampleclasse contém todas as classes, variáveis e métodos para os arquivos de projeto de quatro. Para obter mais Informação sobre classes parciais, consulte Parcial classes e métodos (guia de programação de C#).

  • internal sealed class ChannelManager

    Essa classe fornece suporte a pipe nomeado. Cada projeto cria várias ChannelManagerinstâncias em momentos Diferente durante a execução. do programa adicionais dessa classe podem ser encontrados em Análise de código da classe ChannelManager (exemplo CNG).

  • internal sealed class Communicator

    Essa classe fornece criptografia e descriptografia de suporte. Cada projeto cria várias Communicatorinstâncias em momentos Diferente durante a execução. do programa adicionais dessa classe podem ser encontrados em Análise de código da classe Communicator (CNG exemplo).

Versões de segurança

O código-fonte oferece suporte para o cenário de segurança apresentado a Visão geral sobre o exemplo a CNG . Ele Implementos as seguintes versões de cinco, que representa os cinco níveis de segurança de instantânea (IM) ferramenta de sistema de mensagens:

  • Versão 1: Usa mensagens de texto não criptografado e pipes nomeados.

  • Versão 2: Usos de mensagens criptografadas.

  • Versão 3: Mensagens de usos criptografadas e assinaturas digital.

  • Versão 4: Usa as mensagens criptografadas e uma assinatura digital particular.

  • Versão 5: Encerra o aplicativo quando são encontrados erros de segurança.

Dica

O restante deste tópico se refere a essas versões por número.Além disso, dependendo do contexto, os nomes "Alice", "Bob" e "Mallory" podem se referir às três pessoas envolvidas no cenário de exemplo ou para os três aplicativos do Visual Studio.

Visão geral da sessão

Ana Maria, Bob e Mallory têm um Mainmétodo e um Runmétodo.

O Mainmétodo sincroniza os aplicativos e executa as seguintes funções:

  • Exibe uma tela de inicialização.

  • Pergunta ao usuário a escolher as opções de sessão (Alice Apenas).

  • Envia as opções de sessão para Bob e Mallory (Alice).

  • Recebe as opções de sessão de Alice (Paulo e Mallory Apenas).

  • Chama o Runmétodo para realizar a sessão de segurança solicitado.

RunMétodo executa cenários de segurança.

  • Cada sessão ilustra Um as versões listadas na seção anterior.

  • Uma sessão começa quando Alice e Bob Mallory insere seus Runmétodos e termina quando retornarem a suas Mainmétodos.

  • Alice e Bob Mallory sempre executem a mesma versão durante uma sessão.

  • Alice inicia todas as transações que ocorrem durante uma sessão. Mallory responde para Alice e inicia as transações de Bob. Bob apenas responde.

O código-fonte para Alice e Bob é muito semelhante. A principal diferença é que Alice inicia cada sessão e atua sistema autônomo um servidor de pipe e Bob atua sistema autônomo um cliente do pipe. Código do Mallory é mais complexo, porque ele gerencia dois pipes separados: uma delas com Ana Maria e outra com Bob.

Método principal

Alice liga para o InitializeOptionsmétodo no início de seus de Mainmétodo e recebe as opções de sessão ( Version, fVerbose, fMallory) do usuário. Ela usa o seu AppControlmétodo para enviar as opções para Bob e Mallory, quem recebê-las por meio de seus AppControlmétodos. Se o usuário decidir fechar o aplicativo Digitação a letra "x", AppControlmétodo envia a sequência "saída" em vez das opções de sessão para Bob e Mallory. de Alice

Depois que os três aplicativos recebeu as opções de sessão, chame o Runmétodos.

Executar método

Alice e Bob Mallory executar a sessão solicitada, executando as seguintes etapas:

  1. Alice liga para o SendChannelNamemétodo, que usa um canal de chamada de PublicChannel. Ele envia um Nova nome de canal de Bob ( AliceAndBobChannel).

  2. Se o fMallorySinalizar estiver definido como true, que escutava a Mallory PublicChannele intercepta o Nova nome de canal ( AliceAndBobChannel) de Alice. Em seguida, ele envia Bob um nome de Diferente canal ( AliceAndBobChannel1).

  3. Ana Maria e Luís criam Communicatorobjetos nomeados Depois propriamente ditas. Esses objetos são criados dentro do C# usingdeclarações e são descartados no participante do Runmétodo.

    Alice é inicializada sistema autônomo um servidor de pipe:

    using (Communicator Alice = new Communicator("server", NewChannelName))
    

    Bob é inicializado sistema autônomo um cliente de pipe:

    using (Communicator Bob = new Communicator("client", NewChannelName))
    

    Mallory cria dois Communicatorobjetos, MalloryAlicee MalloryBob. Mallory é inicializado sistema autônomo um cliente de pipe com Ana Maria:

    using (Communicator MalloryAlice = new Communicator("client", AliceChannelName))
    

    Mallory é inicializado sistema autônomo um servidor de pipe com Bob:

    using (Communicator MalloryBob = new Communicator("server", BobChannelName"))
    
  4. O Communicatorconstrutor da classe aceita o nome de canal e cria um público de longo prazo ChannelManagerobjeto chamado ChMgr:

    ChMgr = new ChannelManager(mode, ChannelName);
    
  5. ChannelManagerConstrutor aceita o nome de canal e cria um pipe nomeado correspondente.

    Dica

    Neste ponto, Ana Maria e Mallory estão se comunicando através de um pipe nomeado AliceAndBobChannel, e Mallory e Bob está se comunicando através de um pipe nomeado AliceAndBobChannel1.

    AliceAndBobChanneleAliceAndBobChannel1são canais de longo prazo que permanecem Abrir até o participante do cenário de segurança (ou seja, o participante do Runmétodo).

  6. Os valores a fVersionSinalizar (que controla a versão de segurança) e o fMallorySinalizar (que controla o envolvimento do Mallory) que determinam o que acontece depois:

    Na versão 3, Alice envia uma chave de assinatura digital para Bob por PublicChannel. Eles usam essa chave de assinatura digital para assinar as chaves e as mensagens. Se fMalloryé trueMallory intercepta a chave de assinatura digital e a usa para assinar as chaves e as mensagens que ele envia para Alice e Bob.

    Nas versões 4 e 5, Ana Maria envia Dois chaves de assinatura digital para Roberto. Chave de assinatura digital 1 é a mesma chave que Alice enviada na versão 3. Chave de assinatura digital 2 é uma chave de assinatura digital secreta Mallory não conhece.

  7. Troca de Ana Maria e Luís Público chaves criptográficas para as versões de 2 a 5. Se fMalloryfor true, Mallory intercepta as chaves públicas e substitui seus próprios.

  8. Ana Maria e Luís trocam mensagens. Se fMalloryé trueMallory intercepta as alterações e o reenvio de Alice e Bob mensagens.

  9. Depois que Alice e Bob Concluir de falar para cada Outros, você será solicitado a enviar suas próprias mensagens. Isso lhe permite ver como suas mensagens obtém criptografadas e o que faz Mallory para alterá-las. Quando tiver terminado, Pressionar Inserir transferência o controle Voltar para Alice.

  10. Ana Maria Finaliza a sessão. Alice e Bob do Mallory Runmétodos retornam um controle para seus métodos Maine as reinicializações de exemplo.

Chaves de criptografia (versões 2 a 5)

As versões de 2 a 5 criptografar mensagens usando o algoritmo AES (Avançado criptografia Padrão). A criptografia chave troca é implementada em Alice e Bob do Mallory Runmétodos Depois Declaração código a seguir:

if (2 <= Version)

A chave criptográfica é Enviado pelo público a longo prazo ChannelManagerobjeto ( ChMgr) Criado em em pelo CommunicatorConstrutor de classe.

As instruções de Dois de código a seguir mostram como envia Alice e Bob receba a chave de criptografia:

Alice.Send_or_Receive_PublicCryptoKey("send", MyColor);
Bob.Send_or_Receive_PublicCryptoKey("receive", OtherColor);

O segundo parâmetro define a cor que o aplicativo de recebimento deve usar ao exibir o Sumário da chave de criptografia.

Implementações de AES são consideradas matematicamente de quebrar. No entanto, AES não oferece nenhuma proteção contra um ataque man-in-the-Meio. Pode parecer contraditórias que Mallory pode descriptografar as mensagens de Alice e Bob quando o AES fornece essa criptografia de Forte. Isso é possível porque Mallory tem de Alice e Bob compartilhado acordos secretos. Interceptação de chave e a substituição do Mallory tornam a criptografia AES de Forte inúteis.

O uso de chaves de criptografia sem autenticação fornece uma falsa sensação de segurança. Ana Maria e Luís acha que eles possuem um esquema de transmissão de mensagens seguras com a versão 2. fato, a segurança é comprometida antes que eles enviam a mensagem Primeiro.

Empresa de Alice e Bob não sabe se os ataques são originados em dentro ou fora da empresa. Eles versão 3 da ferramenta de mensagens Instantâneas para descobrir a Fonte dos ataques de design.

Assinaturas digital trocadas por canal Público (versão 3)

Versão 3 tenta corrigir a vulnerabilidade de segurança na versão 2, usando uma assinatura digital para assinar as chaves e as mensagens. A troca de chaves de assinatura digital é implementada em Alice e Bob do Mallory Runmétodos Depois Declaração código a seguir:

if (3 <= Version)

A chave de assinatura digital é Enviado através do mesmo canal público a longo prazo sistema autônomo sistema autônomo chaves criptográficas. O código a seguir é responsável por enviar a chave de assinatura digital:

Alice.ChMgr.SendMessage(dsKeyBlob);

Dica

O ChannelManagerinstância ( ChMgr) que envia a chave de assinatura digital é um membro de Alice Communicatorobjeto.

Ana Maria e Luís armazenam a chave de assinatura digital sistema autônomo um Membro de particular dos seus Communicatorobjetos:

Alice.StoreDSKey(DSKey);
Bob.StoreDSKey(DSKey);

Infelizmente, Mallory copia com com facilidade a assinatura digital de PublicChannele salva-o:

Mallory.StoreDSKey(DSKey);

Quando Ana Maria e Luís recebem mensagens assinadas entre si, as assinaturas digital correspondem perfeitamente as mensagens. Isso ocorre porque Mallory-los assinado com a mesma chave de assinatura digital usam Ana Maria e Luís.

Na versão 3, Ambas as chaves de criptografia e a assinatura digital são trocados em um canal público através da rede corporativa. A empresa que Alice e Bob funciona para suspeito por pessoa dentro da empresa está realizando os thefts. A empresa cria a versão 4 Teste essa idéia.

Assinaturas digital trocadas em particular canal (versão 4)

Versão 4 usa Dois chaves de assinatura digital: a chave que foi usada na versão 3 e um segundo, chave secreta que é enviado através de um canal particular. Agora, Primeiro chave é tratada sistema autônomo uma chave digital falsa para interceptar o ladrão. A segunda chave é usada pela Alice e Bob para assinar digitalmente suas mensagens e de suas chaves criptográficas.

Apenas Ana Maria e Luís recebem a versão 4 do software de mensagens Instantâneas. Mallory continuará a usar a versão 3. Portanto, Mallory nunca detecta que a assinatura digital, que ele usa é inválida. No entanto, a ferramenta de mensagens Instantâneas de Alice e Bob exibe um Alerta de Segurança para cada chave única e a mensagem recebem.

Versão 4 também mostra que as chaves criptográficas e de mensagens estão sendo interceptadas. Isso indica que um ataque de interceptação está ocorrendo e que ele é iniciado antes que as chaves criptográficas ainda sejam enviadas. Portanto, um funcionário da empresa que tenha acesso à empresa PublicChanneldeve fazer logon antes de Bob. O Usar inteligente da chave secreta de assinatura digital revela as atividades de segredo do Mallory.

A transmissão de chave secreta de assinatura digital é implementada em Alice e Bob Runmétodos Depois Declaração código a seguir:

if (4 <= Version)

As seguintes instruções de código são responsáveis pela criação de Alice e Bob particular ChannelManagerinstâncias:

ChannelManager ChMgr2 = new ChannelManager("server", "PrivateChannel")
ChannelManager ChMgr2 = new ChannelManager("client", "PrivateChannel")

Particular do canal que Alice e Bob Usar ( ChMgr2) não é um Membro de da sua Communicatorobjetos. Você pode ver, comparando as Dois de código instruções a seguir:

Alice.ChMgr.SendMessage(dsKeyBlob); // Public channel - fake key
ChMgr2.SendMessage(dsKeyBlob);      // Private channel - real key

Primeiro Declaração usa a longo prazo ChannelManagerinstância ( ChMgr) que é Criado em em no Iniciar do Runmétodo. Essa instância é mantida sistema autônomo um Membro de público de Alice e Bob do Mallory Communicatorobjetos (consulte a etapa 3 para o Session visão geral seção) até o participante da sessão. A segunda Declaração usa um objeto temporário que existe Apenas por tempo suficiente para enviar e receber a chave. Ele é descartado imediatamente Depois o Usar.

Depois de Ana Maria envia a chave secreta de assinatura digital, Bob recebê-la usando Declaração a seguir:

DSKey = ChMgr2.ReadMessage();

Ana Maria e Luís armazenam a chave sistema autônomo um Membro privado no seu Communicatorobjetos:

Alice.StoreDSKey(DSKey);
Bob.StoreDSKey(DSKey);

Essas instruções também substituem a chave de assinatura digital falsas.

Versão 4, Ana Maria e Luís usam a chave secreta de assinatura digital em vez da chave de assinatura digital falsas para assinar as chaves e as mensagens. Versão 4 também autentica as chaves criptográficas e avisos de segurança é exibida sempre que de assinatura digital uma mensagem não Coincidir a mensagem.

Término da sessão (versão 5)

Versão 5 é idêntica à versão 4, exceto que ele encerra a sessão no primeiro erro. Ana Maria passa o primeiro erro quando ela recebe a chave criptográfica Público do Bob e descobre uma inválido assinatura digital. Bob enfrenta seu primeiro erro quando ele recebe a chave criptográfica Público de Alice e também detecta uma assinatura digital inválida.

Observações Adicional

  • Alienação de objeto: Translation from VPE for Csharp usinginstruções fornecem maior segurança. Elas são usadas para colocar Todas ChannelManagere Communicatorobjetos. Quando esses objetos entrar fora do escopo, seus Disposemétodos são chamados imediatamente e Todas recursos mantidos internamente são liberados.

  • Os métodos de codificação: Sempre que sistema autônomo dados criptografados são transmitidos, deve codificá-lo sistema autônomo UTF8ou Unicode, nunca sistema autônomo ASCII.

Limitações do exemplo da CNG

O objetivo do exemplo de comunicações seguras a CNG é demonstrar as funções da CNG gerenciadas. sistema autônomo resultado, alguns recursos foram omitidos, incluindo o seguinte:

  • Validação de parâmetro em Todas métodos.

  • Usar extensivo de try/catchblocos.

  • Descoberta de desconexão de pipe robusto.

  • Registrando saída na tela para um arquivo.

  • dinâmico configurabilidade do algoritmo de criptografia.

  • Capacidade de configuração dinâmica de algoritmo de assinatura digital.

  • Outra maneira de transmitir a chave de sinal digital para Roberto. O pipe nomeado PrivateChannelé uma solução simples; existem outros métodos mais sofisticados.

  • Chave de persistência, armazenamento e recuperação.

  • Usar de chaves de assinatura digital gerada pelo sistema operacional.

  • Usar de chaves fornecidos por uma infra-estrutura de chave Público (PKI).

Esses recursos envolvem a complexidade do código adicional e estão além do escopo deste exemplo.

Consulte também

Conceitos

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

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

(Exemplo da CNG) de saída esperada