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.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 301070
(http://support.microsoft.com/kb/301070/
)
.
Este artigo faz referência à seguinte Microsoft .NET Framework Class Library espaços de nomes:
System.IO
System.Security
System.Security.Cryptography
Nota Este artigo não se aplica para o Microsoft .NET Framework 2.0.
Este artigo descreve como utilizar as classes de criptografia que são fornecidos pelo Microsoft .NET Framework para encriptar um texto do ficheiro para um estado Ilegível e, em seguida, para desencriptar esse ficheiro de texto novamente para o seu formato original.
O espaço de nomes System.Security.Cryptographic no Microsoft .NET Framework fornece uma variedade de ferramentas para o ajudar com encriptação e desencriptação. A classe CryptoStream é uma das muitas classes que é fornecida. A classe CryptoStream foi concebida para encriptar e desencriptar o conteúdo à medida que é transmitido em sequência fora para um ficheiro.
Inicie o Visual Studio .NET ou o Visual Studio 2005.
Clique em Visual C# em projectos e clique em Aplicação de consola em modelos . O Visual C# .NET cria uma classe estática , juntamente com um procedimento Main() vazio.
Utilize a instrução a utilizar (como indicado no código de exemplo que se segue) em espaços de nomes seguintes:
sistema
System.Security
System.Security.Cryptography
System.Text
System.IO
para que não tenham de qualificar as declarações destes espaços de nomes mais tarde no código. Tem de utilizar estas instruções antes de qualquer outros declarações
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
Gera uma chave secreta para encriptar e desencriptar os dados. DESCryptoServiceProvider baseia-se um algoritmo de encriptação simétrica. A encriptação simétrica requer uma chave e um vector de inicialização (IV) para encriptar os dados. Para desencriptar os dados, tem de ter a mesma chave e o mesmo IV. Também tem de utilizar o mesmo algoritmo de encriptação. É possível gerar as chaves utilizando um dos seguintes métodos:
método 1 Pode pedir ao utilizador uma palavra-passe. Em seguida, utilize a palavra-passe como a chave e a IV.
método 2 Quando cria uma nova instância das classes de criptografia simétricas, uma nova chave e IV são criados automaticamente para a sessão. Utilize a chave pública e IV geradas pelo gerido simétricas criptográficas classes para encriptar e desencriptar o ficheiro.
Para mais informações sobre como gerar e distribuir chaves, consulte a documentação do Microsoft .NET Framework SDK ou consulte o seguinte Web site da Microsoft Developer Network (MSDN):
Adicione a seguinte função para gerar uma nova chave para uma sessão (tal como indicado no método 2 do passo 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 na sua classe chama EncryptFile . A classe EncryptFile tem de ter os seguintes três parâmetros:
sInputFilename
sOutputFilename
sKey (A chave secreta que é utilizada para encriptar e desencriptar o ficheiro.)
Procedimento EncryptFile , criar um objecto de FileStream entrado e saída de uma objecto de FileStream . Estes objectos podem ser lida a partir e escritos a ficheiros 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 encriptação real e a tecnologia de desencriptação real utilizada nos ficheiros. Neste ponto, pode criar um fornecedor diferente, se preferir utilizar RSAsecutiry ou técnica criptográfica noutra.
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
Fornecedor criptográfico tem de ser fornecido com a chave secreta como uma matriz de bytes. O espaço de nomes System.Text fornece uma função que é denominada GetBytes() . Como parte das respectivas funcionalidades codificação, a função GetBytes() tem uma cadeia e, em seguida, devolve uma matriz de bytes. O tamanho da chave é diferente para cada técnica criptográfica. Por exemplo, DES (Data Encryption Standard) tem uma chave de 64 bits que é igual para 8 bytes ou caracteres de 8.
Se não fornecer uma chave, o fornecedor aleatoriamente gera um. Isto encripta o ficheiro com êxito, mas não existe nenhum método para desencriptar o ficheiro. Tenha em atenção que também deve fornecer o vector de inicialização (IV). Este valor é utilizado como parte da encriptação. Como a chave de IV é gerado aleatoriamente se não fornecer o valor. Porque os valores tem de ter o mesmo para a encriptação e a desencriptação, não deve permitir aleatória geração estes valores.
Crie uma instância da classe CryptoStream utilizando o fornecedor criptográfico para obter um objecto de encriptação ( CreateEncryptor ) e os existentes saída FileStream objecto como parte do construtor.
Leia no ficheiro de entrada e, em seguida, escrever no ficheiro de saída. Passar o objecto CryptoStream onde o ficheiro está encriptado com a chave que forneceu.
Criar um método e atribua o nome DecryptFile . O processo de desencriptação é semelhante ao processo de encriptação, no entanto, o procedimento DecryptFile tem duas diferenças chaves do procedimento EncryptFile .
CreateDecryptor é utilizado em vez de CreateEncryptor para criar o objecto CryptoStream , que especifica como o objecto pode ser utilizado.
Quando o texto desencriptado é escrito no ficheiro de destino, o objecto CryptoStream agora é a origem em vez da sequência 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 as seguintes linhas ao procedimento Main() chamar tanto EncryptFile 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();
}
Guarde o ficheiro. Execute a aplicação. Certifique-se de que o caminho que é utilizado o nome de ficheiro de entrada aponta para um ficheiro existente.
Testar o procedimento
Teste este código com um ficheiro de texto (.txt) para confirmar que o código de encriptar e desencriptar o ficheiro correctamente. Certifique-se de que desencriptar o ficheiro para um novo ficheiro (como no procedimento Main() neste artigo) em vez de ao ficheiro original. Examine o ficheiro desencriptado e, em seguida, compará-la para o ficheiro 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();
}
}
}
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 307010
(http://support.microsoft.com/kb/307010/en-us/
)
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.