예제 #1
0
    static void Main(string[] args)
    {
        Console.WriteLine("This example shows how to use the symmetric encryption classes from the Security Library.\r\n");
        SymmetricAlgorithm algorithm;
        ICryptoTransform   encryptor, decryptor;

        Console.WriteLine("Select the symmetric algorithm you want to use:");
        Console.WriteLine("  [1] ARCFour [managed RC4]");
        Console.WriteLine("  [2] RC4 [unmanaged]");
        Console.WriteLine("  [3] Rijndael");
        Console.Write("Your choice: ");
        string input = Console.ReadLine().Trim();

        // initialize the selected symmetric algorithm
        switch (input)
        {
        case "1":
            algorithm = new ARCFourManaged();
            break;

        case "2":
            algorithm = new RC4CryptoServiceProvider();
            break;

        case "3":
            algorithm = new RijndaelCryptoServiceProvider();
            break;

        default:
            Console.WriteLine("Invalid input.");
            return;
        }
        Console.WriteLine("Enter some text that will be encrypted:");
        input = Console.ReadLine();
        byte[] plaintext = Encoding.ASCII.GetBytes(input);
        // generate an IV that consists of bytes with the value zero
        // in real life applications, the IV should not be set to
        // an array of bytes with the value zero!
        algorithm.IV = new byte[algorithm.BlockSize / 8];
        // generate a new key
        algorithm.GenerateKey();
        // create the encryption and decryption objects
        encryptor = algorithm.CreateEncryptor();
        decryptor = algorithm.CreateDecryptor();
        // encrypt the bytes
        byte[] encrypted = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length);
        // decrypt the encrypted bytes
        byte[] decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length);
        // write the byte arrays to the console
        Console.WriteLine("\r\nResults:");
        Console.WriteLine("  Input data: " + Encoding.ASCII.GetString(plaintext));
        Console.WriteLine("  Key: " + BytesToHex(algorithm.Key));
        Console.WriteLine("  Encrypted data: " + BytesToHex(encrypted));
        Console.WriteLine("  Decrypted data: " + Encoding.ASCII.GetString(decrypted));
        Console.WriteLine("\r\nPress ENTER to continue...");
        Console.ReadLine();
        // dispose of the resources
        algorithm.Clear();
        encryptor.Dispose();
        decryptor.Dispose();
    }
예제 #2
0
        private int StartTest(int keySize, int blockSize, PaddingMode padding, CipherMode mode)
        {
            Rijndael rm, ru;

            try {
                rm           = new RijndaelManaged();
                ru           = new RijndaelCryptoServiceProvider();
                rm.KeySize   = ru.KeySize = keySize;
                rm.BlockSize = ru.BlockSize = blockSize;
                rm.Padding   = ru.Padding = padding;
                rm.Mode      = ru.Mode = mode;
                rm.GenerateIV();
                ru.IV = rm.IV;
                rm.GenerateKey();
                ru.Key = rm.Key;
            } catch {
                AddError("RUT-ST01");
                return(1);
            }
            ICryptoTransform rmt, rut;

            // test encryption
            try {
                rmt = rm.CreateEncryptor();
                rut = ru.CreateEncryptor();
            } catch {
                AddError("RUT-ST02");
                return(2);
            }
            if (rmt.InputBlockSize != rut.InputBlockSize)
            {
                AddError("RUT-ST03");
            }
            if (rmt.OutputBlockSize != rut.OutputBlockSize)
            {
                AddError("RUT-ST04");
            }
            byte[] toEncrypt = new byte[123];
            new RNGCryptoServiceProvider().GetBytes(toEncrypt);
            byte[] me, ue;
            try {
                me = rmt.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
            } catch {
                AddError("RUT-ST05");
                return(5);
            }
            try {
                ue = rut.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
            } catch {
                AddError("RUT-ST06");
                return(6);
            }
            if (!ArrayEquals(me, ue))
            {
                AddError("RUT-ST07");
            }
            byte[] menc = null;
            byte[] uenc = null;
            int    uo = 0, mo = 0;

            try {
                menc = new byte[toEncrypt.Length + rmt.OutputBlockSize];
                uenc = new byte[toEncrypt.Length + rut.OutputBlockSize];
                for (int i = 0; i < toEncrypt.Length; i += rmt.InputBlockSize)
                {
                    if (toEncrypt.Length > i + rmt.InputBlockSize)
                    {
                        mo += rmt.TransformBlock(toEncrypt, i, rmt.InputBlockSize, menc, mo);
                        uo += rut.TransformBlock(toEncrypt, i, rut.InputBlockSize, uenc, uo);
                    }
                    else
                    {
                        if (padding == PaddingMode.PKCS7)
                        {
                            byte[] temp = rmt.TransformFinalBlock(toEncrypt, i, toEncrypt.Length - i);
                            Array.Copy(temp, 0, menc, mo, temp.Length);
                            mo  += temp.Length;
                            temp = rut.TransformFinalBlock(toEncrypt, i, toEncrypt.Length - i);
                            Array.Copy(temp, 0, uenc, uo, temp.Length);
                            uo += temp.Length;
                        }
                    }
                }
            } catch {
                AddError("RUT-ST08");
            }
            if (mo != uo || !ArrayEquals(menc, uenc, 0, mo))
            {
                AddError("RUT-ST09");
            }
            if (padding == PaddingMode.PKCS7)
            {
                if (mo != me.Length || uo != ue.Length)
                {
                    AddError("RUT-ST10");
                }
                if (!ArrayEquals(menc, me, 0, mo))
                {
                    AddError("RUT-ST11");
                }
                if (!ArrayEquals(uenc, ue, 0, uo))
                {
                    AddError("RUT-ST12");
                }
            }
            // test decryption
            try {
                rmt = rm.CreateDecryptor();
                rut = ru.CreateDecryptor();
            } catch {
                AddError("RUT-ST13");
                return(13);
            }
            if (rmt.InputBlockSize != rut.InputBlockSize)
            {
                AddError("RUT-ST14");
            }
            if (rmt.OutputBlockSize != rut.OutputBlockSize)
            {
                AddError("RUT-ST15");
            }
            byte[] md, ud;
            try {
                md = rmt.TransformFinalBlock(me, 0, me.Length);
            } catch {
                AddError("RUT-ST16");
                return(16);
            }
            try {
                ud = rut.TransformFinalBlock(ue, 0, ue.Length);
            } catch {
                AddError("RUT-ST17");
                return(17);
            }
            if (!ArrayEquals(md, ud))
            {
                AddError("RUT-ST18");
            }
            byte[] mdec = null;
            byte[] udec = null;
            int    uod = 0, mod = 0;

            try {
                mdec = new byte[me.Length];
                udec = new byte[ue.Length];
                for (int i = 0; i < me.Length; i += rmt.InputBlockSize)
                {
                    if (me.Length > i + rmt.InputBlockSize)
                    {
                        mod += rmt.TransformBlock(me, i, rmt.InputBlockSize, mdec, mod);
                        uod += rut.TransformBlock(ue, i, rut.InputBlockSize, udec, uod);
                    }
                    else
                    {
                        if (padding == PaddingMode.PKCS7)
                        {
                            byte[] temp = rmt.TransformFinalBlock(me, i, me.Length - i);
                            Array.Copy(temp, 0, mdec, mod, temp.Length);
                            mod += temp.Length;
                            temp = rut.TransformFinalBlock(ue, i, ue.Length - i);
                            Array.Copy(temp, 0, udec, uod, temp.Length);
                            uod += temp.Length;
                        }
                    }
                }
            } catch {
                AddError("RUT-ST19");
            }
            if (mod != uod || !ArrayEquals(mdec, udec, 0, mod))
            {
                AddError("RUT-ST20");
            }
            if (padding == PaddingMode.PKCS7)
            {
                if (mod != md.Length || uod != ud.Length)
                {
                    AddError("RUT-ST21");
                }
                if (!ArrayEquals(mdec, md, 0, md.Length))
                {
                    AddError("RUT-ST22");
                }
                if (!ArrayEquals(udec, ud, 0, ud.Length))
                {
                    AddError("RUT-ST23");
                }
                if (!ArrayEquals(ud, toEncrypt))
                {
                    AddError("RUT-ST24");
                }
            }
            return(24);
        }