Você está na página 1de 12

31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

0 Entrar

Como criptografar e descriptografar um arquivo usando o


Visual C#

IMPORTANTE: Este artigo foi traduzido pelo software de traduo automtica da Microsoft e
eventualmente pode ter sido editado pela Microsoft Community atravs da tecnologia Community
Translation Framework CTF ou por um tradutor profissional. A Microsoft oferece artigos traduzidos
automaticamente por software, por tradutores profissionais e editados pela comunidade para que
voc tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No
entanto, um artigo traduzido pode conter erros de vocabulrio, sintaxe e/ou gramtica. A Microsoft
no responsvel por qualquer inexatido, erro ou dano causado por qualquer traduo imprecisa do
contedo ou por seu uso pelos nossos clientes.

Clique aqui para ver a verso em Ingls deste artigo: 307010

Para obter uma verso deste artigo do Microsoft Visual Basic .NET, consulte 301070.

Este artigo se refere aos seguintes namespaces da biblioteca de classes do.NET Framework da
Microsoft:
System.IO

System. Security

System.Security.Cryptography

Observao: Este artigo no se aplica para o Microsoft.NET Framework 2.0.

Sumrio

Este artigo descreve como usar as classes de criptografia fornecidas com o Microsoft.NET Framework
para criptografar um texto de arquivo para um estado ilegvel e, em seguida, para descriptografar esse
arquivo de texto de volta para seu formato original.

Requisitos
A lista seguinte descreve o hardware
https://support.microsoft.com/ptbr/kb/307010 recomendado, software, infraestrutura de rede e service packs que1/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

A lista seguinte descreve o hardware recomendado, software, infraestrutura de rede e service packs que
voc deve ter:
Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server,
Windows NT 4.0 Server ou Microsoft Windows XP Professional

Microsoft Visual Studio 2005 ou o Microsoft Visual Studio .NET

Criptografia e descriptografia

O namespace System.Security.Cryptographic no Microsoft.NET Framework fornece uma variedade de


ferramentas para ajudlo com a criptografia e descriptografia. A classe CryptoStream uma das muitas
classes que fornecido. A classe CryptoStream projetada para criptografar ou descriptografar o
contedo transmitidoout em um arquivo.

Criptografar um arquivo

Para criptografar um arquivo, execute essas etapas:


1. Inicie o Visual Studio 2005 ou Visual Studio .NET.

2. Clique em Visual C# em projetose, em seguida, clique em Aplicativo de Console em modelos. O


Visual C# .NET cria uma classe esttica para voc, juntamente com um procedimento Main ()
vazio.

3. Use a instruo using conforme indicado no cdigo de exemplo que se segue sobre os
namespaces a seguir:
Sistema

System. Security

System.Security.Cryptography

System. Text

System.IO

para que voc no precise qualificar declaraes desses namespaces posteriormente no seu
cdigo.

usingSystem;
usingSystem.IO;
usingSystem.Security;
usingSystem.Security.Cryptography;
usingSystem.Runtime.InteropServices;
usingSystem.Text;

4. Gere uma chave secreta para criptografar e descriptografar os dados. O


DESCryptoServiceProvider baseiase em um algoritmo de criptografia simtrica. O

symmetricencryption requer
https://support.microsoft.com/ptbr/kb/307010 uma chave e um vetor de inicializao IV para criptografar a thedata.2/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

symmetricencryption requer uma chave e um vetor de inicializao IV para criptografar a thedata.


Para descriptografar os dados, voc deve ter a mesma chave e o mesmo IV. Mustalso voc usa o
mesmo algoritmo de criptografia. Voc pode gerar as chaves, usingeither dos seguintes mtodos:
Mtodo 1

Mtodo 2

Para obter mais informaes sobre como gerar e distribuir chaves, consulte a documentao
do Microsoft.NET Framework SDK ou consulte o seguinte site da Microsoft Developer
Network MSDN:
Gerando chaves de criptografia e descriptografia

5. Adicione a seguinte funo para gerar uma nova chave para uma sesso conforme mencionado
no mtodo 2 da etapa 4:

//Callthisfunctiontoremovethekeyfrommemoryafteruseforsecu
rity.
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL",EntryPoint="R
tlZeroMemory")]
publicstaticexternboolZeroMemory(refstringDestination,intLengt
h);

//FunctiontoGeneratea64bitsKey.
staticstringGenerateKey()
{
//CreateaninstanceofSymetricAlgorithm.KeyandIVisgene
ratedautomatically.
DESCryptoServiceProviderdesCrypto=(DESCryptoServiceProvider)D
ESCryptoServiceProvider.Create();

//UsetheAutomaticallygeneratedkeyforEncryption.
returnASCIIEncoding.ASCII.GetString(desCrypto.Key);
}

6. Crie um mtodo na sua classe nomeada EncryptFile. A classe EncryptFile deve ter trs parmetros
a seguir:
sInputFilename

sOutputFilename

sKey

staticvoidEncryptFile(stringsInputFilename,
stringsOutputFilename,
stringsKey)

7. No procedimento EncryptFile
https://support.microsoft.com/ptbr/kb/307010 , crie um objeto FileStream de entrada e sada de uma objeto 3/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

7. No procedimento EncryptFile , crie um objeto FileStream de entrada e sada de uma objeto


FileStream .

FileStreamfsInput=newFileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);

FileStreamfsEncrypted=newFileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);

8. Declare uma instncia da classe DESCryptoServiceProvider .

DESCryptoServiceProviderDES=newDESCryptoServiceProvider();

9. O provedor de criptografia deve ser fornecido com chave de yoursecret como uma matriz de
bytes. O namespace System. Text fornece uma funo chamada GetBytes. Como parte de seus
recursos de codificao, a funo GetBytes aceita uma cadeia de caracteres e retorna uma matriz
de bytes. Thesize da chave diferente para cada tcnica de criptografia. Por exemplo, padro de
criptografia de dados DES usa uma chave de 64 bits que igual a 8 bytes orto 8 caracteres.

Se voc no fornecer uma chave, o provedor gera aleatoriamente um.

DES.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

10. Criar uma instncia da classe CryptoStream usando o provedor criptogrfico para obter um objeto
criptografia CreateEncryptor e o existente sada objeto FileStream como parte do construtor.

ICryptoTransformdesencrypt=DES.CreateEncryptor();
CryptoStreamcryptostream=newCryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);

11. Leia no arquivo de entrada


https://support.microsoft.com/ptbr/kb/307010 e, em seguida, gravar o arquivo de sada. Passe o objeto CryptoStream4/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

11. Leia no arquivo de entrada e, em seguida, gravar o arquivo de sada. Passe o objeto CryptoStream
onde o arquivo est criptografado usando a chave que youprovided.

byte[]bytearrayinput=newbyte[fsInput.Length1];
fsInput.Read(bytearrayinput,0,bytearrayinput.Length);
cryptostream.Write(bytearrayinput,0,bytearrayinput.Length);

Descriptografar um arquivo

Para descriptografar um arquivo, execute essas etapas:


1. Crie um mtodo e nomeiea comoDecryptFile. O processo de descriptografia semelhante ao
processo de theencryption, no entanto, o procedimento DecryptFile tem duas diferenas
importantes do procedimento EncryptFile .
CreateDecryptor usado em vez de CreateEncryptor para criar o objeto CryptoStream ,
que especifica como o objeto pode ser usado.

Quando o texto descriptografado gravado para o arquivo de destino, o objeto


CryptoStream agora a fonte em vez do fluxo de destino.

staticvoidDecryptFile(stringsInputFilename,
stringsOutputFilename,
stringsKey)
{
DESCryptoServiceProviderDES=newDESCryptoServiceProvider();
//A64bitkeyandIVisrequiredforthisprovider.
//SetsecretkeyForDESalgorithm.
DES.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
//Setinitializationvector.
DES.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

//Createafilestreamtoreadtheencryptedfileback.
FileStreamfsread=newFileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//CreateaDESdecryptorfromtheDESinstance.
ICryptoTransformdesdecrypt=DES.CreateDecryptor();
//Createcryptostreamsettoreadanddoa
//DESdecryptiontransformonincomingbytes.
CryptoStreamcryptostreamDecr=newCryptoStream(fsread,
desdecrypt,
CryptoStreamMo
de.Read);
//Printthecontentsofthedecryptedfile.
StreamWriterfsDecrypted=newStreamWriter(sOutputFilename);
fsDecrypted.Write(newStreamReader(cryptostreamDecr).ReadToEnd
());
https://support.microsoft.com/ptbr/kb/307010 5/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

fsDecrypted.Flush();
fsDecrypted.Close();
}

2. Adicione as seguintes linhas ao procedimento Main () para chamar EncryptFile e DecryptFile:

staticvoidMain()
{
//Mustbe64bits,8bytes.
//Distributethiskeytotheuserwhowilldecryptthisfile.
stringsSecretKey;

//Getthekeyforthefiletoencrypt.
sSecretKey=GenerateKey();

//Foradditionalsecuritypinthekey.
GCHandlegch=GCHandle.Alloc(sSecretKey,GCHandleType.Pinned);

//Encryptthefile.
EncryptFile(@"C:\MyData.txt",
@"C:\Encrypted.txt",
sSecretKey);

//Decryptthefile.
DecryptFile(@"C:\Encrypted.txt",
@"C:\Decrypted.txt",
sSecretKey);

//Removethekeyfrommemory.
ZeroMemory(gch.AddrOfPinnedObject(),sSecretKey.Length*2);
gch.Free();
}

3. Salve o arquivo.

Testar o procedimento
Teste esse cdigo com um arquivo de texto . txt para confirmar que o cdigo criptografados e
descriptografados o arquivo corretamente. Certifiquese de que voc descriptografar o arquivo para um
novo arquivo como no procedimento Main () neste artigo em vez de no arquivo original. Examine o
arquivo descriptografado e, em seguida, comparlo com o arquivo original.

Listagem de cdigo completa

usingSystem;
usingSystem.IO;
https://support.microsoft.com/ptbr/kb/307010 6/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

usingSystem.Security;
usingSystem.Security.Cryptography;
usingSystem.Runtime.InteropServices;
usingSystem.Text;

namespaceCSEncryptDecrypt
{
classClass1
{
//Callthisfunctiontoremovethekeyfrommemoryafteruseforsec
urity
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL",EntryPoint
="RtlZeroMemory")]
publicstaticexternboolZeroMemory(IntPtrDestination,intLength);

//FunctiontoGeneratea64bitsKey.
staticstringGenerateKey()
{
//CreateaninstanceofSymetricAlgorithm.KeyandIVisgenerate
dautomatically.
DESCryptoServiceProviderdesCrypto=(DESCryptoServiceProvider)DESCr
yptoServiceProvider.Create();

//UsetheAutomaticallygeneratedkeyforEncryption.
returnASCIIEncoding.ASCII.GetString(desCrypto.Key);
}

staticvoidEncryptFile(stringsInputFilename,
stringsOutputFilename,
stringsKey)
{
FileStreamfsInput=newFileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);

FileStreamfsEncrypted=newFileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
DESCryptoServiceProviderDES=newDESCryptoServiceProvider();
DES.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransformdesencrypt=DES.CreateEncryptor();
CryptoStreamcryptostream=newCryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);

byte[]bytearrayinput=newbyte[fsInput.Length];
fsInput.Read(bytearrayinput,0,bytearrayinput.Length);
cryptostream.Write(bytearrayinput,0,bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}

staticvoidDecryptFile(stringsInputFilename,
https://support.microsoft.com/ptbr/kb/307010 7/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

stringsOutputFilename,
stringsKey)
{
DESCryptoServiceProviderDES=newDESCryptoServiceProvider();
//A64bitkeyandIVisrequiredforthisprovider.
//SetsecretkeyForDESalgorithm.
DES.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
//Setinitializationvector.
DES.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

//Createafilestreamtoreadtheencryptedfileback.
FileStreamfsread=newFileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//CreateaDESdecryptorfromtheDESinstance.
ICryptoTransformdesdecrypt=DES.CreateDecryptor();
//Createcryptostreamsettoreadanddoa
//DESdecryptiontransformonincomingbytes.
CryptoStreamcryptostreamDecr=newCryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
//Printthecontentsofthedecryptedfile.
StreamWriterfsDecrypted=newStreamWriter(sOutputFilename);
fsDecrypted.Write(newStreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}

staticvoidMain()
{
//Mustbe64bits,8bytes.
//Distributethiskeytotheuserwhowilldecryptthisfile.
stringsSecretKey;

//GettheKeyforthefiletoEncrypt.
sSecretKey=GenerateKey();

//ForadditionalsecurityPinthekey.
GCHandlegch=GCHandle.Alloc(sSecretKey,GCHandleType.Pinned);

//Encryptthefile.
EncryptFile(@"C:\MyData.txt",
@"C:\Encrypted.txt",
sSecretKey);

//Decryptthefile.
DecryptFile(@"C:\Encrypted.txt",
@"C:\Decrypted.txt",
sSecretKey);

//RemovetheKeyfrommemory.
ZeroMemory(gch.AddrOfPinnedObject(),sSecretKey.Length*2);
gch.Free();
}

https://support.microsoft.com/ptbr/kb/307010 8/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

}
}

Referncias

Para obter mais informaes sobre criptografia e sobre como usar os recursos de criptografia do .NET,
consulte os seguintes sites da MSDN:
Espao para nome System.Security.Cryptography

Microsoft.NET Framework Developer Center

Propriedades

ID do Artigo: 307010 ltima Reviso: 05/23/2015 12:54:00 Reviso: 40.0

A informao contida neste artigo aplicase a:


Microsoft Visual C# 2005, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002
Standard Edition

Palavras chave:
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtpt

Suporte

Segurana

Fale conosco

https://support.microsoft.com/ptbr/kb/307010 9/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

Portugus Brasil
Termos de uso Privacidade e cookies Marcas 2016 Microsoft

https://support.microsoft.com/ptbr/kb/307010 10/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

https://support.microsoft.com/ptbr/kb/307010 11/12
31/10/2016 ComocriptografaredescriptografarumarquivousandooVisualC#

https://support.microsoft.com/ptbr/kb/307010 12/12

Você também pode gostar