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) }