Invalid length for a Base-64 char array+RijndaelManaged/Encryption
Posted by kiranpatils on March 13, 2008
I am playing with Encryption/Decryption. and its good experience. Actually i have to encrypt a Guid and have to pass it in Querystring and have to get that Querystring and again have to decrypt data based on Querystring so i will get my origianal GUI.
First My Code looks like this:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;
namespace RfcDemoPwdGenerator
{
class Helper
{
private static string password = “ABC”;
private static int iterations = 1024;
private static byte[] salt = Encoding.ASCII.GetBytes(“This is My Salt value”);
/// <summary>
/// this function will take a plaintext as an arg and
/// returns ciphertext as an O/P
/// </summary>
/// <param name=”plaintext”></param>
/// <returns></returns>
public static string Encrypt(string plaintext)
{
Rfc2898DeriveBytes KeyBytes = new Rfc2898DeriveBytes(password, salt, iterations);
//The deafault iteration count is 1000
RijndaelManaged alg = new RijndaelManaged();
alg.Key = KeyBytes.GetBytes(32);
alg.IV = KeyBytes.GetBytes(16);
MemoryStream encryptStream = new MemoryStream();
//Stream to write
CryptoStream encrypt = new CryptoStream(encryptStream, alg.CreateEncryptor(), CryptoStreamMode.Write);
//convert plain text to byte array
byte[] data = Encoding.UTF8.GetBytes(plaintext);
encrypt.Write(data, 0, data.Length); //data to encrypt,start,stop
encrypt.FlushFinalBlock();//Clear buffer
encrypt.Close();
return Convert.ToBase64String(encryptStream.ToArray());//return encrypted data
}
/// <summary>
/// this function will take a ciphertext as an arg and
/// returns plaintext as an O/P
/// </summary>
/// <param name=”plaintext”></param>
/// <returns></returns>
public static string Decrypt(string ciphertext)
{
Rfc2898DeriveBytes KeyBytes = new Rfc2898DeriveBytes(password, salt, iterations);
//The deafault iteration count is 1000
RijndaelManaged alg = new RijndaelManaged();
alg.Key = KeyBytes.GetBytes(32);
alg.IV = KeyBytes.GetBytes(16);
MemoryStream decryptStream = new MemoryStream();
//Stream to read
CryptoStream decrypt = new CryptoStream(decryptStream, alg.CreateDecryptor(), CryptoStreamMode.Write);
//convert plain text to byte array
byte[] data = Convert.FromBase64String(ciphertext); //This guy was throwing an error Invalid length for a Base-64 char array
decrypt.Write(data, 0, data.Length); //data to encrypt,start,stop
decrypt.Flush();
decrypt.Close();
return Encoding.UTF8.GetString(decryptStream.ToArray());//return PlainText
}
}
}
Solution
Why this Error?
Sometime it works fine and sometime it fails. It made me frustrated..googled it too..then also
.
so started noting down Plaintext,URL String,Cipher text and at last got the solution and root of problem. getting excited to know it..here it is…
*********THE SOLUTION**********
Plain Text[My guid] = 72e3f882-9e0e-434f-bf51-28cffc1903c1
Cipher TEXT[generatd by my Encrypt block] = 5NGETiEwyYy3F+P+QnzkRUeB5l7xUTRJuhhGZmFwi5WxCfeo3+kCvTs0z9s+CnZW
Querystring[encrypted guid] = 5NGETiEwyYy3F P QnzkRUeB5l7xUTRJuhhGZmFwi5WxCfeo3 kCvTs0z9s CnZW
Have you seen the change in Querystring???
My Cipher contains “+” and when i pass it in Querystring it ” ” it passes[space]…
That’s the solution dude….
so for solving it just have to change the following block of Decrypt string
byte[] data = Convert.FromBase64String(ciphertext); //OLD ONE
byte[] data = Convert.FromBase64String(ciphertext.Replace(” “,”+”)); //NEW ONE
Hope it wiill save your time which i had wasted/invested…
Happy Encrypting/Decrypting!!!
Resource: http://blogs.msdn.com/shawnfa/archive/2005/11/10/491431.aspx


Jason said
THANK YOU!
I’ve been trying to figure this out all day. Worled like a charm!
Rana Faisal Munir said
Hi,
Thanks a lot. I facing this problem and try my best, but no solutions found. You give the exact solution that solve my problem. I am very thankful and pray for you.
Thanks
Rana Faisal Munir
Nishant said
hi thanks for the solution
Nishant said
byte[] getpassword = Convert.FromBase64String(data2Decrypt);
Sandeep said
THANK YOU!
Amol said
Thats perfect…I saved so much of time…
Thank you Kiran…and keep up the good work
Harry said
Hi,
Really useful information….tnx buddy.
Geraldo said
OH MY GODNESS!!!! Thank you very much!
Like others, I spend all day long trying to get this thing to work. Your solution worked (I hope for all cases, not tested yet).
Thanks again!
pjavieryb said
this solution is very good
.Net Champ said
THANKS!! Just saved me about 2 hours!!
Mohit Bhardwaj said
Thanks man. I knew something is getting changed in querysting but couldn’t find it. Thanks a lot.
SteelerE said
Thank you so much for this. I was losing my hair working on the same exact issue.
Himanshu said
Your solution is Excellent
I love you
U know meaning of “Hustle” “Loyalty” and “Respect”
just in decrypt data: in RIJINDALS ALGO——
Decrypt old=> byte[] getpassword = Convert.FromBase64String(data2Decrypt);
Decrypt New=>byte[] getpassword = Convert.FromBase64String(data2Decrypt.Replace(” “,”+”));
Thanks once again ,
I was spoil my one day before
kiranpatils said
Thanks,
Your comments really stimulates me to do a good job!
Thanks for boosting me
Happy Programming
I just know that programming should be fun
. And when you get issue(s) like this the fun should not lost — this is the main purpose of my post(s).
Cheers,
Kiran Patil
Arnik said
thanx a lot ….i was about to deploy the solution on staging server and this error popped up……
but wen i read through this post it just saved my time and did not made me more frustrated…………
thanx again
Yogini said
Thankssssssssss
Scott said
Good job. This was the same issue I was having. Thanks for saving me a few hours of grief.
Swagat said
Hi All,
I have face a same problem like above, but little twist on scenario,
Pls see the below error report, and af anybody can give there input that would be great
*****************************************************************
The following application error was encountered. MESSAGE: Invalid length for a Base-64 char array.
SOURCE: mscorlib
FORM: __EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2fwEPDwUKLTg0MTk0NjM3Mg9kFgJmD2QWAgIDD2QWBAIDDw8WAh4EVGV4dAUQT2N0b2JlciAyNywgMjAwOWRkAg0PZBYOAgEPDxYCHwAFTkZyb20gdGhlIENlbGVudCBCbG9nOiBQaXRuZXkgQm93ZXPigJkgUkRDIEluaXRpYXRpdmUgLSB3aGVuIHdpbGwgYmFua3MgZW5nYWdlP2RkAgMPDxYCHwAFFUZyaWRheSwgSnVseSAyNCwgMjAwOWRkAgUPDxYCHwAFFENlbGVudCAgLyAgQm9iIE1lYXJhZGQCBw8PFgIfAAXTATxhIG9uY2xpY2s9ImphdmFzY3JpcHQ6T3BlbkVtYWlsKCdGcm9tIHRoZSBDZWxlbnQgQmxvZzogUGl0bmV5IEJvd2Vz4oCZIFJEQyBJbml0aWF0aXZlIC0gd2hlbiB3aWxsIGJhbmtzIGVuZ2FnZT8nKTsiIGhyZWY9IiMiIHN0eWxlPSJjdXJzb3I6IGhhbmQ7Ij48aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbW1vbi9lbWFpbC5naWYiIGFsdD0iRW1haWwgQXJ0aWNsZSIvPjwvYT5kZAIJDw8WAh8ABXhQaXRuZXkgQm93ZXMgYW5kIEphY2sgSGVucnkgJiBBc3NvY2lhdGVzIChKSEEpIGhhdmUgdGVhbWVkIHVwIHRvIG9mZmVyIHJlbW90ZSBkZXBvc2l0IGNhcHR1cmUgKFJEQykgdG8gc21hbGwgYnVzaW5lc3Nlcy5kZAILDw8WAh8ABd0IRnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL2JhbmtpbmdibG9nLmNlbGVudC5jb20vP3A9NzQ2Ij5DZWxlbnQgQmFua2luZyBCbG9nPC9hPjxicj5BdXRob3I6IEJvYiBNZWFyYTxicj48YnI%2bUGl0bmV5IEJvd2VzIGFuZCBKYWNrIEhlbnJ5ICZhbXA7IEFzc29jaWF0ZXMgKEpIQSkgaGF2ZSB0ZWFtZWQgdXAgdG8gb2ZmZXIgcmVtb3RlIGRlcG9zaXQgY2FwdHVyZSAoUkRDKSB0byBzbWFsbCBidXNpbmVzc2VzLiBKSEEmIzgyMTc7cyBQcm9maXRTdGFycyBkaXZpc2lvbiBpcyBwcm92aWRpbmcgdGhlIHNvbHV0aW9uLiBUaGUgcmVsYXRpb25zaGlwIHdhcyBhbm5vdW5jZWQgaW4gTWF5LiBFLW1haWwgbWFya2V0aW5nIGhhcyBiZWd1biBhbW9uZyBQaXRuZXkgQm93ZXMgaW5zdGFsbGVkIGJhc2Ugb2YgcG9zdGFsIG1ldGVyIGN1c3RvbWVycy4gVGhlIGJhbmstbmV1dHJhbCBzb2x1dGlvbiBicmFuZGVkIENsaWNrIERlcG9zaXQgcHJvdmlkZXMgYnVuZGxlZCBzY2FubmVyIGZ1bGZpbGxtZW50IHN1cHBvcnQgYW5kIHByb2Nlc3NpbmcgZm9yIGEgbW9udGhseSBmZWUgc3RhcnRpbmcgYXQgJDM5Ljk1LiBUaGUgbG93ZXN0IGNvc3Qgb3B0aW9uIHN1cHBvcnRzIHVwIHRvIDE1MCBjaGVja3MgcGVyIG1vbnRoLiBCdXNpbmVzc2VzIGhhdmluZyBoaWdoZXIgY2hlY2sgdm9sdW1lcyB3b3VsZCBiZSBpbnZpdGVkIHRvIGpvaW4gYXQgaGlnaGVyIG1vbnRobHkgcmF0ZXMgJiM4MjExOyBhcyBoaWdoIGFzICQxNDkuOTUgd2l0aCBzZXZlcmFsIG9wdGlvbnMgaW4gYmV0d2Vlbi4gQWxsIHBsYW5zIHJlcXVpcmUgYSAzLXllYXIgY29tbWl0bWVudCB3aGljaCBpbmNsdWRlcyBsZWFzaW5nIHRoZSBQYW5pbmkgTXlWaXNpb25YLTMwIHNjYW5uZXIuIFRoZSBzb2x1dGlvbiBvcHRpb25hbGx5IHByb3ZpZGVzIGFuIEFSIGV4dHJhY3Qgc3VpdGFibGUgZm9yIFF1aWNrQm9va3MgdXNlcnMuLi4uPGJyPjxicj48ZGl2IGFsaWduPSJjZW50ZXIiPjxhIGhyZWY9Imh0dHA6Ly9iYW5raW5nYmxvZy5jZWxlbnQuY29tLz9wPTc0NiI%2bPHU%2bPGI%2bUmVhZCB0aGUgZnVsbCBhcnRpY2xlIGF0IHRoZSBDZWxlbnQgQmFua2luZyBCbG9nIGJ5IGNsaWNraW5nIGhlcmUuPC9iPjwvdT48YnI%2bPC9hPjwvZGl2PmRkAg0PZBYEAgEPDxYCHgdWaXNpYmxlaGRkAgMPDxYCHwBlZGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFNGN0bDAwJG1haW5Db250ZW50JG5ld3NDb21tZW50Rm9ybSRyZW1lbWJlck1lQ2hlY2tCb3g%3d&__EVENTVALIDATION=3&ctl00%24searchTermBox=oDySEzKhSwVeZGa&ctl00%24mainContent%24newsCommentForm%24cUserTextBox=UBUNNa++%3ca+href%3d%22http%3a%2f%2fwvtcgfghreqm.com%2f%22%3ewvtcgfghreqm%3c%2fa%3e%2c+%5burl%3dhttp%3a%2f%2fypjyiiodmtvg.com%2f%5dypjyiiodmtvg%5b%2furl%5d%2c+%5blink%3dhttp%3a%2f%2fhaxvybcpegan.com%2f%5dhaxvybcpegan%5b%2flink%5d%2c+http%3a%2f%2fxmdjjjnyfvvj.com%2f&ctl00%24mainContent%24newsCommentForm%24cPassTextBox=&ctl00%24mainContent%24newsCommentForm%24commentTextBox=UBUNNa++%3ca+href%3d%22http%3a%2f%2fwvtcgfghreqm.com%2f%22%3ewvtcgfghreqm%3c%2fa%3e%2c+%5burl%3dhttp%3a%2f%2fypjyiiodmtvg.com%2f%5dypjyiiodmtvg%5b%2furl%5d%2c+%5blink%3dhttp%3a%2f%2fhaxvybcpegan.com%2f%5dhaxvybcpegan%5b%2flink%5d%2c+http%3a%2f%2fxmdjjjnyfvvj.com%2f&ctl00%24mainContent%24newsCommentForm%24submitCommentButton=Submit+Comment
QUERYSTRING: aid=24700
TARGETSITE: Byte[] FromBase64String(System.String)
STACKTRACE: at System.Convert.FromBase64String(String s) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) at System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded()
Server: WEB15
Alert Time: 10/27/2009 7:59:25 AM
************************************************************
Haresh M Ambaliya said
Hi,
Excellent solution of problem.
Thanks, I also got the error and i have started googling and found best solution as u given.
Thanks again.
Sekhar Singara said
This is excelent solution………
Thanks
Zondre said
Thank you, this fixed a problem I was sometimes having with my e-mail verification.
steve patrick said
Awesome! Saved me some time here – thanks!
Max said
Great solution. You definitely saved me a load of time!
kiranpatils said
Thanks Max!
Thanks for visiting the blog!
Sincerely,
Kiran Patil
Ali said
Thanks for sharing, you save my time.
That’s great
Dhaarani Vd said
i am getting another error even after replacing with the new code and the error is
String cannot be of zero length.
Parameter name: oldValue
Balva said
its not worked…………