Usuário com melhor resposta
Criptografia objeto.toarray

Pergunta
-
Pessoal
Com base no codigo abaixo, qual seria a forma de trocar o retorno para string, da rotina encrypted = msEncrypt.ToArray(), que está dentro da função EncryptStringToBytes_Aes ?
Imports System Imports System.IO Imports System.Security.Cryptography Class AesExample Public Shared Sub Main() Try Dim original As String = "Here is some data to encrypt!" ' Create a new instance of the Aes ' class. This generates a new key and initialization ' vector (IV). Using myAes As Aes = Aes.Create() ' Encrypt the string to an array of bytes. Dim encrypted As Byte() = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV) ' Decrypt the bytes to a string. Dim roundtrip As String = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV) 'Display the original data and the decrypted data. Console.WriteLine("Original: {0}", original) Console.WriteLine("Round Trip: {0}", roundtrip) End Using Catch e As Exception Console.WriteLine("Error: {0}", e.Message) End Try End Sub 'Main Shared Function EncryptStringToBytes_Aes(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte() ' Check arguments. If plainText Is Nothing OrElse plainText.Length <= 0 Then Throw New ArgumentNullException("plainText") End If If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key") End If If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("Key") End If Dim encrypted() As Byte ' Create an Aes object ' with the specified key and IV. Using aesAlg As Aes = Aes.Create() aesAlg.Key = Key aesAlg.IV = IV ' Create a decrytor to perform the stream transform. Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV) ' Create the streams used for encryption. Using msEncrypt As New MemoryStream() Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) Using swEncrypt As New StreamWriter(csEncrypt) 'Write all data to the stream. swEncrypt.Write(plainText) End Using encrypted = msEncrypt.ToArray() End Using End Using End Using ' Return the encrypted bytes from the memory stream. Return encrypted End Function 'EncryptStringToBytes_Aes Shared Function DecryptStringFromBytes_Aes(ByVal cipherText() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String ' Check arguments. If cipherText Is Nothing OrElse cipherText.Length <= 0 Then Throw New ArgumentNullException("cipherText") End If If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key") End If If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("Key") End If ' Declare the string used to hold ' the decrypted text. Dim plaintext As String = Nothing ' Create an Aes object ' with the specified key and IV. Using aesAlg As Aes = Aes.Create() aesAlg.Key = Key aesAlg.IV = IV ' Create a decrytor to perform the stream transform. Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV) ' Create the streams used for decryption. Using msDecrypt As New MemoryStream(cipherText) Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read) Using srDecrypt As New StreamReader(csDecrypt) ' Read the decrypted bytes from the decrypting stream ' and place them in a string. plaintext = srDecrypt.ReadToEnd() End Using End Using End Using End Using Return plaintext End Function 'DecryptStringFromBytes_Aes End Class 'AesExample
Respostas
-
Você pode mudar o retorno no método de Byte() para String e usar o código abaixo para converter
Return Convert.ToBase64String(encrypter, 0, encrypter.Length)
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta Giovani Cr sexta-feira, 17 de janeiro de 2014 19:17
-
A forma da criptografia é segura, agora a forma que exibe o resultado é mais questão visual, ali você pode fazer da maneira que achar melhor. Eu usaria o Convert.ToBase64String com 24 caracteres. Não tem necessidade de alterar a forma de como está fazendo mas se quiser ver outra alternativa pode usar esse Exemplo
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta Giovani Cr sexta-feira, 17 de janeiro de 2014 19:17
Todas as Respostas
-
Você pode mudar o retorno no método de Byte() para String e usar o código abaixo para converter
Return Convert.ToBase64String(encrypter, 0, encrypter.Length)
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta Giovani Cr sexta-feira, 17 de janeiro de 2014 19:17
-
Bruno
Desde já quero agradecer a sua ajuda, e com base no seu exemplo gostaria de fazer algumas considerações caso você saiba ?
1) Com o seu exemplo percebi que o retorno a quantidade de caracteres foram de 24 caracteres, seria normal mesmo ?
Dim cRetorno3 As String
cRetorno3 = Convert.ToBase64String(encrypted1, 0, encrypted1.Length)2) Fiz a prova dos nove, e realmente retorno o valor de origem, legal mesmo.
Dim obj_Bytex3 As Byte()
obj_Bytex3 = Convert.FromBase64String(cRetorno3)
3) Também estava tentando da forma abaixo, utilizando outros encoding, e este deu certo no geral, e me retorno com 16 caracteres.
Dim cRetorno2 As String
cRetorno2 = System.Text.ASCIIEncoding.Default.GetString(msEncrypt.ToArray())4) Fiz a prova dos nove, da forma abaixo e me retorno, um array bytes de tamanho 256.
Dim obj_Bytex4 As Byte()
obj_Bytex4 = System.Text.ASCIIEncoding.Default.GetBytes(cRetorno2)5) Ai fiz da forma abaixo, e me retorno o array bytes de origem, tamanho de 16, que de forma geral, também deu certo.
Dim obj_Bytex5 As Byte()
obj_Bytex5 = System.Text.ASCIIEncoding.Default.GetBytes(cRetorno2, 0, 16)6) Com base nas considerações acima, qual item você me indicaria, considerando a questão de segurança, e outros itens caso haja ?
7) E vendo algumas comentarios sobre .GetBuffer() e .ToArray(), você saberia uma outra forma de fazer a rotina abaixo, sem utilizar as 2 instruções, pois no momento estaria utilizando o .ToArray() ?
Using msEncrypt As New MemoryStream()
Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
Using swEncrypt As New StreamWriter(csEncrypt)
'Write all data to the stream.
swEncrypt.Write(plainText)
End Usingencrypted = msEncrypt.ToArray()
End Using
End Using- Editado neibala sábado, 11 de janeiro de 2014 10:39 Erro de envio.
-
A forma da criptografia é segura, agora a forma que exibe o resultado é mais questão visual, ali você pode fazer da maneira que achar melhor. Eu usaria o Convert.ToBase64String com 24 caracteres. Não tem necessidade de alterar a forma de como está fazendo mas se quiser ver outra alternativa pode usar esse Exemplo
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta Giovani Cr sexta-feira, 17 de janeiro de 2014 19:17
-
-
Bruno
Depois de vários teste e identificação de alguns problema, o melhor é utilizar, a forma que você comentou, devido a caracteres especiais, e na base 64 até o momento não ocorreu estes problemas, mais uma vez quero agradecer a sua imensa ajuda.
Return Convert.ToBase64String(encrypter, 0, encrypter.Length)
-
Precisando estamos ai. Só não esqueça de marcara a resposta como proposta quando te ajudar.
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro -
Bruno
Valeu mesmo, e quanto a marcar como resposta, apenas confirmando, eu confirmei no dia sábado, 11 de janeiro de 2014 03:51, e depois o moderador confirmou Marcado como Resposta Giovani Cruzara<abbr class="affil">Moderator</abbr> há 17 horas 7 minutos, veja se está assim para você também, e qualquer coisa você me avisa.