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()); } } } }
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"); } } }
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); }
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); }
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); } }
// при ЗАГРУЗКЕ ФОРМЫ для ввода ключа и 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; } }
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"); }
//[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(); } }
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"); } }
/// <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); }
// функция для СИММ. Шифрования массива байт заданным алгоритмом и режимом, на выходе массив байт // аргументы: вход. байты; ключ; вектор инициализации; алгоритм 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); }