none
Criptografia objeto.toarray RRS feed

  • 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
    

    sábado, 11 de janeiro de 2014 01:34

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
    sábado, 11 de janeiro de 2014 03:51
  • 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
    sábado, 11 de janeiro de 2014 16:11

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
    sábado, 11 de janeiro de 2014 03:51
  • 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 Using

                   encrypted = msEncrypt.ToArray()

                End Using
             End Using

      


    • Editado neibala sábado, 11 de janeiro de 2014 10:39 Erro de envio.
    sábado, 11 de janeiro de 2014 10:38
  • 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
    sábado, 11 de janeiro de 2014 16:11
  • Bruno

        Então na questão e performance e segurança, não terei grandes problemas então.

        Oh legal pelas dicas, e ajuda.

    sábado, 11 de janeiro de 2014 16:44
  • 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)

    sábado, 18 de janeiro de 2014 02:50
  • 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

    sábado, 18 de janeiro de 2014 05:16
  • 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.

    sábado, 18 de janeiro de 2014 12:28