PROTECAO DA MEMORIA - CRYPTOGRAFIA DPAPI

LUIS.HERRERA 30/03/2012 14:29:37
#398793
Bom dia pessoal, descobri hoje que o framework Net proteger dados em tempo de execução.
Peguei um exemplo no site MSDN, só que ele aceita apenas texto com 16 caracteres. Tentei alterar para permitir qualquer tamanho de string, só que não consegui.

Será que alguém sabe dizer o que tem de alterar no código para aceitar texto maiores?

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

public class MemoryProtectionSample
{
public static void Main()
{
Run();
}

public static void Run()
{
try
{
///////////////////////////////
// Memory Encryption - ProtectedMemory
///////////////////////////////

// Create the original data to be encrypted (The data length should be a multiple of 16).
[txt-color=#e80000]byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes([Ô]ThisIsSomeData16[Ô]);[/txt-color] //aqui vai o texto, se colocar + dá erro.

Console.WriteLine([Ô]Original data: [Ô] + UnicodeEncoding.ASCII.GetString(toEncrypt));
Console.WriteLine([Ô]Encrypting...[Ô]);

// Encrypt the data in memory.
EncryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);

Console.WriteLine([Ô]Encrypted data: [Ô] + UnicodeEncoding.ASCII.GetString(toEncrypt));
Console.WriteLine([Ô]Decrypting...[Ô]);

// Decrypt the data in memory.
DecryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);

Console.WriteLine([Ô]Decrypted data: [Ô] + UnicodeEncoding.ASCII.GetString(toEncrypt));
}
catch (Exception e)
{
Console.WriteLine([Ô]ERROR: [Ô] + e.Message);
}
}

public static void EncryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope )
{
if (Buffer.Length <= 0)
throw new ArgumentException([Ô]Buffer[Ô]);
if (Buffer == null)
throw new ArgumentNullException([Ô]Buffer[Ô]);


// Encrypt the data in memory. The result is stored in the same same array as the original data.
ProtectedMemory.Protect(Buffer, Scope);

}

public static void DecryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope)
{
if (Buffer.Length <= 0)
throw new ArgumentException([Ô]Buffer[Ô]);
if (Buffer == null)
throw new ArgumentNullException([Ô]Buffer[Ô]);


// Decrypt the data in memory. The result is stored in the same same array as the original data.
ProtectedMemory.Unprotect(Buffer, Scope);

}

}

KERPLUNK 30/03/2012 14:47:23
#398797
O método GetBytes, das classes de encriptação do namespace UnicodeEncoding, transformam uma string em um array contendo os códigos da tabela de caracteres(conforme a classe, no seu caso ASCII) de cada um dos caracteres passados na string parâmetro. Resumindo, ele transforma uma string em um array de códigos ASC.
O ponto chave é que ela é realmente limitada, retornando no máximo 16 caracteres, por isso você não consegue encriptar textos maiores. Deve ter algum overload ou algum outro método nessa classe que o parâmetro seja livre...
PROGRAMADORVB6 30/03/2012 18:23:38
#398837
Resposta escolhida
Olá amigo Luís.
Acho que terá que configurar para Múltiplos de 16.
Ou seja : 16+16+16+16+16+16+16......=112 em vez de só definir para 16
Assim sendo terá que mudar para :
byte[] entropy = new byte[112];
Mas leia o artigo : http://www.dotnetspider.com/resources/4329-Data-Encryption-Decryption-using-DPAPI-classes.aspx

Espero o ter ajudado.
Boa sorte
Até+
Programadorvb6
LUIS.HERRERA 30/03/2012 22:06:02
#398844
ProgramadorVB6 muito obrigado, resolveu. Só tive de adaptar o código para o Framework 3.5 e ficou perfeito.
Tópico encerrado , respostas não são mais permitidas