I have a triple DES shell in C #, which consists of two static functions, Encrypt and Decrypt . Sometimes Decrypt crashes with TransformFinalBlock(..., ...) , causing a Bad Data error.
- Why is this happening?
- What's the solution?
Thanks in advance.
public static string Encrypt(string toencrypt, string key, bool usehashing = true) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toencrypt); byte[] resultArray; //If hashing use get hashcode regards to your key if (usehashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); //Always release the resources and flush data // of the Cryptographic service provide. Best Practice hashmd5.Clear(); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); //set the secret key for the tripleDES algorithm tdes.Key = keyArray; //mode of operation. there are other 4 modes. //We choose ECB(Electronic code Book) tdes.Mode = CipherMode.ECB; //padding mode(if any extra byte added) tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateEncryptor(); try { //transform the specified region of bytes array to resultArray resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); } catch (System.Exception ex) { //Release resources held by TripleDes Encryptor tdes.Clear(); return ""; } //Release resources held by TripleDes Encryptor tdes.Clear(); //Return the encrypted data into unreadable string format return Convert.ToBase64String(resultArray, 0, resultArray.Length); } public static string Decrypt(string todecrypt, string key, bool usehashing = true) { byte[] keyArray; byte[] toEncryptArray; byte[] resultArray; //get the byte code of the string try { toEncryptArray = Convert.FromBase64String(todecrypt.Replace(" ", "+"));//The replace happens only when spaces exist in the string (hence not a Base64 string in the first place). } catch (System.Exception ex) { return ""; } if (usehashing) { //if hashing was used get the hash code with regards to your key MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); //release any resource held by the MD5CryptoServiceProvider hashmd5.Clear(); } else { //if hashing was not implemented get the byte code of the key keyArray = UTF8Encoding.UTF8.GetBytes(key); } TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); //set the secret key for the tripleDES algorithm tdes.Key = keyArray; //mode of operation. there are other 4 modes. //We choose ECB(Electronic code Book) tdes.Mode = CipherMode.ECB; //padding mode(if any extra byte added) tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateDecryptor(); try { resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); } catch (System.Exception ex) { //Release resources held by TripleDes Encryptor tdes.Clear(); return ""; } //Release resources held by TripleDes Encryptor tdes.Clear(); //return the Clear decrypted TEXT return UTF8Encoding.UTF8.GetString(resultArray); }
An example of a line that, after encryption, will lead to a Decrypt error is:
AgAAAA * AQAAAA * aaaaaa * jfgGTw * Ny + sHZ2PrBmdj6wVnY + sEZ2PrA2dj6wFk4GhCJOHoQqdj6x9nY + Seq * trIBAA * AAMAAA ** + L7PHiJ76M8OTV4BjXCkuDgDG2u7AcW87p1KU7KTSCKI3fYTnYAcGk1gyS62AvZO4g1FrsVbzoAnsX9Y0Ju + V9YjaYr9 + CG + pen4SEas0NjRvntv0gqU0QZOj9bjKXx1Izc9Dw1HCUqjUGBcwakQo6kBlvb2v2 / pV9dM4B3RM6m7rmaW79CSc7CC3DQjnqA5HMHC5k65pOK0KT76MzTawYQotNOk0BabTO3HpVcI8BNNjSsIP7TvtxXBmbc6TfXahw1zLTvC4iTSPnsgz0jhxvHhHD + N0cblfQhAK / nt2IZQuWGL3jW0oPpPJnjhGMWQPDLXbNwp23WUv8GXIPKevXbushYKjutmsdqJT7C1mcB45XhbYCVUVbLIja1AV831YeHqqke2msSaisg37UM + urL9EFIueUHZgZryhQUSjAhZDiHXqosoQou92RqbTK5YTqYY + zyBBzRt2r7KS3v5u9smtWMNk8Xcn42a6pFFxd6g4u0 / s / SVm7NFb2UbREvp75lBVxEQv5IIznPSHfDnLtuX8pLfrZ / AVQ + gM9AGvzBjHGNYDQJ6VhgkHOZMeuLISJXjfGX0ZPFYKd + CPObpbFlukOSlIB5epRDnuggTLnthpN06Kle + iDqz1Q96ty4mfzwuhRwxvQ7EMzTykHXxC8p9bLKMr86K / vart2D9w1g9RtyS + pekgW8lkutWWGdu1eZml / 5abNmlW5VgSJiuA9Yyrd2UNjUl6H0G2O2O2HA2O2HA2O2HA2O2HA2OKHA2OKHA2OKHA2OKHA2OKHA2OKHA2OKHA
However, most lines do not crash. This has to be something to do with the special characters that I assume.
James source share