示例#1
0
        public void TripleDESCngModeRoundTripTests()
        {
            int blockSize = 0;

            using (TripleDESCng tdes = new TripleDESCng())
            {
                blockSize = tdes.BlockSize / 8;
            }

            using (RNGCng rng = new RNGCng())
            {
                for (int i = 1; i <= 10; ++i)
                {
                    byte[] data = new byte[i * blockSize];
                    rng.GetBytes(data);

                    foreach (var cipherMode in new CipherMode[] { CipherMode.CBC, CipherMode.ECB, CipherMode.CFB })
                    {
                        Assert.IsTrue(RoundTripHelper(data, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Mode = cipherMode; }), i.ToString() + " blocks - " + cipherMode.ToString());
                    }

                    foreach (var chainingMode in new CngChainingMode[] { CngChainingMode.Cbc, CngChainingMode.Ecb, CngChainingMode.Cfb })
                    {
                        Assert.IsTrue(RoundTripHelper(data, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { (tdes as ICngSymmetricAlgorithm).CngMode = chainingMode; }), i.ToString() + " blocks - " + chainingMode.ToString());
                    }
                }
            }
        }
示例#2
0
        public void TripleDESCngPaddingRoundTripTests()
        {
            int blockSize = 0;

            using (TripleDESCng tdes = new TripleDESCng())
            {
                blockSize = tdes.BlockSize / 8;
            }

            using (RNGCng rng = new RNGCng())
            {
                byte[] zeroByte = new byte[0];

                byte[] oneByte = new byte[1];
                rng.GetBytes(oneByte);

                byte[] blockMinusOne = new byte[blockSize - 1];
                rng.GetBytes(blockMinusOne);

                byte[] block = new byte[blockSize];
                rng.GetBytes(block);

                byte[] blockPlusOne = new byte[blockSize + 1];
                rng.GetBytes(blockPlusOne);

                foreach (var paddingMode in new PaddingMode[] { PaddingMode.ANSIX923, PaddingMode.ISO10126, PaddingMode.PKCS7 })
                {
                    Assert.IsTrue(RoundTripHelper(zeroByte, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Padding = paddingMode; }), paddingMode.ToString() + " - zeroByte");
                    Assert.IsTrue(RoundTripHelper(oneByte, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Padding = paddingMode; }), paddingMode.ToString() + " - oneByte");
                    Assert.IsTrue(RoundTripHelper(blockMinusOne, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Padding = paddingMode; }), paddingMode.ToString() + " - blockMinusOne");
                    Assert.IsTrue(RoundTripHelper(block, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Padding = paddingMode; }), paddingMode.ToString() + " - block");
                    Assert.IsTrue(RoundTripHelper(blockPlusOne, typeof(TripleDESCng), typeof(TripleDESCng), (tdes) => { tdes.Padding = paddingMode; }), paddingMode.ToString() + " - blockPlusOne");
                }
            }
        }
示例#3
0
        public static EncryptedFile encryptDataForSharedFile(byte[] inputBytes, X509Certificate2 targetUserCertificate)
        {
            byte[] encryptedData_DsCombo;

            byte[] symmetricKey;

            TripleDESCng des = new TripleDESCng();

            symmetricKey = des.Key;

            var cer    = File.ReadAllText((Application.Current.Properties["userCertificateLocation"].ToString()));
            var eccPem = File.ReadAllText(Application.Current.Properties["userPrivateKeyLocation"].ToString());
            var cert   = X509Certificate2.CreateFromPem(cer, eccPem);


            //digital signature, hash of the original document, encrypted by users private key
            RSACng rsa = (RSACng)cert.GetRSAPrivateKey();

            byte[] signedHash = rsa.SignData(inputBytes, HashAlgorithmName.SHA384, RSASignaturePadding.Pkcs1);


            //data + digitalsignature (sha384 - 384bits)
            byte[] data_ds_combo = combine(inputBytes, signedHash);

            encryptedData_DsCombo = encryptBytes(des, data_ds_combo);
            //[data + digital signature]

            byte[] keyEncrypted = encryptBytesPublicKey(symmetricKey, targetUserCertificate);//userCertificate);

            EncryptedFile outFile = new EncryptedFile(encryptedData_DsCombo, keyEncrypted, des.IV);

            //initialize sender, so we know whose certificate to use for data verification
            outFile.setSender(Encoding.UTF8.GetBytes(Application.Current.Properties["Username"].ToString()));
            return(outFile);
        }
示例#4
0
        public static void VerifyDefaults()
        {
            using TripleDES tdes = new TripleDESCng();
            Assert.Equal(64, tdes.BlockSize);
            Assert.Equal(192, tdes.KeySize);
            Assert.Equal(CipherMode.CBC, tdes.Mode);
            Assert.Equal(PaddingMode.PKCS7, tdes.Padding);

            // .NET Framework Compat: The default feedback size of TripleDESCng
            // is 64 while TripleDESCryptoServiceProvider defaults to 8.
            Assert.Equal(64, tdes.FeedbackSize);
        }
示例#5
0
 public void TripleDESCngDefaultPropertiesTest()
 {
     using (TripleDESCng tdes = new TripleDESCng())
     {
         Assert.AreEqual(64, tdes.BlockSize);
         Assert.AreEqual(CngChainingMode.Cbc, tdes.CngMode);
         Assert.AreEqual(192, tdes.KeySize);
         Assert.AreEqual(CipherMode.CBC, tdes.Mode);
         Assert.AreEqual(PaddingMode.PKCS7, tdes.Padding);
         Assert.AreEqual(CngProvider2.MicrosoftPrimitiveAlgorithmProvider, tdes.Provider);
     }
 }
示例#6
0
        // при ЗАГРУЗКЕ ФОРМЫ для ввода ключа и IV
        private void Form2_Load(object sender, EventArgs e)
        {
            // Выделили память и установили длину ключей и IV
            // в зависимости от алгоритма
            aescng    = new AesCng();
            tripledes = new TripleDESCng();
            if (AlgName == "AES")
            {
                this.txt_key.MaxLength = 64;
                this.txt_iv.MaxLength  = 32;
            }

            if (AlgName == "3DES")
            {
                this.txt_key.MaxLength = 48;
                this.txt_iv.MaxLength  = 16;
            }

            // если раннее были введенны ключи то вывести их на форму
            if (global.Simm_KeyIV_isEntry)
            {
                this.txt_key.Text = alg.ByteArrayTOStringHEX(global.Simm_byte_key);
                this.txt_iv.Text  = alg.ByteArrayTOStringHEX(global.Simm_byte_iv);
            }

            // Подсказка у кнопки загрузки ключа
            this.toolTip_LoadKeyIV.ToolTipTitle = this.btn_loadKeyIV.Text;
            this.toolTip_LoadKeyIV.ToolTipIcon  = ToolTipIcon.Info;
            this.toolTip_LoadKeyIV.SetToolTip(this.btn_loadKeyIV, "В файле должно быть две строки в 16-ричном виде.\n1-ая строка: Ключ длинной 64 знака.\n2-ая строка: Вектор(IV) длиной 32 знакак.");

            // Инструкция сверху формы
            this.label_simm_entryKeyIV.Text  = "> Ключом могут быть только 16-ричные цифры (0-9, A-F).\n";
            this.label_simm_entryKeyIV.Text += "> Длина ключа должна быть обязательно равна " + txt_key.MaxLength + " знакам!\n\n";
            this.label_simm_entryKeyIV.Text += "> В векторе могут быть только 16-ричные цифры (0-9, A-F).\n";
            this.label_simm_entryKeyIV.Text += "> Длина должна быть обязательно равна " + txt_iv.MaxLength + " знакам!\n";


            if (global.Simm_EncryptOrDecrypt) // если загрузили для ШИФРОВАНИЯ
            {
                this.Text = "ШИФРОВАНИЕ: Ввод ключа (Key) и вектора инициализации (IV)";
                // показать кнопки случайно генерации
                this.btn_generate_key.Visible    = true;
                this.btn_generate_iv.Visible     = true;
                this.label_simm_entryKeyIV.Text += "\n> Стрелки - случайное заполнение ключа и вектора (IV).";
            }
            else  // если загрузили для РАСШИФРОВКИ
            {
                this.Text = "РАСШИФРОВКА: Ввод ключа (Key) и вектора инициализации (IV)";
                this.btn_generate_key.Visible = false;
                this.btn_generate_iv.Visible  = false;
            }
        }
示例#7
0
        public void TripleDESCngBlockRoundTripTests()
        {
            int blockSize = 0;

            using (TripleDESCng tdes = new TripleDESCng())
            {
                blockSize = tdes.BlockSize / 8;
            }

            Assert.IsTrue(RoundTripHelper(0), "Zero byte round trip failed");
            Assert.IsTrue(RoundTripHelper(1), "One byte round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize - 1), "Block size - 1 round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize), "Block size round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize + 1), "Block size + 1 round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize * 2), "Block size * 2 round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize * 10), "Block size * 10 round trip failed");
            Assert.IsTrue(RoundTripHelper(blockSize * 1024), "Block size * 1024 round trip failed");
        }
示例#8
0
        //[Fact] - Keeping this test for reference but we don't want to run it as an inner-loop test because
        //         it creates a key on disk.
        public static void StoredKeyTripleDES()
        {
            CngAlgorithm algname = new CngAlgorithm("3DES");
            string       keyName = "CoreFxTest-" + Guid.NewGuid();
            CngKey       _cngKey = CngKey.Create(algname, keyName);

            try
            {
                using (TripleDES alg = new TripleDESCng(keyName))
                {
                    int keySize = alg.KeySize;
                    Assert.Equal(192, keySize);

                    // Since this is a stored key, it's not going to surrender the actual key bytes.
                    Assert.ThrowsAny <CryptographicException>(() => alg.Key);
                }
            }
            finally
            {
                _cngKey.Delete();
            }
        }
示例#9
0
        public static byte[] decryptSharedFile(EncryptedFile encryptedFile, X509Certificate2 senderCertificate)
        {
            TripleDESCng aes = new TripleDESCng();

            var cer    = File.ReadAllText((Application.Current.Properties["userCertificateLocation"].ToString()));
            var eccPem = File.ReadAllText(Application.Current.Properties["userPrivateKeyLocation"].ToString());
            var cert   = X509Certificate2.CreateFromPem(cer, eccPem);


            //separate from input data
            byte[] encryptedKey = encryptedFile.getKey();

            byte[] decryptedKey = decryptBytesPrivateKey(encryptedKey, cert);

            byte[] encryptedData_DsCombo = encryptedFile.getData();

            //feed the aes class with the needed parameters
            aes.IV = encryptedFile.getIV(); aes.Key = decryptedKey;
            byte[] decryptedData_DsCombo = decryptBytes(aes, encryptedData_DsCombo);

            //sha256 signature takes 256bytes from the end
            byte[] signedHash = decryptedData_DsCombo.TakeLast(256).ToArray();

            byte[] data = decryptedData_DsCombo.Take(decryptedData_DsCombo.Length - 256).ToArray();

            RSACng rsa = (RSACng)senderCertificate.GetRSAPublicKey();

            if (rsa.VerifyData(data, signedHash, HashAlgorithmName.SHA384, RSASignaturePadding.Pkcs1))
            {
                return(data);
            }
            else
            {
                //dignuti upozorenje iznad
                //MessageBox.Show("File corrupted!");
                throw new CryptographicException("File corrupted");
            }
        }
示例#10
0
        /// <summary>対称アルゴリズム暗号化サービスプロバイダ生成</summary>
        /// <param name="esa">EnumSymmetricAlgorithm</param>
        /// <param name="cm">CipherMode</param>
        /// <param name="pm">PaddingMode</param>
        /// <returns>SymmetricAlgorithm</returns>
        private SymmetricAlgorithm CreateSymmetricAlgorithm(EnumSymmetricAlgorithm esa, CipherMode cm, PaddingMode pm)
        {
            #region Constructor
            SymmetricAlgorithm sa = null;

            #region Aes
            if (esa.HasFlag(EnumSymmetricAlgorithm.AES_CSP))
            {
                // AesCryptoServiceProviderサービスプロバイダ
                sa = AesCryptoServiceProvider.Create(); // devps(1703)
            }
            else if (esa.HasFlag(EnumSymmetricAlgorithm.AES_M))
            {
                // AesManagedサービスプロバイダ
                sa = AesManaged.Create(); // devps(1703)
            }
#if NET45 || NET46
#else
            else if (esa.HasFlag(EnumSymmetricAlgorithm.AES_CNG))
            {
                // AesCngサービスプロバイダ
                sa = AesCng.Create(); // devps(1703)
            }
#endif
            #endregion

            #region TripleDES
            else if (esa.HasFlag(EnumSymmetricAlgorithm.TDES_CSP))
            {
                // TripleDESCryptoServiceProviderサービスプロバイダ
                sa = TripleDESCryptoServiceProvider.Create(); // devps(1703)
            }

#if NET45 || NET46
#else
            else if (esa.HasFlag(EnumSymmetricAlgorithm.TDES_CNG))
            {
                // TripleDESCngサービスプロバイダ
                sa = TripleDESCng.Create(); // devps(1703)
            }
#endif
            #endregion

            #region Others
            else if (esa.HasFlag(EnumSymmetricAlgorithm.DES_CSP))
            {
                // DESCryptoServiceProviderサービスプロバイダ
                sa = DESCryptoServiceProvider.Create(); // devps(1703)
            }

            else if (esa.HasFlag(EnumSymmetricAlgorithm.RC2_CSP))
            {
                // RC2CryptoServiceProviderサービスプロバイダ
                sa = RC2CryptoServiceProvider.Create(); // devps(1703)
            }

            else if (esa.HasFlag(EnumSymmetricAlgorithm.Rijndael_M))
            {
                // RijndaelManagedサービスプロバイダ
                sa = RijndaelManaged.Create(); // devps(1703)
            }
            #endregion

            else
            {
                throw new ArgumentException(
                          PublicExceptionMessage.ARGUMENT_INCORRECT, "EnumSymmetricAlgorithm esa");
            }
            #endregion

            #region Options
            // cmが設定されている場合。
            if (cm != 0)
            {
                sa.Mode = cm;
            }

            // pmが設定されている場合。
            if (pm != 0)
            {
                sa.Padding = pm;
            }
            #endregion

            return(sa);
        }
示例#11
0
        // функция для СИММ. Шифрования массива байт заданным алгоритмом и режимом, на выходе массив байт
        // аргументы: вход. байты; ключ; вектор инициализации; алгоритм AES / 3DES; режим шифруем / расшифровываем
        public static Byte[] SimmAlg(Byte[] arrayByte_in, Byte[] key, Byte[] iv, string selectedAlgSimm, bool EncryptIsTrue)
        {
            byte[]           arrayByte_out = new byte[0]; // Выходная последовательность байт после шифрования/расшифровки
            ICryptoTransform cryptoTransform;

            try
            {
                switch (selectedAlgSimm) // Получение хеша определенным алгоритмом
                {
                case "AES":
                    AesCng aescng = new AesCng(); // объект класса у алгоритма AES
                    aescng.Key = key;             // присваиваем ключ из аргумента
                    aescng.IV  = iv;              // присваиваем вектор из аргумента
                    if (EncryptIsTrue == true)    // если вызвали для ШИФРования AES
                    {
                        // создали объект-шифратор
                        cryptoTransform = aescng.CreateEncryptor();
                    }
                    else      // если вызвали для РАСшифровки AES
                    {
                        // создали объект-расшифратор
                        cryptoTransform = aescng.CreateDecryptor();
                    }
                    // получили байты на выходе
                    arrayByte_out = cryptoTransform.TransformFinalBlock(arrayByte_in, 0, arrayByte_in.Length);

                    aescng.Dispose();          // освобождаем ресурсы
                    cryptoTransform.Dispose(); // освобождаем ресурсы
                    break;

                case "3DES":
                    TripleDESCng tripledescng = new TripleDESCng(); // объект класса у алгоритма AES
                    tripledescng.Key = key;                         //  присваиваем ключ из аргумента
                    tripledescng.IV  = iv;                          //  присваиваем вектор из аргумента
                    if (EncryptIsTrue == true)                      // если вызвали для ШИФРования AES
                    {
                        // создали объект-шифратор
                        cryptoTransform = tripledescng.CreateEncryptor();
                    }
                    else      // если вызвали для РАСшифровки 3DES
                    {
                        // создали объект-расшифратор
                        cryptoTransform = tripledescng.CreateDecryptor();
                    }
                    // получили байты на выходе
                    arrayByte_out = cryptoTransform.TransformFinalBlock(arrayByte_in, 0, arrayByte_in.Length);

                    tripledescng.Dispose();     // освобождаем ресурсы
                    cryptoTransform.Dispose();  // освобождаем ресурсы
                    break;

                default: break;
                }
            }
            catch (Exception error)
            {
                //MessageBox.Show(error.Message, "НЕПРЕДВИДЕННАЯ ОШИБКА", MessageBoxButtons.OK, MessageBoxIcon.Error);
                if (EncryptIsTrue == true) // если шифрование
                {
                    MessageBox.Show(error.Message, "НЕПРЕДВИДЕННАЯ ОШИБКА", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //MessageBox.Show("Ключ или вектор инициализации не подходят", "Ошибка шифрования", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else
                {
                    MessageBox.Show("Заданные ключ или вектор инициализации не подходят для заданного шифра!\nРасшифровка не возможна.", "Ошибка расшифровки", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            return(arrayByte_out);
        }