Inheritance: IBlockCipher
コード例 #1
0
        private static uint Inv_Mcol(uint x)
        {
            uint num  = AesLightEngine.FFmulX(x);
            uint num2 = AesLightEngine.FFmulX(num);
            uint num3 = AesLightEngine.FFmulX(num2);
            uint num4 = x ^ num3;

            return(num ^ num2 ^ num3 ^ AesLightEngine.Shift(num ^ num4, 8) ^ AesLightEngine.Shift(num2 ^ num4, 16) ^ AesLightEngine.Shift(num4, 24));
        }
コード例 #2
0
        private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
        {
            int num = key.Length / 4;

            if (num != 4 && num != 6 && num != 8)
            {
                throw new ArgumentException("Key length not 128/192/256 bits.");
            }
            this.ROUNDS = num + 6;
            uint[][] array = new uint[this.ROUNDS + 1][];
            for (int i = 0; i <= this.ROUNDS; i++)
            {
                array[i] = new uint[4];
            }
            int num2 = 0;
            int j    = 0;

            while (j < key.Length)
            {
                array[num2 >> 2][num2 & 3] = Pack.LE_To_UInt32(key, j);
                j += 4;
                num2++;
            }
            int num3 = this.ROUNDS + 1 << 2;

            for (int k = num; k < num3; k++)
            {
                uint num4 = array[k - 1 >> 2][k - 1 & 3];
                if (k % num == 0)
                {
                    num4 = (AesLightEngine.SubWord(AesLightEngine.Shift(num4, 8)) ^ (uint)AesLightEngine.rcon[k / num - 1]);
                }
                else if (num > 6 && k % num == 4)
                {
                    num4 = AesLightEngine.SubWord(num4);
                }
                array[k >> 2][k & 3] = (array[k - num >> 2][k - num & 3] ^ num4);
            }
            if (!forEncryption)
            {
                for (int l = 1; l < this.ROUNDS; l++)
                {
                    uint[] array2 = array[l];
                    for (int m = 0; m < 4; m++)
                    {
                        array2[m] = AesLightEngine.Inv_Mcol(array2[m]);
                    }
                }
            }
            return(array);
        }
コード例 #3
0
        private void DecryptBlock(uint[][] KW)
        {
            uint[] array = KW[this.ROUNDS];
            uint   num   = this.C0 ^ array[0];
            uint   num2  = this.C1 ^ array[1];
            uint   num3  = this.C2 ^ array[2];
            uint   num4  = this.C3 ^ array[3];
            int    i     = this.ROUNDS - 1;
            uint   num5;
            uint   num6;
            uint   num7;

            while (i > 1)
            {
                array = KW[i--];
                num5  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 24 & 255u))] << 24)) ^ array[0]);
                num6  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num2 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 24 & 255u))] << 24)) ^ array[1]);
                num7  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num3 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
                num4  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 24 & 255u))] << 24)) ^ array[3]);
                array = KW[i--];
                num   = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num5 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 24 & 255u))] << 24)) ^ array[0]);
                num2  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num6 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 24 & 255u))] << 24)) ^ array[1]);
                num3  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num7 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
                num4  = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 24 & 255u))] << 24)) ^ array[3]);
            }
            array   = KW[1];
            num5    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 24 & 255u))] << 24)) ^ array[0]);
            num6    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num2 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 24 & 255u))] << 24)) ^ array[1]);
            num7    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num3 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24)) ^ array[2]);
            num4    = (AesLightEngine.Inv_Mcol((uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num3 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num2 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num >> 24 & 255u))] << 24)) ^ array[3]);
            array   = KW[0];
            this.C0 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num5 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 24 & 255u))] << 24 ^ (int)array[0]);
            this.C1 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num6 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 24 & 255u))] << 24 ^ (int)array[1]);
            this.C2 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num7 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num4 >> 24 & 255u))] << 24 ^ (int)array[2]);
            this.C3 = (uint)((int)AesLightEngine.Si[(int)((UIntPtr)(num4 & 255u))] ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num7 >> 8 & 255u))] << 8 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num6 >> 16 & 255u))] << 16 ^ (int)AesLightEngine.Si[(int)((UIntPtr)(num5 >> 24 & 255u))] << 24 ^ (int)array[3]);
        }
コード例 #4
0
        private static uint Mcol(uint x)
        {
            uint num = AesLightEngine.FFmulX(x);

            return(num ^ AesLightEngine.Shift(x ^ num, 8) ^ AesLightEngine.Shift(x, 16) ^ AesLightEngine.Shift(x, 24));
        }
コード例 #5
0
ファイル: AWiz.cs プロジェクト: burstas/rmps
        private BufferedBlockCipher CreateScryptoEngine()
        {
            IBlockCipher engine;
            switch (_MSec.Algorithm)
            {
                case ESec.SCRYPTO_AES:
                    engine = new AesEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_AESFAST:
                    engine = new AesFastEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_AESLIGHT:
                    engine = new AesLightEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_BLOWFISH:
                    engine = new BlowfishEngine();
                    _MSec.KeySize = 56;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_CAMELLIA:
                    engine = new CamelliaEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_CAMELLIALIGHT:
                    engine = new CamelliaLightEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_CAST5:
                    engine = new Cast5Engine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_CAST6:
                    engine = new Cast6Engine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_DES:
                    engine = new DesEngine();
                    _MSec.KeySize = 8;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_DESEDE:
                    engine = new DesEdeEngine();
                    _MSec.KeySize = 24;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_GOST28147:
                    engine = new Gost28147Engine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_NOEKEON:
                    engine = new NoekeonEngine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_NULL:
                    engine = new NullEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 16;
                    break;
                case ESec.SCRYPTO_RC2:
                    engine = new RC2Engine();
                    _MSec.KeySize = 128;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_RC532:
                    engine = new RC532Engine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_RC564:
                    engine = new RC564Engine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_RC6:
                    engine = new RC6Engine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_RIJNDAEL:
                    engine = new RijndaelEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_SEED:
                    engine = new SeedEngine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_SERPENT:
                    engine = new SerpentEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_SKIPJACK:
                    engine = new SkipjackEngine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_TEA:
                    engine = new TeaEngine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_TWOFISH:
                    engine = new TwofishEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
                case ESec.SCRYPTO_XTEA:
                    engine = new XteaEngine();
                    _MSec.KeySize = 16;
                    _MSec.IVSize = 0;
                    break;
                default:
                    engine = new AesEngine();
                    _MSec.KeySize = 32;
                    _MSec.IVSize = 0;
                    break;
            }

            switch (_MSec.Mode)
            {
                case ESec.MODE_CBC:
                    engine = new CbcBlockCipher(engine);
                    break;
                case ESec.MODE_CFB:
                    engine = new CfbBlockCipher(engine, 8);
                    break;
                case ESec.MODE_GOFB:
                    engine = new GOfbBlockCipher(engine);
                    break;
                case ESec.MODE_OFB:
                    engine = new OfbBlockCipher(engine, 8);
                    break;
                case ESec.MODE_OPENPGPCFB:
                    engine = new OpenPgpCfbBlockCipher(engine);
                    break;
                case ESec.MODE_SIC:
                    engine = new SicBlockCipher(engine);
                    break;
                default:
                    engine = new CbcBlockCipher(engine);
                    break;
            }

            IBlockCipherPadding padding = null;
            switch (_MSec.Padding)
            {
                case ESec.PADDING_ISO10126d2:
                    padding = new ISO10126d2Padding();
                    break;
                case ESec.PADDING_ISO7816d4:
                    padding = new ISO7816d4Padding();
                    break;
                case ESec.PADDING_PKCS7:
                    padding = new Pkcs7Padding();
                    break;
                case ESec.PADDING_TBC:
                    padding = new TbcPadding();
                    break;
                case ESec.PADDING_X923:
                    padding = new X923Padding();
                    break;
                case ESec.PADDING_ZEROBYTE:
                    padding = new ZeroBytePadding();
                    break;
                default:
                    padding = new Pkcs7Padding();
                    break;
            }

            return new PaddedBufferedBlockCipher(engine, padding);
        }