Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Este artigo foi publicado anteriormente em BR307010
Para obter uma versão deste artigo para o Microsoft
Visual Basic .NET, consulte
301070
(http://support.microsoft.com/kb/301070/
)
.
Este artigo se refere aos seguintes espaços para nome do
Microsoft .NET Framework Class Library:
System.IO
System.Security
System.Security.Cryptography
Observação É possível que este artigo não se aplique ao Microsoft .NET
Framework 2.0 .
Este artigo mostra como usar as classes de criptografia
fornecidas pelo Microsoft .NET Framework para criptografar um arquivo de texto
ilegível e descriptografar essas informações para que retornem ao formato
original.
O espaço para o nome System.Security.Cryptographic no Microsoft .NET Framework fornece várias ferramentas que
auxiliarão na criptografia e descriptografia. A classe CryptoStream é uma das várias classes fornecidas. A classe CryptoStream é projetada para criptografar e descriptografar o conteúdo à
medida que ele flui em um arquivo.
Para criptografar um arquivo, siga as seguintes etapas:
Inicie o Visual Studio 2005 ou Visual Studio
.NET
Clique em Visual C#, em
Projects, clique em Aplicativo de Console e
em Modelos. O Visual C# .NET cria uma classe Estática, junto com um procedimentoMain() vazio.
Use a instrução using (conforme indicado nos códigos de exemplo a seguir) nos seguintes
espaços para nome:
Sistema
System.Security
System.Security.Cryptography
System.Text
System.IO
não é necessário qualificar declarações nesses espaços para
nome posteriormente no código. É necessário usar essas instruções antes de
qualquer declaração.
using System; using System.IO; using System.Security; using System.Security.Cryptography; using System.Runtime.InteropServices; using System.Text;
Adicione uma chave secreta para criptografar e
descriptografar os dados. O DESCryptoServiceProvider é baseado em um algoritmo de criptografia simétrico. A
criptografia simétrica exige uma chave e um vetor de inicialização (IV) para
criptografar os dados. Para descriptografar os dados é necessário ter a mesma
chave e o mesmo IV. É necessário também usar o mesmo algoritmo de criptografia.
É possível gerar a chave usando qualquer um dos seguintes métodos:
Método 1 Solicite uma senha para usuário. Em seguida, use a senha como
chave e o IV.
Método 2 Ao criar uma nova instância de classe de criptografia simétrica,
uma nova chave e um novo IV são automaticamente criados para a sessão. Ao usar
a chave e o IV gerados pela classes de criptografias simétricas gerenciadas
para criptografar e descriptografar o arquivo.
Para obter mais
informações sobre como gerar e distribuir chaves, veja a Microsoft .NET
Framework SDK Documentation, ou visite o seguinte site da Microsoft Developer
Network (MSDN) (em inglês):
Adicione a seguinte função para gerar uma nova chave para
uma sessão (conforme observado no Método 2 da etapa 4):
// Call this function to remove the key from memory after use for security.
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
public static extern bool ZeroMemory(ref string Destination, int Length);
// Function to Generate a 64 bits Key.
static string GenerateKey()
{
// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
Crie um método ea classe nomeada EncryptFile. A classe EncryptFile deve ter os três seguintes parâmetros:
sInputFilename
sOutputFilename
sKey (A chave secreta usada para criptografar e descriptografar o
arquivo.)
No procedimento EncryptFile, crie uma entrada de objeto FileStream e uma saída de objeto FileStream. Estes objetos podem ser lidos e gravados à partir de e para os
arquivos de destino.
FileStream fsInput = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
Declare uma instância da classe DESCryptoServiceProvider. Isto representa a tecnologia de criptografia e descriptografia
real usada nos arquivos. Chegando neste ponto, é possível criar outro provedor
se preferir usar a RSAsecurity ou outra técnica criptográfica.
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
O provedor criptográfico deve ser fornecido com a chave
secreta como uma matriz de bytes . O espaço para nomes System.Text fornece uma função chamada GetBytes(). Como parte da codificação recursos, a função GetBytes() utiliza uma seqüência de caracteres e retorna uma matriz de
bytes. O tamanho da chave varia de acordo com cada técnica criptográfica. Por
exemplo, o Padrão de Criptografia de Dados (DES) utiliza uma chave de 64 bits,
que equivale a 8 bytes ou 8 caracteres.
Se a chave não é fornecida, o
provedor irá gerar uma aleatoriamente. Isto criptografa o artigo de forma
bem-sucedida, mas não há nenhuma maneira de descriptografá-lo. Observe que é
necessário também fornecer o vetor de inicialização (IV). Este valor é usado
como parte da criptografia. Assim como a chave, o IV é gerado aleatóriamente se
não fornecê-lo. Como o valor deve ser o mesmo tanto para criptografia quanto
para a descriptografia, não se deve permitir que eles sejam gerados
aleatóriamente.
Crie uma instância da classe CryptoStream usando o provedor criptográfico para obter um objeto de
criptografia (CreateEncryptor) e o objeto de saída existente como parte do construtor FileStream
Leia o arquivo de entrada, e grave-o no arquivo de saída.
Transfira-o através do objeto CryptoStream para onde ele será criptografado usando a chave fornecida.
Para descriptografar um arquivo, execute as seguintes etapas:
Crie um método chamado DecryptFile.
O processo de descriptografia é bastante semelhante ao de criptografia,
entretanto, o procedimento do DecryptFile apresenta duas diferenças principais em relação ao procedimento
do EncryptFile.
CreateDecryptor é usado no lugar de CreateEncryptor para criar o objeto CryptoStream que especifica como o objeto será utilizado .
Depois, ao gravar o texto descriptografado no arquivo
de destino, o objeto CryptoStream passa a ser o fluxo de origem e não de destino.
static void DecryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
//Create a file stream to read the encrypted file back.
FileStream fsread = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//Create a DES decryptor from the DES instance.
ICryptoTransform desdecrypt = DES.CreateDecryptor();
//Create crypto stream set to read and do a
//DES decryption transform on incoming bytes.
CryptoStream cryptostreamDecr = new CryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
Adicione linhas ao procedimento Main() para chamar EncryptFile e DecryptFile:
static void Main()
{
// Must be 64 bits, 8 bytes.
// Distribute this key to the user who will decrypt this file.
string sSecretKey;
// Get the key for the file to encrypt.
sSecretKey = GenerateKey();
// For additional security pin the key.
GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
// Encrypt the file.
EncryptFile(@"C:\MyData.txt",
@"C:\Encrypted.txt",
sSecretKey);
// Decrypt the file.
DecryptFile(@"C:\Encrypted.txt",
@"C:\Decrypted.txt",
sSecretKey);
// Remove the key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
gch.Free();
}
Salve o arquivo. Execute o aplicativo Certifique-se de que
o caminho usado no nome do arquivo de entrada aponta para um arquivo
existente.
Teste o procedimento
Teste esse código com um arquivo de texto (.txt) para ter a
certeza de que ele criptografou e descriptografou o arquivo corretamente.
Certifique-se de que descriptografou o arquivo em um novo arquivo (conforme
descrito no procedimento Main() deste artigo) e, não no arquivo original. Examine o arquivo
descriptografado e compare-o com o original.
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
namespace CSEncryptDecrypt
{
class Class1
{
// Call this function to remove the key from memory after use for security
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]
public static extern bool ZeroMemory(IntPtr Destination, int Length);
// Function to Generate a 64 bits Key.
static string GenerateKey()
{
// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
static void EncryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
FileStream fsInput = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}
static void DecryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
//Create a file stream to read the encrypted file back.
FileStream fsread = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//Create a DES decryptor from the DES instance.
ICryptoTransform desdecrypt = DES.CreateDecryptor();
//Create crypto stream set to read and do a
//DES decryption transform on incoming bytes.
CryptoStream cryptostreamDecr = new CryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
static void Main()
{
// Must be 64 bits, 8 bytes.
// Distribute this key to the user who will decrypt this file.
string sSecretKey;
// Get the Key for the file to Encrypt.
sSecretKey = GenerateKey();
// For additional security Pin the key.
GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
// Encrypt the file.
EncryptFile(@"C:\MyData.txt",
@"C:\Encrypted.txt",
sSecretKey);
// Decrypt the file.
DecryptFile(@"C:\Encrypted.txt",
@"C:\Decrypted.txt",
sSecretKey);
// Remove the Key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
gch.Free();
}
}
}
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
Diga-nos o porque e o que podemos fazer para melhorar esta informação
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.