dave k
dave k

Reputation: 1389

Invalid length for a Base-64 char array

I'm getting a "Invalid length for a Base-64 char array." inside of the IF(){...} are variations i have tried to get it to work. it fails in the first line without calling decrypt(...) proving it's not that functions problem. i get the same error inside with the first decrypt(...) call. the last one using the encoding.ascii... will get me inside the function, but then it fails inside the function. I'm getting the proper encrypted info from the database to string SSnum. it's value is: 4+mFeTp3tPF

try
{
    string SSnum = dr.GetString(dr.GetOrdinal("Social Security"));
    if (isEncrypted)
    {
      byte[] temp = Convert.FromBase64String(SSnum);
      //SSnum = decrypt(Convert.FromBase64String(SSnum), Key, IV);
      //SSnum = decrypt(Encoding.ASCII.GetBytes(SSnum), Key, IV);
    }
    txt_Social_Security.Text = SSnum;
}
catch { txt_Social_Security.Text = ""; }

I've been told to use the Convert.FromBase64String() and not the ASCII method...so why is it failing, how can i fix it?

Upvotes: 8

Views: 41923

Answers (5)

Dmitry Zgursky
Dmitry Zgursky

Reputation: 1

replace

byte[] temp = Convert.FromBase64String(SSnum);

to this

var temp = UTF8Encoding.UTF8.GetBytes(SSnum);

Upvotes: -1

surbob
surbob

Reputation: 692

Base64 data length should be multiple of 4 and with padding char '=' You can change your data as valid base64 data.

string dummyData = imgData.Trim().Replace(" ", "+");
if (dummyData.Length % 4 > 0)
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
byte[] byteArray = Convert.FromBase64String(dummyData); 

https://stackoverflow.com/a/9301545/2024022

This will help you , try once. Thanks suribabu.

Upvotes: 24

Adam Robinson
Adam Robinson

Reputation: 185643

Are you certain that you have a Base64 string? Base64 is a means of encoding binary data into a string while only using standard 7-bit ASCII characters. It's not a string encoding like ASCII and has some control bytes present. You have a Base64 string if you're using Convert.ToBase64String to obtain the value (which, if you're trying to store binary data as a string, is your best bet)

Judging by your error (and your example data), I'm assuming that you do not have a Base64 string. If you need to store binary data in the database, you can either create a column using a binary type or encode the string into Base64 by using Convert.ToBase64String.

byte[] inputData = ...;

string base64String = Convert.ToBase64String(inputData);

byte[] outputData = Convert.FromBase64String(base64String);

Here, outputData should contain the same data as inputData.

If what you have is just an ASCII-encoded string, then your original practice of using System.Text.Encoding.ASCII.GetBytes() is correct, but you should change this to use a Base64 string if you can.

Upvotes: 1

Alex Zhevzhik
Alex Zhevzhik

Reputation: 3397

Are you sure that string 4+mFeTp3tPF is well-formed Base64 string? I've tried some online services - no one could convert it.

Upvotes: 0

quentin-starin
quentin-starin

Reputation: 26638

it's value is: 4+mFeTp3tPF

You are receiving this error because that value, 4+mFeTp3tPF, is in fact not valid Base64.

Is it possible you are simply missing the required padding character, as so 4+mFeTp3tPF=?

Upvotes: 15

Related Questions