Tuesday, January 3, 2017

Kriptosistem Simetris Menggunakan C#.NET (Bagian 2)


Kriptosistem Simetris Menggunakan C#.NET (Bagian 2)



1.10 Kriptosistem BlowFish/TwoFish dan Lainnya





using System;
using System.Diagnostics;
using System.Security.Cryptography;

namespace Twofish_NET
{
        public sealed class Twofish : SymmetricAlgorithm
        {
                public Twofish()
                {
                        this.LegalKeySizesValue = new KeySizes[]{new KeySizes(128,256,64)};

                        this.LegalBlockSizesValue = new KeySizes[]{new KeySizes(128,128,0)};

                        this.BlockSize = 128;
                        this.KeySize = 128;

                        this.Padding = PaddingMode.Zeros;

                        this.Mode = CipherMode.ECB;

                }

                public override ICryptoTransform CreateEncryptor(byte[] key, byte[] iv)
                {
                        Key = key; // this appears to make a new copy

                        if (Mode == CipherMode.CBC)
                                IV = iv;
                       
                        return new TwofishEncryption(KeySize, ref KeyValue, ref IVValue,
                                ModeValue, TwofishBasis.ArahEnkripsi.Mengenkripsi);
                }

                public override ICryptoTransform CreateDecryptor(byte[] kunci, byte[] iv)
                {
                        Key = kunci;

                        if (Mode == CipherMode.CBC)
                                IV = iv;

                        return new TwofishEncryption(KeySize, ref KeyValue, ref IVValue,
                                ModeValue, TwofishBasis.ArahEnkripsi.Mendekripsi);
                }

                public override void GenerateIV()
                {
                        IV = new byte[16]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                }

                public override void GenerateKey()
                {
                        Key = new byte[KeySize/8];

                        for (int i=Key.GetLowerBound(0);i<Key.GetUpperBound(0);i++)
                        {
                                Key[i]=0;
                        }
                }

                public override CipherMode Mode
                {
                        set
                        {
                                switch (value)
                                {
                                        case CipherMode.CBC:
                                                break;
                                        case CipherMode.ECB:
                                                break;
                                        default:
                                                throw (new CryptographicException("CipherMode  
                                                        tidak didukung."));
                                }
                                this.ModeValue = value;
                        }
                }

        }
}



using System;
using System.Diagnostics;
using System.Security.Cryptography;

namespace Twofish_NET
{

        internal class TwofishBasis
        {
                public enum ArahEnkripsi
                {
                        Mengenkripsi,
                        Mendekripsi
                }

                public TwofishBasis()
                {
                }

                protected int masukanUkuranBlok = UKURAN_BLOK/8;
                protected int keluaranUkuranBlok = UKURAN_BLOK/8;

                private static uint f32(uint x,ref uint[] k32,int kunciPjg)
                {
                        byte[]  b = {b0(x),b1(x),b2(x),b3(x)};

                        switch (((kunciPjg + 63)/64) & 3)
                        {
                                case 0:        
                                b[0] = (byte)(P8x8[P_04,b[0]] ^ b0(k32[3]));
                                b[1] = (byte)(P8x8[P_14,b[1]] ^ b1(k32[3]));
                                b[2] = (byte)(P8x8[P_24,b[2]] ^ b2(k32[3]));
                                b[3] = (byte)(P8x8[P_34,b[3]] ^ b3(k32[3]));

                                goto case 3;
                                case 3:        
                                b[0] = (byte)(P8x8[P_03,b[0]] ^ b0(k32[2]));
                                b[1] = (byte)(P8x8[P_13,b[1]] ^ b1(k32[2]));
                                b[2] = (byte)(P8x8[P_23,b[2]] ^ b2(k32[2]));
                                b[3] = (byte)(P8x8[P_33,b[3]] ^ b3(k32[2]));

                                goto case 2;
                                case 2:
                                b[0] = P8x8[P_00, P8x8[P_01, P8x8[P_02, b[0]] ^ b0(k32[1])] ^ b0(k32[0])];
                                b[1] = P8x8[P_10, P8x8[P_11, P8x8[P_12, b[1]] ^ b1(k32[1])] ^ b1(k32[0])];
                                b[2] = P8x8[P_20, P8x8[P_21, P8x8[P_22, b[2]] ^ b2(k32[1])] ^ b2(k32[0])];
                                b[3] = P8x8[P_30, P8x8[P_31, P8x8[P_32, b[3]] ^ b3(k32[1])] ^ b3(k32[0])];
                                break;
                        }

                        return  (uint)((M00(b[0]) ^ M01(b[1]) ^ M02(b[2]) ^ M03(b[3]))) ^
                        (uint)((M10(b[0]) ^ M11(b[1]) ^ M12(b[2]) ^ M13(b[3])) <<  8) ^
                        (uint)((M20(b[0]) ^ M21(b[1]) ^ M22(b[2]) ^ M23(b[3])) << 16) ^
                        (uint)((M30(b[0]) ^ M31(b[1]) ^ M32(b[2]) ^ M33(b[3])) << 24) ;
                }

                protected bool reKey(int kunciPjg, ref uint[] kunci32)
                {
                        int i, k64Hit;
                        kunciPanjang      = kunciPjg;
                        putaran = jumPutaran[(kunciPjg-1)/64];
                        int             subkeyCnt = PUTARAN_SUBKUNCI + 2*putaran;
                        uint    A,B;
                        uint[] k32e = new uint[BIT_KUNCI_MAKS/64];
                        uint[] k32o = new uint[BIT_KUNCI_MAKS/64];
                       
                        k64Hit=(kunciPjg+63)/64;               
                        for (i=0;i<k64Hit;i++)
                        {              
                                k32e[i]=kunci32[2*i  ];
                                k32o[i]=kunci32[2*i+1];

                                sboxKunci[k64Hit-1-i]=RS_MDS_Enkode(k32e[i],k32o[i]);
                        }

                        for (i=0;i<subkeyCnt/2;i++)                                    
                        {
                                A = f32((uint)(i*SK_LANGKAH)        ,ref k32e, kunciPjg);      
                                B = f32((uint)(i*SK_LANGKAH+SK_BUMP),ref k32o, kunciPjg);      
                                B = ROT_Kiri(B,8);
                                subKunci[2*i  ] = A+  B;                       
                                subKunci[2*i+1] = ROT_Kiri(A+2*B,SK_ROTL);
                        }

                        return true;
                }

                protected void blokDekripsi(ref uint[] x)
                {
                        uint t0,t1;
                        uint[] xtemp = new uint[4];

                        if (cipherMode == CipherMode.CBC)
                        {
                                x.CopyTo(xtemp,0);
                        }

                        for (int i=0;i<UKURAN_BLOK/32;i++)     
                                x[i] ^= subKunci[KELUARAN_WHITEN+i];

                        for (int r=putaran-1;r>=0;r--)                 
                        {
                                t0      = f32(    x[0]   ,ref sboxKunci,kunciPanjang);
                                t1      = f32(ROT_Kiri(x[1],8),ref sboxKunci,kunciPanjang);

                                x[2] = ROT_Kiri(x[2],1);
                                x[2]^= t0 +   t1 + subKunci[PUTARAN_SUBKUNCI+2*r  ];
                                x[3]^= t0 + 2*t1 + subKunci[PUTARAN_SUBKUNCI+2*r+1];
                                x[3] = ROT_Kanan(x[3],1);

                                if (r>0)                                                                       
                                {
                                        t0   = x[0]; x[0]= x[2]; x[2] = t0;    
                                        t1   = x[1]; x[1]= x[3]; x[3] = t1;
                                }
                        }

                        for (int i=0;i<UKURAN_BLOK/32;i++)     
                        {
                                x[i] ^= subKunci[MASUKAN_WHITEN+i];
                                if (cipherMode == CipherMode.CBC)
                                {
                                        x[i] ^= IV[i];
                                        IV[i] = xtemp[i];
                                }
                        }
                }

                protected void blokEnkripsi(ref uint[] x)
                {
                        uint t0,t1,tmp;
                       
                        for (int i=0;i<UKURAN_BLOK/32;i++)     
                        {
                                x[i] ^= subKunci[MASUKAN_WHITEN+i];
                                if (cipherMode == CipherMode.CBC)
                                        x[i] ^= IV[i];
                        }

                        for (int r=0;r<putaran;r++)                    
                        {      
#if FEISTEL

#else
                                t0      = f32(    x[0]   ,ref sboxKunci,kunciPanjang);
                                t1      = f32(ROT_Kiri(x[1],8),ref sboxKunci,kunciPanjang);

                                x[3] = ROT_Kiri(x[3],1);
                                x[2]^= t0 +   t1 + subKunci[PUTARAN_SUBKUNCI+2*r  ];
                                x[3]^= t0 + 2*t1 + subKunci[PUTARAN_SUBKUNCI+2*r+1];
                                x[2] = ROT_Kanan(x[2],1);

#endif
                                if (r < putaran-1)                                             
                                {
                                        tmp = x[0]; x[0]= x[2]; x[2] = tmp;
                                        tmp = x[1]; x[1]= x[3]; x[3] = tmp;
                                }
                        }
#if FEISTEL
                        x[0] = ROR(x[0],8);                   
                        x[1] = ROL(x[1],8);
                        x[2] = ROR(x[2],8);
                        x[3] = ROL(x[3],8);
#endif
                        for (int i=0;i<UKURAN_BLOK/32;i++)     
                        {
                                x[i] ^= subKunci[KELUARAN_WHITEN+i];
                                if (cipherMode == CipherMode.CBC)
                                {
                                        IV[i] = x[i];
                                }
                        }

                }

                private int[] jumPutaran = {0,PUTARAN_128,PUTARAN_192,PUTARAN_256};

                static private uint RS_MDS_Enkode(uint k0,uint k1)
                {
                        uint i,j;
                        uint r;

                        for (i=r=0;i<2;i++)
                        {
                                r ^= (i>0) ? k0 : k1;                  
                                for (j=0;j<4;j++)                      
                                        RS_rem(ref r);                         
                        }
                        return r;
                }

                protected uint[] sboxKunci = new uint[BIT_KUNCI_MAKS/64];      
                protected uint[] subKunci = new uint[TOTAL_SUBKUNCI];          
                protected uint[] Kunci = {0,0,0,0,0,0,0,0};                            
                protected uint[] IV = {0,0,0,0};                                               
                private int kunciPanjang;
                private int putaran;
                protected CipherMode cipherMode = CipherMode.ECB;


                #region Definisi-Definisi
                static private readonly int     UKURAN_BLOK = 128;     
                static private readonly int     PUTARAN_MAKS = 16;     
                static private readonly int     PUTARAN_128 = 16;      
                static private readonly int     PUTARAN_192 = 16;      
                static private readonly int     PUTARAN_256 = 16;      
                static private readonly int     BIT_KUNCI_MAKS = 256;  
                static private readonly int     BIT_KUNCI_MIN = 128;   

                static private readonly int     MASUKAN_WHITEN = 0;    
                static private readonly int     KELUARAN_WHITEN = (MASUKAN_WHITEN + UKURAN_BLOK/32);
                static private readonly int     PUTARAN_SUBKUNCI = (KELUARAN_WHITEN + UKURAN_BLOK/32);     
                static private readonly int     TOTAL_SUBKUNCI = (PUTARAN_SUBKUNCI + 2*PUTARAN_MAKS);

                #endregion

                #region Definisi lain

                static private readonly uint SK_LANGKAH = 0x02020202u;
                static private readonly uint SK_BUMP = 0x01010101u;
                static private readonly int SK_ROTL = 9;
               
                static private readonly uint    RS_GF_FDBK = 0x14D;            
                static private void RS_rem(ref uint x)         
                {
                        byte  b  = (byte) (x >> 24);                                                                           
                        uint g2 = (uint)(((b << 1) ^ (((b & 0x80)==0x80) ? RS_GF_FDBK : 0 )) & 0xFF);                
                        uint g3 = (uint)(((b >> 1) & 0x7F) ^ (((b & 1)==1) ? RS_GF_FDBK >> 1 : 0 ) ^ g2) ;
                        x = (x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b;                        
                }

                static private readonly int     MDS_GF_FDBK     = 0x169;       
                static private int LFSR1(int x)
                {
                        return ( ((x) >> 1)  ^ ((((x) & 0x01)==0x01) ?   MDS_GF_FDBK/2 : 0));
                }

                static private int LFSR2(int x)
                {
                        return ( ((x) >> 2)  ^ ((((x) & 0x02)==0x02) ?   MDS_GF_FDBK/2 : 0) ^
                                ((((x) & 0x01)==0x01) ?   MDS_GF_FDBK/4 : 0));
                }

                static private int Mx_1(int x)
                {
                        return x;
                }

                static private int Mx_X(int x)
                {
                        return x ^ LFSR2(x);    /* 5B */
                }

                static private int Mx_Y(int x)
                {
                        return x ^ LFSR1(x) ^ LFSR2(x); /* EF */
                }

                static private int M00(int x)
                {
                        return Mul_1(x);
                }
                static private int M01(int x)
                {
                        return Mul_Y(x);
                }
                static private int M02(int x)
                {
                        return Mul_X(x);
                }
                static private int M03(int x)
                {
                        return Mul_X(x);
                }

                static private int M10(int x)
                {
                        return Mul_X(x);
                }
                static private int M11(int x)
                {
                        return Mul_Y(x);
                }
                static private int M12(int x)
                {
                        return Mul_Y(x);
                }
                static private int M13(int x)
                {
                        return Mul_1(x);
                }

                static private int M20(int x)
                {
                        return Mul_Y(x);
                }
                static private int M21(int x)
                {
                        return Mul_X(x);
                }
                static private int M22(int x)
                {
                        return Mul_1(x);
                }
                static private int M23(int x)
                {
                        return Mul_Y(x);
                }

                static private int M30(int x)
                {
                        return Mul_Y(x);
                }
                static private int M31(int x)
                {
                        return Mul_1(x);
                }
                static private int M32(int x)
                {
                        return Mul_Y(x);
                }
                static private int M33(int x)
                {
                        return Mul_X(x);
                }

                static private int Mul_1(int x)
                {
                        return Mx_1(x);
                }
                static private int Mul_X(int x)
                {
                        return Mx_X(x);
                }
                static private int Mul_Y(int x)
                {
                        return Mx_Y(x);
                }              

                static private readonly int     P_00 = 1;                                      
                static private readonly int     P_01 = 0;
                static private readonly int     P_02 = 0;
                static private readonly int     P_03 = (P_01^1);                       
                static private readonly int     P_04 = 1;

                static private readonly int     P_10 = 0;
                static private readonly int     P_11 = 0;
                static private readonly int     P_12 = 1;
                static private readonly int     P_13 = (P_11^1);
                static private readonly int     P_14 = 0;

                static private readonly int     P_20 = 1;
                static private readonly int     P_21 = 1;
                static private readonly int     P_22 = 0;
                static private readonly int     P_23 = (P_21^1);
                static private readonly int     P_24 = 0;

                static private readonly int     P_30 = 0;
                static private readonly int     P_31 = 1;
                static private readonly int     P_32 = 1;
                static private readonly int     P_33 = (P_31^1);
                static private readonly int     P_34 = 1;

                static private byte[,] P8x8 =
                {
                                {
                                0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
                                0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
                                0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
                                0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
                                0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
                                0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
                                0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
                                0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
                                0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
                                0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
                                0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
                                0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
                                0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
                                0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
                                0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
                                0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
                                0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
                                0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
                                0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
                                0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
                                0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
                                0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
                                0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
                                0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
                                0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
                                0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
                                0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
                                0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
                                0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
                                0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
                                0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
                                0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0
                        },

                        {
                                0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
                                0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
                                0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
                                0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
                                0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
                                0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
                                0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
                                0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
                                0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
                                0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
                                0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
                                0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
                                0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
                                0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
                                0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
                                0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
                                0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
                                0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
                                0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
                                0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
                                0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
                                0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
                                0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
                                0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
                                0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
                                0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
                                0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
                                0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
                                0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
                                0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
                                0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
                                0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91
                        }
                };
                #endregion

                #region Definisi
                // rotasi kiri
                private static uint ROT_Kiri(uint x, int n)
                {
                        return ( ((x) << ((n) & 0x1F)) | (x) >> (32-((n) & 0x1F)) );
                }

                // rotasi kanan
                private static uint ROT_Kanan(uint x,int n)
                {
                        return (((x) >> ((n) & 0x1F)) | ((x) << (32-((n) & 0x1F))));
                }

                // byte pertama
                protected static byte b0(uint x)
                {
                        return (byte)(x );//& 0xFF);
                }
                // byte kedua
                protected static byte b1(uint x)
                {
                        return (byte)((x >> 8));// & (0xFF));
                }
                // byte ketiga
                protected static byte b2(uint x)
                {
                        return (byte)((x >> 16));// & (0xFF));
                }
                // byte keempat
                protected static byte b3(uint x)
                {
                        return (byte)((x >> 24));// & (0xFF));
                }
                #endregion
        }
}

using System;

namespace Blowfish_NET
{
        public class Blowfish
        {
                public const int PJGKUNCI_MAKS = 56;

                public const int UKURANBLOK = 8;

                const int PBOX_ENTRI = 18;
                const int SBOX_ENTRI = 256;

                uint[] m_pbox;
                uint[] m_sbox1;
                uint[] m_sbox2;
                uint[] m_sbox3;
                uint[] m_sbox4;

                int m_nApaKunciLemah;

                public bool ApaKunciLemah
                {
                        get
                        {
                                if (-1 == m_nApaKunciLemah)
                                {
                                        m_nApaKunciLemah = 0;

                                        int nI, nJ;
                                        for (nI = 0; nI < SBOX_ENTRI - 1; nI++)
                                        {
                                                nJ = nI + 1;
                                                while (nJ < SBOX_ENTRI)
                                                {
                                                        if ((m_sbox1[nI] == m_sbox1[nJ]) |
                                                            (m_sbox2[nI] == m_sbox2[nJ]) |
                                                            (m_sbox3[nI] == m_sbox3[nJ]) |
                                                            (m_sbox4[nI] == m_sbox4[nJ]))
                                                                break;
                                                        else nJ++;
                                                }
                                                if (nJ < SBOX_ENTRI)
                                                {
                                                        m_nApaKunciLemah = 1;
                                                        break;
                                                }
                                        }
                                }

                                return (1 == m_nApaKunciLemah);
                        }
                }

                public Blowfish
                        (byte[] kunci)
                {
                        int nI;

                        m_pbox = new uint[PBOX_ENTRI];

                        for (nI = 0; nI < PBOX_ENTRI; nI++)
                        {
                                m_pbox[nI] = TabelBlowfish.pbox_init[nI];
                        }

                        m_sbox1 = new uint[SBOX_ENTRI];
                        m_sbox2 = new uint[SBOX_ENTRI];
                        m_sbox3 = new uint[SBOX_ENTRI];
                        m_sbox4 = new uint[SBOX_ENTRI];

                        for (nI = 0; nI < SBOX_ENTRI; nI++)
                        {
                                m_sbox1[nI] = TabelBlowfish.sbox_init_1[nI];
                                m_sbox2[nI] = TabelBlowfish.sbox_init_2[nI];
                                m_sbox3[nI] = TabelBlowfish.sbox_init_3[nI];
                                m_sbox4[nI] = TabelBlowfish.sbox_init_4[nI];
                        }

                        int nPjg = kunci.Length;
                        if (nPjg == 0) return;
                        int nKunciPos = 0;
                        uint unBangun = 0;

                        for (nI = 0; nI < PBOX_ENTRI; nI++)
                        {
                                for (int nJ = 0; nJ < 4; nJ++)
                                {
                                        unBangun = (unBangun << 8) | kunci[nKunciPos];
     
                                        if (++nKunciPos == nPjg)
                                        {
                                                nKunciPos = 0;
                                        }
                                }
                                m_pbox[nI] ^= unBangun;
                        }

                        uint unZeroHi = 0;
                        uint unZeroLo = 0;

                        for (nI = 0; nI < PBOX_ENTRI; nI += 2)
                        {
                                BasisEnkripsi(ref unZeroHi, ref unZeroLo);
                                m_pbox[nI] = unZeroHi;
                                m_pbox[nI + 1] = unZeroLo;
                        }
                        for (nI = 0; nI < SBOX_ENTRI; nI += 2)
                        {
                                BasisEnkripsi(ref unZeroHi, ref unZeroLo);
                                m_sbox1[nI] = unZeroHi;
                                m_sbox1[nI + 1] = unZeroLo;
                        }
                        for (nI = 0; nI < SBOX_ENTRI; nI += 2)
                        {
                                BasisEnkripsi(ref unZeroHi, ref unZeroLo);
                                m_sbox2[nI] = unZeroHi;
                                m_sbox2[nI + 1] = unZeroLo;
                        }
                        for (nI = 0; nI < SBOX_ENTRI; nI += 2)
                        {
                                BasisEnkripsi(ref unZeroHi, ref unZeroLo);
                                m_sbox3[nI] = unZeroHi;
                                m_sbox3[nI + 1] = unZeroLo;
                        }
                        for (nI = 0; nI < SBOX_ENTRI; nI += 2)
                        {
                                BasisEnkripsi(ref unZeroHi, ref unZeroLo);
                                m_sbox4[nI] = unZeroHi;
                                m_sbox4[nI + 1] = unZeroLo;
                        }

                        m_nApaKunciLemah = -1;
                }

                public virtual void Bakar()
                {
                        int nI;

                        for (nI = 0; nI < PBOX_ENTRI; nI++)
                        {
                                m_pbox[nI] = 0;
                        }

                        for (nI = 0; nI < SBOX_ENTRI; nI++)
                        {
                                m_sbox1[nI] = m_sbox2[nI] = m_sbox3[nI] = m_sbox4[nI] = 0;
                        }
                }

                static readonly byte[] TEST_KUNCI = { 0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef };
                static readonly uint[] TEST_VEKTOR_PLAIN  = { 0x30553228, 0x6d6f295a };
                static readonly uint[] TEST_VEKTOR_CIPHER = { 0x55cb3774, 0xd13ef201 };

                public static bool TestDiri()
                {
                        uint unHi = TEST_VEKTOR_PLAIN[0];
                        uint unLo = TEST_VEKTOR_PLAIN[1];

                        Blowfish bf = new Blowfish(TEST_KUNCI);

                        bf.Enkripsi(ref unHi, ref unLo);

                        if ((unHi != TEST_VEKTOR_CIPHER[0]) ||
                                (unLo != TEST_VEKTOR_CIPHER[1]))
                        {
                                return false;
                        }

                        bf.Dekripsi(ref unHi, ref unLo);

                        if ((unHi != TEST_VEKTOR_PLAIN[0]) ||
                                (unLo != TEST_VEKTOR_PLAIN[1]))
                        {
                                return false;
                        }

                        return true;
                }

                protected void BasisEnkripsi
                        (ref uint unHiRef,
                        ref uint unLoRef)
                {
  
                        uint unHi = unHiRef;
                        uint unLo = unLoRef;

                        uint[] sbox1 = m_sbox1;
                        uint[] sbox2 = m_sbox2;
                        uint[] sbox3 = m_sbox3;
                        uint[] sbox4 = m_sbox4;

                        uint[] pbox = m_pbox;

                        unHi ^= pbox[0];
                        unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[1];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[2];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[3];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[4];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[5];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[6];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[7];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[8];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[9];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[10];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[11];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[12];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[13];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[14];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[15];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[16];

                        unLoRef = unHi;
                        unHiRef = unLo ^ pbox[17];
                }

                public virtual void Enkripsi
                        (ref uint unHiRef,
                        ref uint unLoRef)
                {
                        BasisEnkripsi(ref unHiRef, ref unLoRef);
                }

                public int Enkripsi
                        (byte[] dataMasuk,
                        byte[] dataKeluar,
                        int nPosMasuk,
                        int nPosKeluar,
                        int nJumlah)
                {
                        nJumlah >>= 3;

                        for (int nI = 0; nI < nJumlah; nI++)
                        {
                                uint unHi = (((uint) dataMasuk[nPosMasuk]) << 24) |
                                        (((uint) dataMasuk[nPosMasuk + 1]) << 16) |
                                        (((uint) dataMasuk[nPosMasuk + 2]) << 8) |
                                        dataMasuk[nPosMasuk + 3];

                                uint unLo = (((uint) dataMasuk[nPosMasuk + 4]) << 24) |
                                        (((uint) dataMasuk[nPosMasuk + 5]) << 16) |
                                        (((uint) dataMasuk[nPosMasuk + 6]) << 8) |
                                        dataMasuk[nPosMasuk + 7];

                                Enkripsi(ref unHi, ref unLo);

                                dataKeluar[nPosKeluar]     = (byte)(unHi >> 24);
                                dataKeluar[nPosKeluar + 1] = (byte)(unHi >> 16);
                                dataKeluar[nPosKeluar + 2] = (byte)(unHi >> 8);
                                dataKeluar[nPosKeluar + 3] = (byte)unHi;
                                dataKeluar[nPosKeluar + 4] = (byte)(unLo >> 24);
                                dataKeluar[nPosKeluar + 5] = (byte)(unLo >> 16);
                                dataKeluar[nPosKeluar + 6] = (byte)(unLo >> 8);
                                dataKeluar[nPosKeluar + 7] = (byte)unLo;

                                nPosMasuk += 8;
                                nPosKeluar += 8;
                        }

                        return nJumlah;
                }

                public virtual void Dekripsi
                        (ref uint unHiRef,
                        ref uint unLoRef)
                {
                        uint unHi = unHiRef;
                        uint unLo = unLoRef;

                        uint[] sbox1 = m_sbox1;
                        uint[] sbox2 = m_sbox2;
                        uint[] sbox3 = m_sbox3;
                        uint[] sbox4 = m_sbox4;

                        uint[] pbox = m_pbox;

                        unHi ^= pbox[(int)(17)];
                        unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[16];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[15];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[14];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[13];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[12];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[11];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[10];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[9];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[8];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[7];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[6];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[5];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[4];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[3];
                             unLo ^= (((sbox1[(int)(unHi >> 24)] + sbox2[(int)((unHi >> 16) & 0x0ff)]) ^ sbox3[(int)((unHi >> 8) & 0x0ff)]) + sbox4[(int)(unHi & 0x0ff)]) ^ pbox[2];
                             unHi ^= (((sbox1[(int)(unLo >> 24)] + sbox2[(int)((unLo >> 16) & 0x0ff)]) ^ sbox3[(int)((unLo >> 8) & 0x0ff)]) + sbox4[(int)(unLo & 0x0ff)]) ^ pbox[1];

                        unLoRef = unHi;
                        unHiRef = unLo ^ pbox[0];
                }

                public int Dekripsi
                        (byte[] dataMasuk,
                        byte[] dataKeluar,
                        int nPosMasuk,
                        int nPosKeluar,
                        int nJumlah)
                {
                        nJumlah >>= 3;

                        for (int nI = 0; nI < nJumlah; nI++)
                        {
                                uint unHi = (((uint) dataMasuk[nPosMasuk]) << 24) |
                                        (((uint) dataMasuk[nPosMasuk + 1]) << 16) |
                                        (((uint) dataMasuk[nPosMasuk + 2]) << 8) |
                                        dataMasuk[nPosMasuk + 3];

                                uint unLo = (((uint) dataMasuk[nPosMasuk + 4]) << 24) |
                                        (((uint) dataMasuk[nPosMasuk + 5]) << 16) |
                                        (((uint) dataMasuk[nPosMasuk + 6]) << 8) |
                                        dataMasuk[nPosMasuk + 7];

                                Dekripsi(ref unHi, ref unLo);

                                dataKeluar[nPosKeluar]     = (byte)(unHi >> 24);
                                dataKeluar[nPosKeluar + 1] = (byte)(unHi >> 16);
                                dataKeluar[nPosKeluar + 2] = (byte)(unHi >> 8);
                                dataKeluar[nPosKeluar + 3] = (byte)unHi;
                                dataKeluar[nPosKeluar + 4] = (byte)(unLo >> 24);
                                dataKeluar[nPosKeluar + 5] = (byte)(unLo >> 16);
                                dataKeluar[nPosKeluar + 6] = (byte)(unLo >> 8);
                                dataKeluar[nPosKeluar + 7] = (byte)unLo;

                                nPosMasuk += 8;
                                nPosKeluar += 8;
                        }
                        return nJumlah;
                }
        }
}

namespace Blowfish_NET
{
        public class TabelBlowfish
        {

                public static readonly uint[] pbox_init =
                {
                        0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
                        0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
                        0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b 
                };

                public static readonly uint[] sbox_init_1 =
                {

                             0xd1310ba6,   0x98dfb5ac,   0x2ffd72db,   0xd01adfb7,   0xb8e1afed,   0x6a267e96,
                             0xba7c9045,   0xf12c7f99,   0x24a19947,   0xb3916cf7,   0x0801f2e2,   0x858efc16,
                             0x636920d8,   0x71574e69,   0xa458fea3,   0xf4933d7e,   0x0d95748f,   0x728eb658,
                             0x718bcd58,   0x82154aee,   0x7b54a41d,   0xc25a59b5,   0x9c30d539,   0x2af26013,
                             0xc5d1b023,   0x286085f0,   0xca417918,   0xb8db38ef,   0x8e79dcb0,   0x603a180e,
                             0x6c9e0e8b,   0xb01e8a3e,   0xd71577c1,   0xbd314b27,   0x78af2fda,   0x55605c60,
                             0xe65525f3,   0xaa55ab94,   0x57489862,   0x63e81440,   0x55ca396a,   0x2aab10b6,
                             0xb4cc5c34,   0x1141e8ce,   0xa15486af,   0x7c72e993,   0xb3ee1411,   0x636fbc2a,
                             0x2ba9c55d,   0x741831f6,   0xce5c3e16,   0x9b87931e,   0xafd6ba33,   0x6c24cf5c,
                             0x7a325381,   0x28958677,   0x3b8f4898,   0x6b4bb9af,   0xc4bfe81b,   0x66282193,
                             0x61d809cc,   0xfb21a991,   0x487cac60,   0x5dec8032,   0xef845d5d,   0xe98575b1,
                             0xdc262302,   0xeb651b88,   0x23893e81,   0xd396acc5,   0x0f6d6ff3,   0x83f44239,
                             0x2e0b4482,   0xa4842004,   0x69c8f04a,   0x9e1f9b5e,   0x21c66842,   0xf6e96c9a,
                             0x670c9c61,   0xabd388f0,   0x6a51a0d2,   0xd8542f68,   0x960fa728,   0xab5133a3,
                             0x6eef0b6c,   0x137a3be4,   0xba3bf050,   0x7efb2a98,   0xa1f1651d,   0x39af0176,
                             0x66ca593e,   0x82430e88,   0x8cee8619,   0x456f9fb4,   0x7d84a5c3,   0x3b8b5ebe,
                             0xe06f75d8,   0x85c12073,   0x401a449f,   0x56c16aa6,   0x4ed3aa62,   0x363f7706,
                             0x1bfedf72,   0x429b023d,   0x37d0d724,   0xd00a1248,   0xdb0fead3,   0x49f1c09b,
                             0x075372c9,   0x80991b7b,   0x25d479d8,   0xf6e8def7,   0xe3fe501a,   0xb6794c3b,
                             0x976ce0bd,   0x04c006ba,   0xc1a94fb6,   0x409f60c4,   0x5e5c9ec2,   0x196a2463,
                             0x68fb6faf,   0x3e6c53b5,   0x1339b2eb,   0x3b52ec6f,   0x6dfc511f,   0x9b30952c,
                             0xcc814544,   0xaf5ebd09,   0xbee3d004,   0xde334afd,   0x660f2807,   0x192e4bb3,
                             0xc0cba857,   0x45c8740f,   0xd20b5f39,   0xb9d3fbdb,   0x5579c0bd,   0x1a60320a,
                             0xd6a100c6,   0x402c7279,   0x679f25fe,   0xfb1fa3cc,   0x8ea5e9f8,   0xdb3222f8,
                             0x3c7516df,   0xfd616b15,   0x2f501ec8,   0xad0552ab,   0x323db5fa,   0xfd238760,
                             0x53317b48,   0x3e00df82,   0x9e5c57bb,   0xca6f8ca0,   0x1a87562e,   0xdf1769db,
                             0xd542a8f6,   0x287effc3,   0xac6732c6,   0x8c4f5573,   0x695b27b0,   0xbbca58c8,
                             0xe1ffa35d,   0xb8f011a0,   0x10fa3d98,   0xfd2183b8,   0x4afcb56c,   0x2dd1d35b,
                             0x9a53e479,   0xb6f84565,   0xd28e49bc,   0x4bfb9790,   0xe1ddf2da,   0xa4cb7e33,
                             0x62fb1341,   0xcee4c6e8,   0xef20cada,   0x36774c01,   0xd07e9efe,   0x2bf11fb4,
                             0x95dbda4d,   0xae909198,   0xeaad8e71,   0x6b93d5a0,   0xd08ed1d0,   0xafc725e0,
                             0x8e3c5b2f,   0x8e7594b7,   0x8ff6e2fb,   0xf2122b64,   0x8888b812,   0x900df01c,
                             0x4fad5ea0,   0x688fc31c,   0xd1cff191,   0xb3a8c1ad,   0x2f2f2218,   0xbe0e1777,
                             0xea752dfe,   0x8b021fa1,   0xe5a0cc0f,   0xb56f74e8,   0x18acf3d6,   0xce89e299,
                             0xb4a84fe0,   0xfd13e0b7,   0x7cc43b81,   0xd2ada8d9,   0x165fa266,   0x80957705,
                             0x93cc7314,   0x211a1477,   0xe6ad2065,   0x77b5fa86,   0xc75442f5,   0xfb9d35cf,
                             0xebcdaf0c,   0x7b3e89a0,   0xd6411bd3,   0xae1e7e49,   0x00250e2d,   0x2071b35e,
                             0x226800bb,   0x57b8e0af,   0x2464369b,   0xf009b91e,   0x5563911d,   0x59dfa6aa,
                             0x78c14389,   0xd95a537f,   0x207d5ba2,   0x02e5b9c5,   0x83260376,   0x6295cfa9,
                             0x11c81968,   0x4e734a41,   0xb3472dca,   0x7b14a94a,   0x1b510052,   0x9a532915,
                             0xd60f573f,   0xbc9bc6e4,   0x2b60a476,   0x81e67400,   0x08ba6fb5,   0x571be91f,
                             0xf296ec6b,   0x2a0dd915,   0xb6636521,   0xe7b9f9b6,   0xff34052e,   0xc5855664,
                             0x53b02d5d,   0xa99f8fa1,   0x08ba4799,   0x6e85076a
                };

                public static readonly uint[] sbox_init_2 =
                {

                             0x4b7a70e9,   0xb5b32944,
                             0xdb75092e,   0xc4192623,   0xad6ea6b0,   0x49a7df7d,   0x9cee60b8,   0x8fedb266,
                             0xecaa8c71,   0x699a17ff,   0x5664526c,   0xc2b19ee1,   0x193602a5,   0x75094c29,
                             0xa0591340,   0xe4183a3e,   0x3f54989a,   0x5b429d65,   0x6b8fe4d6,   0x99f73fd6,
                             0xa1d29c07,   0xefe830f5,   0x4d2d38e6,   0xf0255dc1,   0x4cdd2086,   0x8470eb26,
                             0x6382e9c6,   0x021ecc5e,   0x09686b3f,   0x3ebaefc9,   0x3c971814,   0x6b6a70a1,
                             0x687f3584,   0x52a0e286,   0xb79c5305,   0xaa500737,   0x3e07841c,   0x7fdeae5c,
                             0x8e7d44ec,   0x5716f2b8,   0xb03ada37,   0xf0500c0d,   0xf01c1f04,   0x0200b3ff,
                             0xae0cf51a,   0x3cb574b2,   0x25837a58,   0xdc0921bd,   0xd19113f9,   0x7ca92ff6,
                             0x94324773,   0x22f54701,   0x3ae5e581,   0x37c2dadc,   0xc8b57634,   0x9af3dda7,
                             0xa9446146,   0x0fd0030e,   0xecc8c73e,   0xa4751e41,   0xe238cd99,   0x3bea0e2f,
                             0x3280bba1,   0x183eb331,   0x4e548b38,   0x4f6db908,   0x6f420d03,   0xf60a04bf,
                             0x2cb81290,   0x24977c79,   0x5679b072,   0xbcaf89af,   0xde9a771f,   0xd9930810,
                             0xb38bae12,   0xdccf3f2e,   0x5512721f,   0x2e6b7124,   0x501adde6,   0x9f84cd87,
                             0x7a584718,   0x7408da17,   0xbc9f9abc,   0xe94b7d8c,   0xec7aec3a,   0xdb851dfa,
                             0x63094366,   0xc464c3d2,   0xef1c1847,   0x3215d908,   0xdd433b37,   0x24c2ba16,
                             0x12a14d43,   0x2a65c451,   0x50940002,   0x133ae4dd,   0x71dff89e,   0x10314e55,
                             0x81ac77d6,   0x5f11199b,   0x043556f1,   0xd7a3c76b,   0x3c11183b,   0x5924a509,
                             0xf28fe6ed,   0x97f1fbfa,   0x9ebabf2c,   0x1e153c6e,   0x86e34570,   0xeae96fb1,
                             0x860e5e0a,   0x5a3e2ab3,   0x771fe71c,   0x4e3d06fa,   0x2965dcb9,   0x99e71d0f,
                             0x803e89d6,   0x5266c825,   0x2e4cc978,   0x9c10b36a,   0xc6150eba,   0x94e2ea78,
                             0xa5fc3c53,   0x1e0a2df4,   0xf2f74ea7,   0x361d2b3d,   0x1939260f,   0x19c27960,
                             0x5223a708,   0xf71312b6,   0xebadfe6e,   0xeac31f66,   0xe3bc4595,   0xa67bc883,
                             0xb17f37d1,   0x018cff28,   0xc332ddef,   0xbe6c5aa5,   0x65582185,   0x68ab9802,
                             0xeecea50f,   0xdb2f953b,   0x2aef7dad,   0x5b6e2f84,   0x1521b628,   0x29076170,
                             0xecdd4775,   0x619f1510,   0x13cca830,   0xeb61bd96,   0x0334fe1e,   0xaa0363cf,
                             0xb5735c90,   0x4c70a239,   0xd59e9e0b,   0xcbaade14,   0xeecc86bc,   0x60622ca7,
                             0x9cab5cab,   0xb2f3846e,   0x648b1eaf,   0x19bdf0ca,   0xa02369b9,   0x655abb50,
                             0x40685a32,   0x3c2ab4b3,   0x319ee9d5,   0xc021b8f7,   0x9b540b19,   0x875fa099,
                             0x95f7997e,   0x623d7da8,   0xf837889a,   0x97e32d77,   0x11ed935f,   0x16681281,
                             0x0e358829,   0xc7e61fd6,   0x96dedfa1,   0x7858ba99,   0x57f584a5,   0x1b227263,
                             0x9b83c3ff,   0x1ac24696,   0xcdb30aeb,   0x532e3054,   0x8fd948e4,   0x6dbc3128,
                             0x58ebf2ef,   0x34c6ffea,   0xfe28ed61,   0xee7c3c73,   0x5d4a14d9,   0xe864b7e3,
                             0x42105d14,   0x203e13e0,   0x45eee2b6,   0xa3aaabea,   0xdb6c4f15,   0xfacb4fd0,
                             0xc742f442,   0xef6abbb5,   0x654f3b1d,   0x41cd2105,   0xd81e799e,   0x86854dc7,
                             0xe44b476a,   0x3d816250,   0xcf62a1f2,   0x5b8d2646,   0xfc8883a0,   0xc1c7b6a3,
                             0x7f1524c3,   0x69cb7492,   0x47848a0b,   0x5692b285,   0x095bbf00,   0xad19489d,
                             0x1462b174,   0x23820e00,   0x58428d2a,   0x0c55f5ea,   0x1dadf43e,   0x233f7061,
                             0x3372f092,   0x8d937e41,   0xd65fecf1,   0x6c223bdb,   0x7cde3759,   0xcbee7460,
                             0x4085f2a7,   0xce77326e,   0xa6078084,   0x19f8509e,   0xe8efd855,   0x61d99735,
                             0xa969a7aa,   0xc50c06c2,   0x5a04abfc,   0x800bcadc,   0x9e447a2e,   0xc3453484,
                             0xfdd56705,   0x0e1e9ec9,   0xdb73dbd3,   0x105588cd,   0x675fda79,   0xe3674340,
                             0xc5c43465,   0x713e38d8,   0x3d28f89e,   0xf16dff20,   0x153e21e7,   0x8fb03d4a,
                             0xe6e39f2b,   0xdb83adf7
                };

                public static readonly uint[] sbox_init_3 =
                {
                             0xe93d5a68,   0x948140f7,   0xf64c261c,   0x94692934,
                             0x411520f7,   0x7602d4f7,   0xbcf46b2e,   0xd4a20068,   0xd4082471,   0x3320f46a,
                             0x43b7d4b7,   0x500061af,   0x1e39f62e,   0x97244546,   0x14214f74,   0xbf8b8840,
                             0x4d95fc1d,   0x96b591af,   0x70f4ddd3,   0x66a02f45,   0xbfbc09ec,   0x03bd9785,
                             0x7fac6dd0,   0x31cb8504,   0x96eb27b3,   0x55fd3941,   0xda2547e6,   0xabca0a9a,
                             0x28507825,   0x530429f4,   0x0a2c86da,   0xe9b66dfb,   0x68dc1462,   0xd7486900,
                             0x680ec0a4,   0x27a18dee,   0x4f3ffea2,   0xe887ad8c,   0xb58ce006,   0x7af4d6b6,
                             0xaace1e7c,   0xd3375fec,   0xce78a399,   0x406b2a42,   0x20fe9e35,   0xd9f385b9,
                             0xee39d7ab,   0x3b124e8b,   0x1dc9faf7,   0x4b6d1856,   0x26a36631,   0xeae397b2,
                             0x3a6efa74,   0xdd5b4332,   0x6841e7f7,   0xca7820fb,   0xfb0af54e,   0xd8feb397,
                             0x454056ac,   0xba489527,   0x55533a3a,   0x20838d87,   0xfe6ba9b7,   0xd096954b,
                             0x55a867bc,   0xa1159a58,   0xcca92963,   0x99e1db33,   0xa62a4a56,   0x3f3125f9,
                             0x5ef47e1c,   0x9029317c,   0xfdf8e802,   0x04272f70,   0x80bb155c,   0x05282ce3,
                             0x95c11548,   0xe4c66d22,   0x48c1133f,   0xc70f86dc,   0x07f9c9ee,   0x41041f0f,
                             0x404779a4,   0x5d886e17,   0x325f51eb,   0xd59bc0d1,   0xf2bcc18f,   0x41113564,
                             0x257b7834,   0x602a9c60,   0xdff8e8a3,   0x1f636c1b,   0x0e12b4c2,   0x02e1329e,
                             0xaf664fd1,   0xcad18115,   0x6b2395e0,   0x333e92e1,   0x3b240b62,   0xeebeb922,
                             0x85b2a20e,   0xe6ba0d99,   0xde720c8c,   0x2da2f728,   0xd0127845,   0x95b794fd,
                             0x647d0862,   0xe7ccf5f0,   0x5449a36f,   0x877d48fa,   0xc39dfd27,   0xf33e8d1e,
                             0x0a476341,   0x992eff74,   0x3a6f6eab,   0xf4f8fd37,   0xa812dc60,   0xa1ebddf8,
                             0x991be14c,   0xdb6e6b0d,   0xc67b5510,   0x6d672c37,   0x2765d43b,   0xdcd0e804,
                             0xf1290dc7,   0xcc00ffa3,   0xb5390f92,   0x690fed0b,   0x667b9ffb,   0xcedb7d9c,
                             0xa091cf0b,   0xd9155ea3,   0xbb132f88,   0x515bad24,   0x7b9479bf,   0x763bd6eb,
                             0x37392eb3,   0xcc115979,   0x8026e297,   0xf42e312d,   0x6842ada7,   0xc66a2b3b,
                             0x12754ccc,   0x782ef11c,   0x6a124237,   0xb79251e7,   0x06a1bbe6,   0x4bfb6350,
                             0x1a6b1018,   0x11caedfa,   0x3d25bdd8,   0xe2e1c3c9,   0x44421659,   0x0a121386,
                             0xd90cec6e,   0xd5abea2a,   0x64af674e,   0xda86a85f,   0xbebfe988,   0x64e4c3fe,
                             0x9dbc8057,   0xf0f7c086,   0x60787bf8,   0x6003604d,   0xd1fd8346,   0xf6381fb0,
                             0x7745ae04,   0xd736fccc,   0x83426b33,   0xf01eab71,   0xb0804187,   0x3c005e5f,
                             0x77a057be,   0xbde8ae24,   0x55464299,   0xbf582e61,   0x4e58f48f,   0xf2ddfda2,
                             0xf474ef38,   0x8789bdc2,   0x5366f9c3,   0xc8b38e74,   0xb475f255,   0x46fcd9b9,
                             0x7aeb2661,   0x8b1ddf84,   0x846a0e79,   0x915f95e2,   0x466e598e,   0x20b45770,
                             0x8cd55591,   0xc902de4c,   0xb90bace1,   0xbb8205d0,   0x11a86248,   0x7574a99e,
                             0xb77f19b6,   0xe0a9dc09,   0x662d09a1,   0xc4324633,   0xe85a1f02,   0x09f0be8c,
                             0x4a99a025,   0x1d6efe10,   0x1ab93d1d,   0x0ba5a4df,   0xa186f20f,   0x2868f169,
                             0xdcb7da83,   0x573906fe,   0xa1e2ce9b,   0x4fcd7f52,   0x50115e01,   0xa70683fa,
                             0xa002b5c4,   0x0de6d027,   0x9af88c27,   0x773f8641,   0xc3604c06,   0x61a806b5,
                             0xf0177a28,   0xc0f586e0,   0x006058aa,   0x30dc7d62,   0x11e69ed7,   0x2338ea63,
                             0x53c2dd94,   0xc2c21634,   0xbbcbee56,   0x90bcb6de,   0xebfc7da1,   0xce591d76,
                             0x6f05e409,   0x4b7c0188,   0x39720a3d,   0x7c927c24,   0x86e3725f,   0x724d9db9,
                             0x1ac15bb4,   0xd39eb8fc,   0xed545578,   0x08fca5b5,   0xd83d7cd3,   0x4dad0fc4,
                             0x1e50ef5e,   0xb161e6f8,   0xa28514d9,   0x6c51133c,   0x6fd5c7e7,   0x56e14ec4,
                             0x362abfce,   0xddc6c837,   0xd79a3234,   0x92638212,   0x670efa8e,   0x406000e0
                };

                public static readonly uint[] sbox_init_4 =
                {

                             0x3a39ce37,   0xd3faf5cf,   0xabc27737,   0x5ac52d1b,   0x5cb0679e,   0x4fa33742,
                             0xd3822740,   0x99bc9bbe,   0xd5118e9d,   0xbf0f7315,   0xd62d1c7e,   0xc700c47b,
                             0xb78c1b6b,   0x21a19045,   0xb26eb1be,   0x6a366eb4,   0x5748ab2f,   0xbc946e79,
                             0xc6a376d2,   0x6549c2c8,   0x530ff8ee,   0x468dde7d,   0xd5730a1d,   0x4cd04dc6,
                             0x2939bbdb,   0xa9ba4650,   0xac9526e8,   0xbe5ee304,   0xa1fad5f0,   0x6a2d519a,
                             0x63ef8ce2,   0x9a86ee22,   0xc089c2b8,   0x43242ef6,   0xa51e03aa,   0x9cf2d0a4,
                             0x83c061ba,   0x9be96a4d,   0x8fe51550,   0xba645bd6,   0x2826a2f9,   0xa73a3ae1,
                             0x4ba99586,   0xef5562e9,   0xc72fefd3,   0xf752f7da,   0x3f046f69,   0x77fa0a59,
                             0x80e4a915,   0x87b08601,   0x9b09e6ad,   0x3b3ee593,   0xe990fd5a,   0x9e34d797,
                             0x2cf0b7d9,   0x022b8b51,   0x96d5ac3a,   0x017da67d,   0xd1cf3ed6,   0x7c7d2d28,
                             0x1f9f25cf,   0xadf2b89b,   0x5ad6b472,   0x5a88f54c,   0xe029ac71,   0xe019a5e6,
                             0x47b0acfd,   0xed93fa9b,   0xe8d3c48d,   0x283b57cc,   0xf8d56629,   0x79132e28,
                             0x785f0191,   0xed756055,   0xf7960e44,   0xe3d35e8c,   0x15056dd4,   0x88f46dba,
                             0x03a16125,   0x0564f0bd,   0xc3eb9e15,   0x3c9057a2,   0x97271aec,   0xa93a072a,
                             0x1b3f6d9b,   0x1e6321f5,   0xf59c66fb,   0x26dcf319,   0x7533d928,   0xb155fdf5,
                             0x03563482,   0x8aba3cbb,   0x28517711,   0xc20ad9f8,   0xabcc5167,   0xccad925f,
                             0x4de81751,   0x3830dc8e,   0x379d5862,   0x9320f991,   0xea7a90c2,   0xfb3e7bce,
                             0x5121ce64,   0x774fbe32,   0xa8b6e37e,   0xc3293d46,   0x48de5369,   0x6413e680,
                             0xa2ae0810,   0xdd6db224,   0x69852dfd,   0x09072166,   0xb39a460a,   0x6445c0dd,
                             0x586cdecf,   0x1c20c8ae,   0x5bbef7dd,   0x1b588d40,   0xccd2017f,   0x6bb4e3bb,
                             0xdda26a7e,   0x3a59ff45,   0x3e350a44,   0xbcb4cdd5,   0x72eacea8,   0xfa6484bb,
                             0x8d6612ae,   0xbf3c6f47,   0xd29be463,   0x542f5d9e,   0xaec2771b,   0xf64e6370,
                             0x740e0d8d,   0xe75b1357,   0xf8721671,   0xaf537d5d,   0x4040cb08,   0x4eb4e2cc,
                             0x34d2466a,   0x0115af84,   0xe1b00428,   0x95983a1d,   0x06b89fb4,   0xce6ea048,
                             0x6f3f3b82,   0x3520ab82,   0x011a1d4b,   0x277227f8,   0x611560b1,   0xe7933fdc,
                             0xbb3a792b,   0x344525bd,   0xa08839e1,   0x51ce794b,   0x2f32c9b7,   0xa01fbac9,
                             0xe01cc87e,   0xbcc7d1f6,   0xcf0111c3,   0xa1e8aac7,   0x1a908749,   0xd44fbd9a,
                             0xd0dadecb,   0xd50ada38,   0x0339c32a,   0xc6913667,   0x8df9317c,   0xe0b12b4f,
                             0xf79e59b7,   0x43f5bb3a,   0xf2d519ff,   0x27d9459c,   0xbf97222c,   0x15e6fc2a,
                             0x0f91fc71,   0x9b941525,   0xfae59361,   0xceb69ceb,   0xc2a86459,   0x12baa8d1,
                             0xb6c1075e,   0xe3056a0c,   0x10d25065,   0xcb03a442,   0xe0ec6e0e,   0x1698db3b,
                             0x4c98a0be,   0x3278e964,   0x9f1f9532,   0xe0d392df,   0xd3a0342b,   0x8971f21e,
                             0x1b0a7441,   0x4ba3348c,   0xc5be7120,   0xc37632d8,   0xdf359f8d,   0x9b992f2e,
                             0xe60b6f47,   0x0fe3f11d,   0xe54cda54,   0x1edad891,   0xce6279cf,   0xcd3e7e6f,
                             0x1618b166,   0xfd2c1d05,   0x848fd2c5,   0xf6fb2299,   0xf523f357,   0xa6327623,
                             0x93a83531,   0x56cccd02,   0xacf08162,   0x5a75ebb5,   0x6e163697,   0x88d273cc,
                             0xde966292,   0x81b949d0,   0x4c50901b,   0x71c65614,   0xe6c6c7bd,   0x327a140a,
                             0x45e1d006,   0xc3f27b9a,   0xc9aa53fd,   0x62a80f00,   0xbb25bfe2,   0x35bdd2f6,
                             0x71126905,   0xb2040222,   0xb6cbcf7c,   0xcd769c2b,   0x53113ec0,   0x1640e3d3,
                             0x38abbd60,   0x2547adf0,   0xba38209c,   0xf746ce76,   0x77afa1c5,   0x20756060,
                             0x85cbfe4e,   0x8ae88dd8,   0x7aaaf9b0,   0x4cf9aa7e,   0x1948c25c,   0x02fb8a8c,
                             0x01c36ae4,   0xd6ebe1f9,   0x90d4f869,   0xa65cdea0,   0x3f09252d,   0xc208e69f,
                             0xb74e6132,   0xce77e25b,   0x578fdfe3,   0x3ac372e6
                };
        }
}



1.11 Pengacak Teks




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace PengacakTeks
{
    public class Pengacak{
        private string SemuaKarSumber =
                "><!@#$%&*abcdefghiklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ1234567890";

        public string StringBiner(string StringUtama){
            return BinerKerja(StringUtama);}

        public string StringAcak(string StringUtama){
            return AcakBiner(BinerKerja(StringUtama));}

        public string StringUtama(string StrDilewatkan, byte BinerAcak){
            string TeksUtama = "";
            switch (BinerAcak){
                case 0:
                    TeksUtama = DekodeBiner(StrDilewatkan);
                    break;
                case 1:
                    TeksUtama = DekodeBiner((TakAcakStringBiner(StrDilewatkan)));
                    break;}

            return TeksUtama;}

        private string BinerKerja(string ApaYangDikerjakan){
            string BinaryResults = "";

            foreach (char GetKarakter in ApaYangDikerjakan){
                BinaryResults += GetBiner(GetKarakter);}

            return BinaryResults;}

        private string DekodeBiner(string StringDilewatkan){
            int ii;
            string KarakterHasil = "";

            for (ii = 0; ii < StringDilewatkan.Length; ii += 8){
                try{
                    KarakterHasil += GetKarakter(StringDilewatkan.Substring(ii, 8));}
                catch (OverflowException) { }}
            return KarakterHasil;}

        private string TakAcakStringBiner(string Uacak){
            string[] strSatuKeNol = new string[3];
            string aKar = SemuaKarSumber;
            int ii;

            string AkhirSembilan = balikString(Uacak.Substring(Uacak.Length - 9));

            foreach (char ChrNine in AkhirSembilan){
                if (strSatuKeNol[0] == null){
                    strSatuKeNol[0] = ChrNine.ToString(); continue;}
                if (strSatuKeNol[0] == ChrNine.ToString()) continue;
                if (strSatuKeNol[1] == null){
                    strSatuKeNol[1] = ChrNine.ToString(); continue;}
                if (strSatuKeNol[1] == ChrNine.ToString()) continue;
                strSatuKeNol[2] = ChrNine.ToString();
                break;}

            aKar = aKar.Replace(strSatuKeNol[1], "");
            aKar = aKar.Replace(strSatuKeNol[2], "");

            for (ii = 0; ii < aKar.Length; ii++){
                Uacak = Uacak.Replace(aKar.Substring(ii, 1), "");}

            Uacak = StringTunggal(strSatuKeNol[1], Uacak);
            Uacak = StringTunggal(strSatuKeNol[2], Uacak);

            Uacak = Uacak.Replace(";", "");
            Uacak = Uacak.Replace(":", "");
            Uacak = Uacak.Replace(strSatuKeNol[1], "0");
            Uacak = Uacak.Replace(strSatuKeNol[2], "1");

            return Uacak.Substring(0, (Uacak.Length - 2));}

        private string StringTunggal(string StringJamak, string StrUtuh){
            while (StrUtuh.IndexOf(StringJamak + StringJamak) != -1){
                StrUtuh = StrUtuh.Replace(StringJamak + StringJamak, StringJamak);}

            return StrUtuh;}

        private string balikString(string BalikIni){
            string balikStr = "";
            int ii;
            for (ii = (BalikIni.Length - 1); ii > 0; ii--){
                balikStr += BalikIni.Substring(ii, 1);}
            return balikStr;}

        private string AcakBiner(string aString){
            int acakRep;

            Random intAcak = new Random();
            string baruString = "";
            string aKar = SemuaKarSumber;
            string karSatu = aKar.Substring(intAcak.Next(aKar.Length), 1);
            aKar = aKar.Replace(karSatu, "");
            string aNol = aKar.Substring(intAcak.Next(aKar.Length), 1);
            aKar = aKar.Replace(aNol, "");

            int IntStrPjg = aString.Length;

            foreach (char OZkar in aString){
                acakRep = intAcak.Next(3);

                switch (OZkar){
                    case '1':
                        baruString += SatuDanNol(acakRep, karSatu) + SatuDanNol(acakRep, ";");
                        break;
                    case '0':
                        baruString += SatuDanNol(acakRep, aNol) + SatuDanNol(acakRep, ":");
                        break;}

                baruString += SatuDanNol(intAcak.Next(1, 3),
                        aKar.Substring(intAcak.Next(aKar.Length), 1));}

            return SatuDanNol(intAcak.Next(1, 3), aKar.Substring(intAcak.Next(aKar.Length), 1))
                + baruString + SatuDanNol(intAcak.Next(3), karSatu) +
                SatuDanNol(intAcak.Next(3), aNol)
                + SatuDanNol(intAcak.Next(1, 3), aKar.Substring(intAcak.Next(aKar.Length), 1));}

        private string SatuDanNol(int Rept, string sOZ){
            int ii;
            for (ii = 0; ii < Rept; ii++){
                sOZ += sOZ.Substring(0, 1);}
            return sOZ;}

        private char GetKarakter(string strBiner){
            return (char)Convert.ToInt32(strBiner, 2);}

        private string GetBiner(char strKar){
            return Convert.ToString(strKar, 2).PadLeft(8, '0');}}
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PengacakTeks2
{
    public partial class FormPengacakTeks : Form{
        PengacakTeks.Pengacak BaruSumber = new PengacakTeks.Pengacak();

        public FormPengacakTeks(){
            InitializeComponent();}

        private void btnBinerKeTeks_Click(object sender, EventArgs e){
            MessageBox.Show(BaruSumber.StringUtama(teksKodeBiner.Text ,0));}

        private void btnAcakKeTeks_Click(object sender, EventArgs e){
            MessageBox.Show(BaruSumber.StringUtama(teksAcak.Text, 1));}

        private void btnAcak_Click(object sender, EventArgs e){
            teksKodeBiner.Text = BaruSumber.StringBiner(teksTeks.Text);
            teksAcak.Text = BaruSumber.StringAcak(teksTeks.Text);}

        private void btnKeluar_Click(object sender, EventArgs e){
            if (Application.MessageLoop){
                Application.Exit();}
            else{
                Environment.Exit(1);}}}
}



1.12 Mesin Enigma


using System;
using System.Text;
using System.Windows.Forms;

namespace Enigma
{
       
        public class Rotor
        {
                private string tataLetak;
                private byte offset;
                private Rotor sbmlmNya, slnjtNya;
                private Label lbl;
                private char cIn = '\0', notchPos;
       
                public Rotor(string aTataLetak,Label lbl,char notchPos)
                {
                        this.tataLetak = aTataLetak;
                        this.sbmlmNya = sbmlmNya;
                        this.slnjtNya = slnjtNya;
                        this.lbl = lbl;
                        this.notchPos = notchPos;
                        offset = 0;
                       
                }
               
                public string GetTataLetak(){
                        return tataLetak;
                }
               
                public void SetRotorSelanjutnya(Rotor slnjtnya){
                        this.slnjtNya = slnjtnya;
                }
                public void SetRotorSblmNya(Rotor sblmnya){
                        this.sbmlmNya = sblmnya;
                }
               
                public char GetKarTerbalikPada(string kar){
                        int pos = tataLetak.IndexOf(kar);
                       
                        if(offset>pos){
                                pos = 26 - (offset-pos);
                        }else{
                                pos = pos - offset;
                        }
                       
                        if(sbmlmNya!=null){
                                pos = (pos+sbmlmNya.GetOffset())%26;
                        }
                       
                        return (char)(65+pos);
                }
               
                public int GetOffset(){
                        return offset;
                }
               
                public char GetNotchPos(){
                        return notchPos;
                }
               
                public void ResetOffset(){
                        offset = 0;
                }
               
                public bool AdaSelanjutnya(){
                        return slnjtNya!=null;
                }
               
                public bool AdaSebelumnya(){
                        return sbmlmNya!=null;
                }
               
                public void Geser(){
                        if(slnjtNya==null){
                                return;
                        }
                        offset++;
                        if(offset==26){
                                offset = 0;
                        }
                       
                        if(slnjtNya!=null && (offset+66) == ((notchPos-64)%26)+66){
                                slnjtNya.Geser();
                        }
                        lbl.Text = ""+((char)(65+offset));
                }
               
                public void GeserBalik(){
                        if(offset==0){
                                offset = 26;
                        }
                        offset--;
                       
                        lbl.Text = ""+((char)(65+offset));
                }
               
                public void TempatkanDataPada(char s){
                        cIn = s;
                        char c = s;
                        c = (char)(((c - 65) + offset) % 26 + 65);
                       
                        if(slnjtNya!=null){
                                c = tataLetak.Substring((c-65),1).ToCharArray()[0];
                                if((((c-65)+(-offset))%26 + 65)>=65){
                                        c = (char)(((c-65)+(-offset))%26 + 65);
                                }else{
                                        c = (char)(((c-65)+(26+(-offset)))%26 + 65);
                                }
                                slnjtNya.TempatkanDataPada(c);
                               
                        }
                }
               
                public char GetDataKel(){
                        char c = '\0';
                       
                        if(slnjtNya!=null){
                                c = slnjtNya.GetDataKel();
                                c = GetKarTerbalikPada(""+c);
                        }else{
                                c = tataLetak.Substring((cIn-65),1).ToCharArray()[0];
                                c = (char)(((c - 65) + sbmlmNya.offset)%26+65);
                               
                        }
                       
                        return c;
                }
        }
}

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;

namespace Enigma
{
        public class Pengaturan : System.Windows.Forms.Form
        {
                private System.ComponentModel.IContainer components;
                private System.Windows.Forms.ListBox listRotorDipilih;
                private System.Windows.Forms.Label lblStrukturRotor;
                private System.Windows.Forms.ListBox listRotor;
                private System.Windows.Forms.Button btnCancel;
                private System.Windows.Forms.GroupBox groupBox1;
                private System.Windows.Forms.ComboBox cmbReflektor;
                private System.Windows.Forms.ToolTip ttDown;
                private System.Windows.Forms.ToolTip ttSelect;
                private System.Windows.Forms.ToolTip ttDeselect;
                private System.Windows.Forms.Button btnAtas;
                private System.Windows.Forms.Label label3;
                private System.Windows.Forms.Label label2;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.Button btnTakPilih;
                private System.Windows.Forms.Button btnOk;
                private System.Windows.Forms.Label label4;
                private System.Windows.Forms.Button btnBawah;
                private System.Windows.Forms.Button btnPilih;
                private System.Windows.Forms.ToolTip ttUp;
                private string rotor1,rotor2,rotor3,rotor4,rotor5;
                private FormUtama mf;
                private ArrayList al1, al2, al3;
               
                public Pengaturan(FormUtama mf)
                {
                        InitializeComponent();
                        this.mf = mf;

                }
               
                void BtnCancelClick(object sender, System.EventArgs e)
                {
                        Close();
                }
               
                void MuatPengaturan(object sender, System.EventArgs e)
                {
                        al1 = new ArrayList();
                        al2 = new ArrayList();
                        al3 = new ArrayList();
                        al1.Add("Rotor I");
                        al1.Add("Rotor II");
                        al1.Add("Rotor III");
                        al1.Add("Rotor IV");
                        al1.Add("Rotor V");
                        rotor1 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ";
                        rotor2 = "AJDKSIRUXBLHWTMCQGZNPYFVOE";
                        rotor3 = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
                        rotor4 = "ESOVPZJAYQUIRHXLNFTGKDCMWB";
                        rotor5 = "VZBRGITYUPSDNHLXAWMJQOFECK";
                        al2.Add(rotor1);
                        al2.Add(rotor2);
                        al2.Add(rotor3);
                        al2.Add(rotor4);
                        al2.Add(rotor5);
                        al3.Add("Q");
                        al3.Add("E");
                        al3.Add("V");
                        al3.Add("J");
                        al3.Add("Z");
                        listRotor.Items.Clear();
                        for(int i=0;i<al1.Count;i++){
                                listRotor.Items.Add(al1[i]);
                        }
                        ttSelect.SetToolTip(btnPilih,"Pilih rotor yang tersedia");
                        ttDeselect.SetToolTip(btnTakPilih,"Hapus rotor");
                        ttUp.SetToolTip(btnAtas,"Menggeser atas pemilihan");
                        ttDown.SetToolTip(btnBawah,"Menggeser bawah pemilihan");
                       
                        for(int i=0;i<cmbReflektor.Items.Count;i++){
                                if(cmbReflektor.Items[i].ToString().
                                        EndsWith(mf.GetReflektor())){
                                        cmbReflektor.SelectedIndex = i;
                                }
                        }
                       
                        for(int i=0;i<al2.Count;i++){
                                if(al2[i].ToString()==mf.GetRotorKiri()){
                                        listRotor.Items.Remove(al1[i].ToString());
                                        listRotorDipilih.Items.Add(al1[i].ToString());
                                        break;
                                }
                        }
                       
                        for(int i=0;i<al2.Count;i++){
                                if(al2[i].ToString()==mf.GetRotorTengah()){
                                        listRotor.Items.Remove(al1[i].ToString());
                                        listRotorDipilih.Items.Add(al1[i].ToString());
                                        break;
                                }
                        }
                        for(int i=0;i<al2.Count;i++){
                                if(al2[i].ToString()==mf.GetRotorKanan()){
                                        listRotor.Items.Remove(al1[i].ToString());
                                        listRotorDipilih.Items.Add(al1[i].ToString());
                                        break;
                                }
                        }
                }
               
                void ListRotorTersediaSelectedIndexChanged(object sender, System.EventArgs e)
                {
                        if(listRotor.SelectedIndex<0){
                                return;
                        }
                        for(int i=0;i<al1.Count;i++){
                                if(listRotor.SelectedItem.ToString() == "" + al1[i]){
                                        lblStrukturRotor.Text = "" + al2[i];
                                        return;
                                }
                        }
                        lblStrukturRotor.Text = "";
                }
               
                void btnPilihClick(object sender, System.EventArgs e)
                {
                        if(listRotor.SelectedIndex<0){
                                MessageBox.Show(this,"Pilih rotor yang
                                        tersedia!","Perhatian!",MessageBoxButtons.OK,
                                        MessageBoxIcon.Exclamation);
                                return;
                        }
                        listRotorDipilih.Items.Add(listRotor.SelectedItem);
                        listRotor.Items.Remove(listRotor.SelectedItem);
                        lblStrukturRotor.Text = "";
                }
               
                void btnTakPilihClick(object sender, System.EventArgs e)
                {
                        if(listRotorDipilih.SelectedIndex<0){
                MessageBox.Show(this, "Hapus rotor!", "Perhatian!", MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation);
                                return;
                        }
                        listRotor.Items.Add(listRotorDipilih.SelectedItem);
                        listRotorDipilih.Items.Remove(listRotorDipilih.SelectedItem);
                }
               
                void btnAtasClick(object sender, System.EventArgs e)
                {
                        if(listRotorDipilih.SelectedIndex<=0){
                                return;
                        }
                       
                        string strTemp =
                                ""+listRotorDipilih.Items[listRotorDipilih.SelectedIndex-1];
                        listRotorDipilih.Items[listRotorDipilih.SelectedIndex -1 ] =
                                listRotorDipilih.SelectedItem;
                        listRotorDipilih.Items[listRotorDipilih.SelectedIndex] = strTemp;
                        listRotorDipilih.SelectedIndex = listRotorDipilih.SelectedIndex - 1;
                       
                }
               
                void btnBawahClick(object sender, System.EventArgs e)
                {
                        if(listRotorDipilih.SelectedIndex<0 || listRotorDipilih.SelectedIndex ==
                                listRotorDipilih.Items.Count-1){
                                return;
                        }
                       
                        string strTemp =
                                ""+listRotorDipilih.Items[listRotorDipilih.SelectedIndex+1];
                        listRotorDipilih.Items[listRotorDipilih.SelectedIndex +1 ] =
                                listRotorDipilih.SelectedItem;
                        listRotorDipilih.Items[listRotorDipilih.SelectedIndex] = strTemp;
                        listRotorDipilih.SelectedIndex = listRotorDipilih.SelectedIndex + 1;
                }
               
                void BtnOkClick(object sender, System.EventArgs e)
                {
                        if(listRotorDipilih.Items.Count!=3){
                                MessageBox.Show(this,"Semua pengaturan akan
                                        dimuat!","Perhatian!",MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                                return;
                        }
                       
                        ArrayList alRot = new ArrayList();
                        ArrayList alRotNama = new ArrayList();
                        ArrayList alRotNotch = new ArrayList();
                       
                        for(int j=0;j<listRotorDipilih.Items.Count;j++){
                                for(int i=0;i<al1.Count;i++){
                                        if(listRotorDipilih.Items[j].ToString() == "" + al1[i]){
                                                alRot.Add(al2[i]);
                                                alRotNama.Add(al1[i].ToString().Substring(al1[i].ToString().LastIndexOf(" ")).Trim());
                                                alRotNotch.Add(al3[i]);
                                                break;
                                        }
                                }
                        }
                       
                        mf.UbahRotor(alRot[0].ToString(),
                                        alRotNama[0].ToString(),
                                        alRotNotch[0].ToString().ToCharArray()[0],
                                        alRot[1].ToString(),
                                        alRotNama[1].ToString(),
                                        alRotNotch[1].ToString().ToCharArray()[0],
                                        alRot[2].ToString(),
                                        alRotNama[2].ToString(),
                                        alRotNotch[2].ToString().ToCharArray()[0]);
                       
                        if(cmbReflektor.SelectedIndex>-0){
                                mf.SetReflektor(cmbReflektor.SelectedItem.ToString().Substring(cmbReflektor.SelectedItem
                .ToString().LastIndexOf("=")+2).Trim());
                        }
                        Close();
                }
               
        }
}

  

1.13 Hash MD5 dan SHA1





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Threading;

namespace PerangkatHASH {
    public partial class FormHASH : Form {

        string teks = "", filePath = "";
        byte[] inArr;
        int ukuranBuffer = 1024, bufferPembagi = 100;
        long ukuranFile = 0;

        MD5CryptoServiceProvider serviceMD5;
        SHA1CryptoServiceProvider serviceSHA1;
        OpenFileDialog diag;
        FileStream stream;

        public FormHASH() {
            InitializeComponent();

            serviceMD5  = new MD5CryptoServiceProvider();
            serviceSHA1 = new SHA1CryptoServiceProvider();
            diag = new OpenFileDialog();
        }

        private void btnEnkripsi_Click(object sender, EventArgs e) {
            teks = teksPesan.Text;
            if(teks.Length > 0) {

                inArr = System.Text.Encoding.ASCII.GetBytes(teks);
                teksMD5.Text =  System.BitConverter.ToString(serviceMD5.ComputeHash(inArr)).Replace("-", "").ToLowerInvariant();
                teksSHA1.Text = System.BitConverter.ToString(serviceSHA1.ComputeHash(inArr)).Replace("-", "").ToLowerInvariant();
            }
            else {
                teksMD5.Text = "";
                teksSHA1.Text = "";
                teks = "";
            }
        }

        private void btnBrowse_Click(object sender, EventArgs e) {

            if(diag.ShowDialog() == DialogResult.OK) {

                textBox5.Text = "";
                textBox6.Text = "";

                filePath = diag.FileName;
                if(filePath.Length > 40) { teksFile.Text = filePath.Substring(0, 20) + "[...]" + filePath.Substring(diag.FileName.Length - 20, 20); }
                else { teksFile.Text = filePath; }
                stream = new FileStream(diag.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
                ukuranFile = stream.Length;

                if(ukuranFile <= 0) {
                    teksFile.Text = "";
                    filePath = "";
                    MessageBox.Show("File Kosong!");                   
                }
                else if(ukuranFile < 1024) {
                    ukuranBuffer = (int)(ukuranFile / 1);
                    progressBar1.Maximum = (int)(ukuranFile / ukuranBuffer);
                    progressBar2.Maximum = progressBar1.Maximum;
                    stream.Close();
                }
                else {
                    ukuranBuffer = (int)(ukuranFile / bufferPembagi);
                    progressBar1.Maximum = (int)(ukuranFile / ukuranBuffer);
                    progressBar2.Maximum = progressBar1.Maximum;
                    stream.Close();
                }
            }
        }


        private void btnSalinMD5_Click(object sender, EventArgs e) {
            if(teks.Length > 0) {
                System.Windows.Forms.Clipboard.SetText(teksMD5.Text);
            }
        }

        private void btnSalinSHA1_Click(object sender, EventArgs e) {
            if(teks.Length > 0) {
                System.Windows.Forms.Clipboard.SetText(teksSHA1.Text);
            }
        }

        public void gerakProgressBar(ProgressBar p) {
            if(p.Value < 100) { p.Value += 1; }
            else { p.Value = 0; }
        }

        private void btnGetMD5_Click(object sender, EventArgs e) {
            if(filePath.Length > 0) {
                progressBar1.Show();
                btnBrowse.Enabled = false;
                btnGetMD5.Enabled = false;
                btnGetSHA1.Enabled = false;
                BackgroundWorker getFileMD5 = new BackgroundWorker();
                getFileMD5.DoWork += new DoWorkEventHandler(MD5_Kerjakan);
                getFileMD5.RunWorkerCompleted += new RunWorkerCompletedEventHandler(MD5_Selesai);
                getFileMD5.RunWorkerAsync();
            }
        }

        public void MD5_Kerjakan(object sender, DoWorkEventArgs e) {
            stream = new FileStream(diag.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
            byte[] buffer = new byte[ukuranBuffer];
            int bacaJumlah;
            HashAlgorithm algoritma = MD5.Create();

            while((bacaJumlah = stream.Read(buffer, 0, ukuranBuffer)) > 0) {
                algoritma.TransformBlock(buffer, 0, bacaJumlah, buffer, 0);
                progressBar1.Invoke((MethodInvoker)delegate() {
                    if(progressBar1.Value < progressBar1.Maximum)
                        progressBar1.Value += 1;
                    else
                        progressBar1.Value = 0;
                });
            }
            algoritma.TransformFinalBlock(buffer, 0, bacaJumlah);
            string result = System.BitConverter.ToString(algoritma.Hash).Replace("-", "");           
            e.Result = result;
        }

        public void MD5_Selesai(object sender, RunWorkerCompletedEventArgs e) {
            stream.Close();
            progressBar1.Value = 0;
            progressBar1.Hide();
            textBox5.Text = ((string)e.Result).ToLowerInvariant();
            btnBrowse.Enabled = true;
            btnGetMD5.Enabled = true;
            btnGetSHA1.Enabled = true;

            System.Windows.Forms.Clipboard.SetText(textBox5.Text);
            MessageBox.Show("Hash MD5 atas file disalin ke clipboard");
        }

        private void btnGetSHA1_Click(object sender, EventArgs e) {
            if(filePath.Length > 0) {
                if(filePath.Length > 0) {
                    progressBar2.Show();                       
                    btnBrowse.Enabled = false;
                    btnGetMD5.Enabled = false;
                    btnGetSHA1.Enabled = false;
                    BackgroundWorker getFileSHA1 = new BackgroundWorker();
                    getFileSHA1.DoWork += new DoWorkEventHandler(SHA1_Kerjakan);
                    getFileSHA1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(SHA1_Selesai);
                    getFileSHA1.RunWorkerAsync();
                }
            }
        }

        public void SHA1_Kerjakan(object sender, DoWorkEventArgs e) {
            stream = new FileStream(diag.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
            byte[] buffer = new byte[ukuranBuffer];
            int bacaJumlah;
            HashAlgorithm algoritma = SHA1.Create();

            while((bacaJumlah = stream.Read(buffer, 0, ukuranBuffer)) > 0) {
                algoritma.TransformBlock(buffer, 0, bacaJumlah, buffer, 0);
                progressBar2.Invoke((MethodInvoker)delegate() {
                    if(progressBar2.Value < progressBar1.Maximum)
                        progressBar2.Value += 1;
                    else
                        progressBar2.Value = 0;
                });
            }
            algoritma.TransformFinalBlock(buffer, 0, bacaJumlah);
            string result = System.BitConverter.ToString(algoritma.Hash).Replace("-", "");
            e.Result = result;
        }

        public void SHA1_Selesai(object sender, RunWorkerCompletedEventArgs e) {
            stream.Close();
            progressBar2.Value = 0;
            progressBar2.Hide();
            textBox6.Text = ((string)e.Result).ToLowerInvariant();
            btnBrowse.Enabled = true;
            btnGetMD5.Enabled = true;
            btnGetSHA1.Enabled = true;

            System.Windows.Forms.Clipboard.SetText(textBox6.Text);
            MessageBox.Show("Hash SHA1 atas file disalin ke clipboard");
        }

        private void Form1_Load(object sender, EventArgs e) {

        }

    }
}