Beispiel #1
0
        public override byte [] EncryptValue(byte [] key)
        {
            int N   = key.Length / 8;
            int rem = key.Length % 8;

            if (rem != 0)
            {
                throw new Exception("key must be in blocks of 8");
            }

            AesNoPadding anp = new AesNoPadding(_tdcsp);

            if (N == 1)            //If N is 1
            {
                //B=AES(K)enc(0xA6A6A6A6A6A6A6A6|P(1))
                byte [] keyIv_key = ConcatBa(kwIv, key);
                byte [] B         = anp.Encrypt(keyIv_key);
                return(B);
            }
            //For i=1 to N, R(i)=P(i)
            byte [] retBa = new byte[(N + 1) * 8];
            Buffer.BlockCopy(key, 0, retBa, 8, key.Length);
            byte [] A = (byte [])kwIv.Clone();  //Set A to 0xA6A6A6A6A6A6A6A6
            byte [] R = new byte[8];
            for (int j = 0; j <= 5; j++)        //Forj=0 to 5,
            {
                for (int i = 1; i <= N; i++)    //For i=1 to N,
                {
                    long t = (long)i + (j * N); //t= i + j*N
                    Buffer.BlockCopy(retBa, i * 8, R, 0, 8);
                    byte [] A_R = ConcatBa(A, R);
                    byte [] B   = anp.Encrypt(A_R);                   //B=AES(K)enc(A|R(i))
                    for (int k = 0; k < 8; k++)
                    {
                        int xt = ((byte)((t >> ((8 * (7 - k)) & 63)) & ((long)255))); //WTF?
                        A[k] = (byte)(xt ^ B[k]);                                     //A=XOR(t,MSB(B))
                    }
                    Buffer.BlockCopy(B, 8, retBa, i * 8, 8);                          //R(i)=LSB(B)
                }
            }
            Buffer.BlockCopy(A, 0, retBa, 0, 8); //Set C(0)=A
            return(retBa);                       //For i=1 to N, C(i)=R(i)
        }