public override void CryptApiData(DRIS dris, byte[] data, int length, int alg_answer)
        {
            int  i, j, k;
            var  bigseed = new byte[256];
            var  S = new byte[256];
            byte temp, t;

            for (i = 0; i < 256; i += 8)
            {
                dris.Set4Bytes(bigseed, i, dris.seed1);
                dris.Set4Bytes(bigseed, i + 4, dris.seed2);
            }
            for (i = 0; i < 256; i++)
            {
                S[i] = (byte)i;
            }
            for (i = 0, j = 0; i < 256; i++)
            {
                j    = (j + S[i] + bigseed[i] + 7) % 256;
                temp = S[i];
                S[i] = S[j];
                S[j] = temp;
            }
            for (i = 0, j = 0, k = 0; k < length; k++)
            {
                i        = (i + 1) % 256;
                j        = (j + S[i] + 71) % 256;
                temp     = S[i];
                S[i]     = S[j];
                S[j]     = temp;
                t        = (byte)(S[i] + S[j] + 16);
                data[k] ^= S[t];
            }
        }
        public override void CryptDRIS(DRIS dris)
        {
            int  i, j, k;
            var  bigseed = new byte[256];
            var  S = new byte[256];
            byte temp, t;
            var  dris_bytes = new byte[Marshal.SizeOf(dris)];

            dris.DrisToByteArray(dris, dris_bytes); // convert DRIS to byte array so we can encrypt it

            for (i = 0; i < 256; i += 8)
            {
                dris.Set4Bytes(bigseed, i, dris.seed1);
                dris.Set4Bytes(bigseed, i + 4, dris.seed2);
            }
            for (i = 0; i < 256; i++)
            {
                S[i] = (byte)i;
            }
            for (i = 0, j = 0; i < 256; i++)
            {
                j    = (j + S[i] + bigseed[i] + 11) % 256;
                temp = S[i];
                S[i] = S[j];
                S[j] = temp;
            }
            for (i = 0, j = 0, k = 16; k < Marshal.SizeOf(dris); k++)
            {
                i              = (i + 1) % 256;
                j              = (j + S[i] + 37) % 256;
                temp           = S[i];
                S[i]           = S[j];
                S[j]           = temp;
                t              = (byte)(S[i] + S[j] + 17);
                dris_bytes[k] ^= S[t];
            }
            dris.ByteArrayToDris(dris_bytes, dris); // convert it back again
        }