Samia Souror

Samia Souror

  • NA
  • 33
  • 5.2k

Index was outside the bounds of the array

Nov 21 2018 7:38 AM
Hi,
 
I'm trying to encrypt a field in my local database table using my own algorithm. encryption is done well. but decryption produces to me an exception error
 
Exception thrown: 'System.IndexOutOfRangeException'
 
my code is
  1. private void button10_Click(object sender, EventArgs e)  
  2. {  
  3. OracleConnection conn;  
  4. String VtextKey = this.txtKey.Text;  
  5. using (conn = new OracleConnection(oradb))  
  6. {  
  7. OracleCommand select = new OracleCommand("select empno,ENAME,job from emp", conn);  
  8. conn.Open();  
  9. OracleDataReader reader = select.ExecuteReader();  
  10. Int64 vempno = 0;  
  11. String EnameValue = "";  
  12. String jobValue = "";  
  13. String DecryptEname = "";  
  14. String Decryptjob = "";  
  15. if (reader.HasRows)  
  16. {  
  17. while (reader.Read())  
  18. {  
  19. vempno = reader.GetInt64(0);  
  20. EnameValue = reader.GetString(1);  
  21. jobValue = reader.GetString(2);  
  22. Enigma enigma = new Enigma();  
  23. DecryptEname = enigma.Decrypt(EnameValue, VtextKey);  
  24. OracleCommand update = new OracleCommand("update emp set ename =:fname, job =:job where empno =:empno", conn);  
  25. OracleParameter ename = new OracleParameter("ename", DecryptEname);  
  26. OracleParameter job = new OracleParameter("job", Decryptjob);  
  27. OracleParameter empno = new OracleParameter("empno", vempno);  
  28. update.Parameters.Add(ename);  
  29. update.Parameters.Add(job);  
  30. update.Parameters.Add(empno);  
  31. update.ExecuteNonQuery();  
  32. }  
  33. MessageBox.Show("User updated!");  
  34. OracleDataAdapter a = new OracleDataAdapter("SELECT * FROM emp", conn);  
  35. DataTable t = new DataTable();  
  36. a.Fill(t);  
  37. dataGridView1.DataSource = t;  
  38. reader.Close();  
  39. }  
  40. }  
  41. }  
  42. and the exception error is on this line  
  43. PlainBytes[i / 2] = (byte)(((Cipher ^ ((Left) ? LeftHash[Mapping] : RightHash[Mapping]))));  
  44. this is the decryption function  
  45. public String Decrypt(String EncryptedText, String Key)  
  46. {  
  47. String PlainText = "";  
  48. Byte[] PlainBytes = new Byte[CipherText.Length / 2];  
  49. MD5 HashGenerator = MD5.Create();  
  50. Byte[] KeyHashBytes = HashGenerator.ComputeHash(Encoding.UTF8.GetBytes(Key));  
  51. StringBuilder Builder = new StringBuilder();  
  52. for (int i = 0; i < KeyHashBytes.Length; i++)  
  53. {  
  54. Builder.Append(KeyHashBytes[i].ToString("x2"));  
  55. }  
  56. String KeyHashString = Builder.ToString();  
  57. String[] KeyHashChunks = new String[2];  
  58. KeyHashChunks[0] = KeyHashString.Substring(0, 16);  
  59. KeyHashChunks[1] = KeyHashString.Substring(16);  
  60. Byte[] LeftHash = Encoding.ASCII.GetBytes(KeyHashChunks[0]);  
  61. Byte[] RightHash = Encoding.ASCII.GetBytes(KeyHashChunks[1]);  
  62. Byte[] EncryptedBytes = Encoding.ASCII.GetBytes(EncryptedText);  
  63. for (int i = 0; i < (EncryptedBytes.Length-1); i += 2)  
  64. {  
  65. Byte Cipher = EncryptedBytes[i];  
  66. Byte Meta = EncryptedBytes[i + 1];  
  67. Meta = (byte)((int)Meta - 33);  
  68. Cipher = (byte)((int)Cipher - 33);  
  69. int Remains = ((int)Meta > 32) ? 1 : 0;  
  70. Meta = (Remains == 1) ? (byte)((int)Meta - 32) : Meta;  
  71. Boolean Left = ((int)Meta > 16) ? false : true;  
  72. Meta = (Left) ? Meta : (byte)((int)Meta - 16);  
  73. int Mapping = (int)Meta;  
  74. Cipher = (byte)(((int)Cipher * 2) + Remains);  
  75. PlainBytes[i / 2] = (byte)(((Cipher ^ ((Left) ? LeftHash[Mapping] : RightHash[Mapping]))));  
  76. }  
  77. PlainText = Encoding.ASCII.GetString(PlainBytes);  
  78. return PlainText;  
  79. }  

Answers (3)