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
- private void button10_Click(object sender, EventArgs e)
- {
- OracleConnection conn;
- String VtextKey = this.txtKey.Text;
- using (conn = new OracleConnection(oradb))
- {
- OracleCommand select = new OracleCommand("select empno,ENAME,job from emp", conn);
- conn.Open();
- OracleDataReader reader = select.ExecuteReader();
- Int64 vempno = 0;
- String EnameValue = "";
- String jobValue = "";
- String DecryptEname = "";
- String Decryptjob = "";
- if (reader.HasRows)
- {
- while (reader.Read())
- {
- vempno = reader.GetInt64(0);
- EnameValue = reader.GetString(1);
- jobValue = reader.GetString(2);
- Enigma enigma = new Enigma();
- DecryptEname = enigma.Decrypt(EnameValue, VtextKey);
- OracleCommand update = new OracleCommand("update emp set ename =:fname, job =:job where empno =:empno", conn);
- OracleParameter ename = new OracleParameter("ename", DecryptEname);
- OracleParameter job = new OracleParameter("job", Decryptjob);
- OracleParameter empno = new OracleParameter("empno", vempno);
- update.Parameters.Add(ename);
- update.Parameters.Add(job);
- update.Parameters.Add(empno);
- update.ExecuteNonQuery();
- }
- MessageBox.Show("User updated!");
- OracleDataAdapter a = new OracleDataAdapter("SELECT * FROM emp", conn);
- DataTable t = new DataTable();
- a.Fill(t);
- dataGridView1.DataSource = t;
- reader.Close();
- }
- }
- }
- and the exception error is on this line
- PlainBytes[i / 2] = (byte)(((Cipher ^ ((Left) ? LeftHash[Mapping] : RightHash[Mapping]))));
- this is the decryption function
- public String Decrypt(String EncryptedText, String Key)
- {
- String PlainText = "";
- Byte[] PlainBytes = new Byte[CipherText.Length / 2];
- MD5 HashGenerator = MD5.Create();
- Byte[] KeyHashBytes = HashGenerator.ComputeHash(Encoding.UTF8.GetBytes(Key));
- StringBuilder Builder = new StringBuilder();
- for (int i = 0; i < KeyHashBytes.Length; i++)
- {
- Builder.Append(KeyHashBytes[i].ToString("x2"));
- }
- String KeyHashString = Builder.ToString();
- String[] KeyHashChunks = new String[2];
- KeyHashChunks[0] = KeyHashString.Substring(0, 16);
- KeyHashChunks[1] = KeyHashString.Substring(16);
- Byte[] LeftHash = Encoding.ASCII.GetBytes(KeyHashChunks[0]);
- Byte[] RightHash = Encoding.ASCII.GetBytes(KeyHashChunks[1]);
- Byte[] EncryptedBytes = Encoding.ASCII.GetBytes(EncryptedText);
- for (int i = 0; i < (EncryptedBytes.Length-1); i += 2)
- {
- Byte Cipher = EncryptedBytes[i];
- Byte Meta = EncryptedBytes[i + 1];
- Meta = (byte)((int)Meta - 33);
- Cipher = (byte)((int)Cipher - 33);
- int Remains = ((int)Meta > 32) ? 1 : 0;
- Meta = (Remains == 1) ? (byte)((int)Meta - 32) : Meta;
- Boolean Left = ((int)Meta > 16) ? false : true;
- Meta = (Left) ? Meta : (byte)((int)Meta - 16);
- int Mapping = (int)Meta;
- Cipher = (byte)(((int)Cipher * 2) + Remains);
- PlainBytes[i / 2] = (byte)(((Cipher ^ ((Left) ? LeftHash[Mapping] : RightHash[Mapping]))));
- }
- PlainText = Encoding.ASCII.GetString(PlainBytes);
- return PlainText;
- }