Jump to content

Encrypt method (from decrypt method)

- - - - -

This topic has been archived. This means that you cannot reply to this topic.
2 replies to this topic

#1
mmmmmm

mmmmmm

    Newbie

  • Members
  • Pip
  • 2 posts
Hi,

In the code below there is a method called "decrypt". I am trying to reverse the code to implement the corresponding "encrypt":


public partial class Form1 : Form

{

private uint P;

private uint Q;

private uint[] _S;

char[] k = new char[0x80];



        public byte Crr

        {

            get

            {

                return 12;

            }

        }

        public byte Crb

        {

            get

            {

                return 16;

            }

        }

        public byte Crt

        {

            get

            {

                return 26;

            }

        }

        public byte Crc

        {

            get

            {

                return 4;

            }

        }


//Constructor

public Form1()

{

            this.P = 0xb7e15163;

            this.Q = 0x9e3779b9;

            this._S = new uint[this.Crt];

            k[0] = '\x0017';

            k[1] = '\x009b';

            k[2] = '\x0084';

            k[3] = '\x0096';

            k[4] = 'V';

            k[5] = '\x00f0';

            k[6] = '\x0011';

            k[7] = '\x00d1';

            k[8] = '\x0088';

            k[9] = '\x0082';

            k[10] = '\x00bc';

            k[11] = '\x00e4';

            k[12] = '\x0089';

            k[13] = 'C';

            k[14] = '\x00da';

            k[15] = '\x0091';


            setup_S(k)

}


        private void setup_S(char[] K)

        {

            int index = 0;

            int num2 = 0;

            int num3 = 0;

            int num4 = licBase.Crw / 8;

            uint[] numArray = new uint[this.Crc];

            uint num5 = 0;

            uint num6 = 0;

            for (int i = 0; i < numArray.Length; i++)

            {

                numArray[i] = 0;

            }

            index = this.Crb - 1;

            numArray[this.Crc - 1] = 0;

            while (index != -1)

            {

                numArray[index / num4] = (numArray[index / num4] << 8) + K[index];

                index--;

            }

            this._S[0] = this.P;

            for (index = 1; index < this.Crt; index++)

            {

                this._S[index] = this._S[index - 1] + this.Q;

            }

            num5 = num6 = 0;

            index = num2 = num3 = 0;

            while (num3 < (3 * this.Crt))

            {

                num5 = this._S[index] = rotLeft(this._S[index] + (num5 + num6), 3);

                num6 = numArray[num2] = rotLeft(numArray[num2] + (num5 + num6), num5 + num6);

                num3++;

                index = (index + 1) % this.Crt;

                num2 = (num2 + 1) % this.Crc;

            }

        }


        public uint rotRight(uint x, uint y)

        {

             uint num = x;

             uint num2 = x;

             for (uint i = 0; i < (y & (this.Crw - 1)); i++)

             {

                 num = num >> 1;

             }

             for (uint j = 0; j < (this.Crw - (y & (this.Crw - 1))); j++)

             {

                     num2 = num2 << 1;

             }

             return (num | num2);

        }


        public uint rotLeft(uint x, uint y)

        {

            uint num = x;

            uint num2 = x;

            for (uint i = 0; i < (y & (this.Crw - 1)); i++)

            {

                num = num << 1;

            }

            for (uint j = 0; j < (this.Crw - (y & (this.Crw - 1))); j++)

            {

                num2 = num2 >> 1;

            }

            return (num | num2);

        }


        public void decrypt(uint[] ct, uint[] pt)

        {

            uint y = ct[1];

            uint num2 = ct[0];

            for (uint i = this.Crr; i > 0; i--)

            {

                y = rotRight(y - this._S[(int)((IntPtr)((2 * i) + 1))], num2) ^ num2;

                num2 = rotRight(num2 - this._S[(int)((IntPtr)(2 * i))], y) ^ y;

            }


            pt[1] = y - this._S[1];

            pt[0] = num2 - this._S[0];

        }


        [B]public void encrypt(uint[] ct, uint[] pt)

        {

            //  HELP NEEDED

        }[/B]



}


}

I am having a hard time trying to reverse the XOR in the decrypt method. If anyone can help I would highly appreciate it.

Thank you.

#2
ArekBulski

ArekBulski

    Speaks fluent binary

  • Members
  • PipPipPipPipPipPipPipPip
  • 1,376 posts
Yare yare, this code is long and nasty. If it is some well known algorithm then you would have a shortcut, but I assume it is not.

Quote

I am having a hard time trying to reverse the XOR in the decrypt method.

XOR is reversed by XOR. Some simple equation:

A xor B = C
C xor B = A

#3
mmmmmm

mmmmmm

    Newbie

  • Members
  • Pip
  • 2 posts
Thank you ArekBulski for your reply.
I will implement the method to see if I get it right.

Thanks again.