Como calcular e comparar valores de hash usando o Visual C++ .NET ou Visual C++ 2005

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 815656
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 307020.
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 301053.
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.Security.Cryptography
  • System.Text

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como obter um valor de hash e como comparar dois valores de hash para verificar se eles são idênticos.

back to the top

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
  • Microsoft Windows 2000, Windows XP Professional ou Windows Server 2003
  • Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005
back to the top

Calcular um valor de hash

É fácil de gerar e comparar valores de hash usando os recursos de criptografia que estão contidos no espaço para nome System.Security.Cryptography. Porque a entrada do tipo byte [] todas as funções de hash , talvez você precise converter a fonte em uma matriz de bytes antes de ele é hash. Para criar um hash para um valor de seqüência de caracteres, execute essas etapas:
  1. Inicie Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. No Visual Studio .NET 2002, clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Aplicativo de C++ gerenciado em modelos .

    No Visual C++ .NET 2003, clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Aplicativo de console (NET) em modelos .

    No Visual C++ 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Aplicativo de console CLR em modelos .
  4. Nomeie o projeto Q815656. O Visual Studio .NET ou Visual Studio 2005 cria uma classe pública com uma função _tmain .
  5. Use a diretiva usando os namespaces System.Text , System.Security.Cryptographic , System.Security e sistema de modo que não é necessário que qualificar declarações desses namespaces posteriormente no seu código. Para fazer isso, adicione as seguintes linhas na parte superior da Q815656.cpp.
    using namespace System;using namespace System::Security::Cryptography; using namespace System::Text; 
  6. No início da função _main , declare uma variável seqüência de caracteres para armazenar os dados de origem e matrizes de dois bytes (de tamanho indefinido) para armazenar os bytes de origem e o resultante hash valor.
    String* sSourceData;Byte tmpSource[];Byte tmpHash[];
  7. Use o método GetBytes para converter a seqüência de origem em uma matriz de bytes (necessário como entrada para a função hash). O método GetBytes é membro do class. System.Text.ASCIIEncoding
    ASCIIEncoding* ascii = new ASCIIEncoding();sSourceData = "MySourceData";//Create a byte array from source data.tmpSource = ascii->GetBytes(sSourceData);
  8. Calcule o hash MD5 para seus dados de origem, chamando o método ComputeHash em uma instância da classe MD5CryptoServiceProvider . Observação Para calcular a outro valor de hash, crie outra instância do hash class.
    //Compute hash based on source data.tmpHash = (new MD5CryptoServiceProvider())->ComputeHash(tmpSource);
  9. A matriz de bytes tmpHash agora contém o valor de hash computados (valor de 128 bits = 16 bytes) para seus dados de origem. É útil com freqüência exibir ou armazenar um valor assim como uma seqüência de caracteres hexadecimal. Use o código a seguir para fazer isso.
    Console::WriteLine(ByteArrayToString(tmpHash));
  10. Adicionar a seguinte definição da função ByteArrayToString abaixo a função _tmain .
    String* ByteArrayToString(Byte arrInput[]){	int i;	StringBuilder* sOutput = new StringBuilder(arrInput->Length);	for (i=0;i < arrInput->Length -1; i++) 	{		sOutput->Append(arrInput[i].ToString("X2"));	}	return sOutput->ToString();}
    Observação você deve adicionar a seguinte declaração de função antes da função _tmain .
    String* ByteArrayToString(Byte arrInput[]);
    Otherwise, you receive the C3861 and C2365 errors in Visual C++.NET 2003, or you receive the C2365 and C2365 errors in Visual C++.NET 2002 String 1
  11. Pressione CTRL + F5 para salvar e executar seu código. Você verá a saída similar à seguinte:
    8FD2486D263C1EE4FCF7FA70742F23
back to the top

Comparar dois valores de hash

Quando você cria um hash dos dados de origem, você pode ver se dados foram alterados com o tempo, ou você pode comparar dois valores sem nunca trabalhando com os valores reais. Em ambos os casos, você deve comparar dois hashes calculadas. Você pode comparar o hash calculado facilmente se eles são armazenados como seqüências de caracteres hexadecimais (como na última etapa da seção anterior). No entanto, ambos podem ser na forma de matrizes de bytes. O código a seguir continua de código que foi criado na seção anterior. Este código demonstra como comparar matrizes de dois bytes.
  1. Abaixo a seqüência hexadecimal é criada, criar um novo valor de hash que se baseia novos dados de origem.
    sSourceData = "NotMySourceData";//Create a byte array from source data.tmpSource = ascii->GetBytes(sSourceData);Byte tmpNewHash[];tmpNewHash = (new MD5CryptoServiceProvider())->ComputeHash(tmpSource);
  2. A maneira mais simples para comparar matrizes de dois bytes é percorrer as matrizes e compare cada elemento com sua contraparte do segundo valor. Se os elementos são diferentes, ou se duas matrizes não são o mesmo tamanho, os dois valores não são iguais.
    bool bEqual = false;if (tmpNewHash->Length == tmpHash->Length){	int i=0;	while ((i < tmpNewHash->Length) && (tmpNewHash[i] == tmpHash[i]))	{		i += 1;	}	if (i == tmpNewHash->Length) 	{		bEqual = true;	}}    if (bEqual)	Console::WriteLine("The two hash values are the same");else	Console::WriteLine("The two hash values are not the same");Console::ReadLine();
  3. Pressione CTRL + F5 para salvar e executar seu código. Você verá a saída similar à seguinte:
    8FD2486D263C1EE4FCF7FA70742F23
    F7711A634146F20AB86D1E5A8F870C
    Os valores de dois hash não são iguais
back to the top

Listagem de código completo

#include "stdafx.h"#include <tchar.h>#using <mscorlib.dll>using namespace System;using namespace System::Security::Cryptography; using namespace System::Text; String* ByteArrayToString(Byte arrInput[]);int _tmain(void){    // TODO: Replace the sample code below with your own.	String* sSourceData;	Byte tmpSource[];	Byte tmpHash[];	ASCIIEncoding* ascii = new ASCIIEncoding();	sSourceData = "MySourceData";	//Create a byte array from source data.	tmpSource = ascii->GetBytes(sSourceData);	tmpHash = (new MD5CryptoServiceProvider())->ComputeHash(tmpSource);	Console::WriteLine(ByteArrayToString(tmpHash));		sSourceData = "NotMySourceData";	tmpSource =ascii->GetBytes(sSourceData);	Byte tmpNewHash[];	tmpNewHash = (new MD5CryptoServiceProvider())->ComputeHash(tmpSource);	Console::WriteLine(ByteArrayToString(tmpNewHash));		bool bEqual = false;	if (tmpNewHash->Length == tmpHash->Length)	{		int i=0;		while ((i < tmpNewHash->Length) && (tmpNewHash[i] == tmpHash[i]))		{			i += 1;		}		if (i == tmpNewHash->Length) 		{			bEqual = true;		}	}    	if (bEqual)		Console::WriteLine("The two hash values are the same");	else		Console::WriteLine("The two hash values are not the same");	Console::ReadLine();    return 0;};String* ByteArrayToString(Byte arrInput[]){	int i;	StringBuilder* sOutput = new StringBuilder(arrInput->Length);	for (i=0;i < arrInput->Length -1; i++) 	{		sOutput->Append(arrInput[i].ToString("X2"));	}	return sOutput->ToString();};
Observação Você deve adicionar a opção de compilador de suporte de tempo de execução idioma comum (/ CLR: oldSyntax) no Visual C++ 2005 a compilar com êxito o exemplo de código anterior. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
  1. Clique em Project e clique em <ProjectName> propriedades .

    Observação <ProjectName> é um espaço reservado para o nome do projeto.
  2. Expanda Configuration Properties e, em seguida, clique em Geral .
  3. Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime configuração no painel à direita, clique em Aplicar e em seguida, clique em OK .
Para obter mais informações sobre o common language runtime oferece suporte à opção do compilador, visite o seguinte site da Microsoft:
/ clr (Common Language Runtime Compilation)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
Estas etapas se aplicam o artigo inteiro.

back to the top
Referências
Para obter mais informações sobre como usar os recursos de criptografia do Microsoft .NET Framework e sobre criptografia, visite o seguinte site Massachusetts Institute da tecnologia Web:Para obter mais informações sobre A Microsoft fornece terceiros informações de contatos para ajudá-lo a encontrar suporte técnico. Essa informações de contatos podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão dessas informações contatos de terceiros.

back to the top
vcnet hash cript md5

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 815656 - Última Revisão: 12/08/2015 02:10:37 - Revisão: 3.2

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbcrypt kbcode kbhowtomaster kbhowto KB815656 KbMtpt
Comentários