Re: Need help decrypting

From: Joe Kaplan \(MVP - ADSI\) (joseph.e.kaplan_at_removethis.accenture.com)
Date: 02/23/05


Date: Tue, 22 Feb 2005 21:19:02 -0600

I'm just saying that you can't take any old byte array and convert that to a
string using ASCII and expect to have a usable string. ASCII is only 7
bits, not 8, and some low characters are unprintable. To convert an
arbitrary byte array into a string, you need to use something like Base64.
the actual string will be ASCII because it only uses ASCII characters, but
you can then take that same Base64 string and convert it back into a byte
array with no loss (using Convert.FromBase64String). If you tried that
using ASCII encoding, you lop of the 8th bit of each byte, so there is no
way you will be able to convert that back into the same byte array.

Thus:
Plain text as string -> byte array using UTF8
encrypted byte array -> string using Base64

Then
Base64 -> encrypted data byte array using Base64
decrypted byte array -> original string using UTF8

Using this methodology, you'll be sure to round trip all of your data
without losing anything and get it back in its original format.

Best yet though, just use Ivan's sample that I linked to.

Joe K.

"Steve Long" <Steve_Noneya@NoSpam.com> wrote in message
news:u8bcUqTGFHA.2992@TK2MSFTNGP09.phx.gbl...
> Okay, so if it really is a password that is stored in an xml file and I
> encrypt that password file and store that result, isn't that just an ascii
> string? My goal here was to store an encrypted password in an xml file and
> then decrypt that on application load up. Is that perhaps not the best
> approach for this need? Perhaps I need to store the encrypted password in
> a
> binary file??? Is that maybe what you are saying?
>
> Steve
>
> "Joe Kaplan (MVP - ADSI)" <joseph.e.kaplan@removethis.accenture.com> wrote
> in message news:uZJZ5iTGFHA.4004@tk2msftngp13.phx.gbl...
>> Also, there is a weird mix of ASCII and UTF8 in there that is asking for
>> trouble it seems.
>>
>> - Typically, if you have unicode strings (which you do in .NET) you want
> to
>> encrypt them, you want to use Unicode or UTF8 encodings to convert them
> into
>> byte arrays for encryption. Using ASCII may cause data loss.
>> - When you decypt encrypted data into a byte array and that data
> represents
>> a string, you MUST use the same encoding you used to create the original
>> byte array when you encrypted. UTF8 in -> UTF8 out; Unicode in ->
>> Unicode
>> out.
>> - If you have a byte array of arbitrary data (the result of encryption,
>> a
>> hash or other random number generator) and you want to store that as a
>> string, you must use a string format that is designed to hold arbitrary
>> binary data. Base64 is the normal way to do that
> (Convert.ToBase64String).
>> Trying to store random binary data as a string using ASCII, UTF8 or
> Unicode
>> encodings is likely to produce poor results.
>>
>> I think paying attention to all of those will help make this more
>> successful. Also, not reinventing the wheel is good. Here's a sample
> from
>> an MS employee that might help:
>> http://www.dotnetthis.com/Articles/Crypto.htm
>>
>> There are many other samples out there as well.
>>
>> Joe K.
>>
>> "Valery Pryamikov" <valery@harper.no> wrote in message
>> news:e$%23zkVTGFHA.1408@TK2MSFTNGP10.phx.gbl...
>> > Just a brief look (not checking anyting else): in your encrypt function
>> > you derive bytes from "passwd" password, while in your decrypt function
>> > you use "pa[]ss!!wo//dd".
>> >
>> > -Valery.
>> > http://www.harper.no/valery
>> >
>> >
>> > "Steve Long" <Steve_Noneya@NoSpam.com> wrote in message
>> > news:%23$4F0oPGFHA.2032@tk2msftngp13.phx.gbl...
>> >> Hello,
>> >> I'm wondering if somebody can help me figure out how to decrypt data.
>> >> I
>> >> seem
>> >> to be able to encrypt data but have not been able to decrypt the very
>> >> data
>> >> that I've encrypted. I know it's because I'm just not understanding
> the
>> >> whole process but I'm obviously just not getting it. Here's the
>> >> encryption
>> >> function I'm using:
>> >>
>> >> Private Sub Encryptpwd()
>> >> Dim cdk As PasswordDeriveBytes = New
>> >> PasswordDeriveBytes("passwd",
>> >> Nothing)
>> >> Dim iv() As Byte = {0, 0, 0, 0, 0, 0, 0, 0}
>> >> Dim key() As Byte = cdk.CryptDeriveKey("RC2", "SHA1", 128, iv)
>> >>
>> >> Console.WriteLine(key.Length * 8)
>> >> ' Set up an RC2 object to encrypt with the derived key
>> >> Dim rc2 As RC2CryptoServiceProvider = New
>> >> RC2CryptoServiceProvider
>> >> rc2.Key = key
>> >> Dim b() As Byte = {21, 22, 23, 24, 25, 26, 27, 28}
>> >> rc2.IV = b
>> >> Dim plaintext() As Byte = Encoding.UTF8.GetBytes("iiMap")
>> >> Dim ms As New MemoryStream
>> >> Dim cs As CryptoStream = New CryptoStream(ms,
> rc2.CreateEncryptor(),
>> >> _
>> >> CryptoStreamMode.Write)
>> >> cs.Write(plaintext, 0, plaintext.Length)
>> >> cs.Close()
>> >> Dim result() As Byte = ms.ToArray()
>> >> Dim asc As New ASCIIEncoding
>> >> txtResult.Text = asc.GetString(result)
>> >> ms.Close()
>> >> End Sub
>> >>
>> >> When I try to decrypt the text that's in txtResult.Text, my result is
>> >> always
>> >> and empty string:
>> >>
>> >> Private Sub Decryptpwd()
>> >> Dim cdk As PasswordDeriveBytes = New
>> >> PasswordDeriveBytes("pa[]ss!!wo//dd", Nothing)
>> >> Dim iv() As Byte = {0, 0, 0, 0, 0, 0, 0, 0}
>> >> Dim key() As Byte = cdk.CryptDeriveKey("RC2", "SHA1", 128, iv)
>> >>
>> >> Console.WriteLine(key.Length * 8)
>> >> ' Set up an RC2 object to encrypt with the derived key
>> >> Dim rc2 As RC2CryptoServiceProvider = New
>> >> RC2CryptoServiceProvider
>> >> rc2.Key = key
>> >> Dim b() As Byte = {21, 22, 23, 24, 25, 26, 27, 28}
>> >> rc2.IV = b
>> >> Dim plaintext() As Byte = Encoding.UTF8.GetBytes(txtResult.Text)
>> >>
>> >> Dim ms As New MemoryStream
>> >> Dim cs As CryptoStream = New CryptoStream(ms,
> rc2.CreateDecryptor(),
>> >> _
>> >> CryptoStreamMode.Write)
>> >> cs.Write(plaintext, 0, plaintext.Length)
>> >> Dim result(plaintext.Length - 1) As Byte
>> >> ms.Read(result, 0, result.Length - 1)
>> >> Dim asc As New ASCIIEncoding
>> >> txtDecrypt.Text = asc.GetString(result)
>> >> cs.Close()
>> >> ms.Close()
>> >> End Sub
>> >>
>> >> I would very much appreciate someone setting me straight on this
>> >> issue.
>> >> Thanks in advance
>> >> Steve
>> >>
>> >>
>> >>
>> >
>>
>>
>
>



Relevant Pages

  • Re: Need help decrypting
    ... > string using ASCII and expect to have a usable string. ... > arbitrary byte array into a string, you need to use something like Base64. ... My goal here was to store an encrypted password in an xml file ...
    (microsoft.public.dotnet.security)
  • .NET Encryption/Decryption Problem -- Pls help
    ... I am working on some server side infrastructure where I need to encrypt some ... DESCryptoServiceProvider or I am not able to accurately convert from string ... to byte array and vice vera. ... CryptoStream objCryptoStream = new CryptoStream(objMemoryStream, ...
    (microsoft.public.dotnet.framework.aspnet.security)
  • Encryption Problem -- Urgent response requested
    ... I am working on some server side infrastructure where I need to encrypt some ... DESCryptoServiceProvider or I am not able to accurately convert from string ... to byte array and vice vera. ... CryptoStream objCryptoStream = new CryptoStream(objMemoryStream, ...
    (microsoft.public.dotnet.framework.aspnet.security)
  • Re: Java string encryption/decryption
    ... encrypted byte-array to a String before decrypting it. ... Cyphertext will contain all bytes from -128 to 127 which will ... Convert the plaintext to a byte array. ... Encrypt the byte array to produce the cyphertext as a byte array. ...
    (comp.lang.java.programmer)
  • RE: Textbox, keypress keychar, non ASCII characters
    ... characters string. ... I think the key point is the last step: how to determine a string is ascii ... get the byte array of the string, when if certain character is Unicode ... 0x3f) character in the result byte array. ...
    (microsoft.public.dotnet.framework.windowsforms.controls)