/// <summary> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダを生成 /// </summary> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダ /// </returns> private SymmetricAlgorithm CreateSymmetricAlgorithm(EnumSymmetricAlgorithm esa) { //esa = EnumSymmetricAlgorithm.AesManaged // | EnumSymmetricAlgorithm.CipherMode_CBC // | EnumSymmetricAlgorithm.PaddingMode_PKCS7; // CipherMode, PaddingMode指定の追加 CipherMode cm = 0; PaddingMode pm = 0; // CipherMode if (esa.HasFlag(EnumSymmetricAlgorithm.CipherMode_CBC)) { cm = CipherMode.CBC; } else if (esa.HasFlag(EnumSymmetricAlgorithm.CipherMode_CFB)) { cm = CipherMode.CFB; } else if (esa.HasFlag(EnumSymmetricAlgorithm.CipherMode_CTS)) { cm = CipherMode.CTS; } else if (esa.HasFlag(EnumSymmetricAlgorithm.CipherMode_ECB)) { cm = CipherMode.ECB; } else if (esa.HasFlag(EnumSymmetricAlgorithm.CipherMode_OFB)) { cm = CipherMode.OFB; } // PaddingMode if (esa.HasFlag(EnumSymmetricAlgorithm.PaddingMode_None)) { pm = PaddingMode.None; } else if (esa.HasFlag(EnumSymmetricAlgorithm.PaddingMode_Zeros)) { pm = PaddingMode.Zeros; } else if (esa.HasFlag(EnumSymmetricAlgorithm.PaddingMode_ANSIX923)) { pm = PaddingMode.ANSIX923; } else if (esa.HasFlag(EnumSymmetricAlgorithm.PaddingMode_ISO10126)) { pm = PaddingMode.ISO10126; } else if (esa.HasFlag(EnumSymmetricAlgorithm.PaddingMode_PKCS7)) { pm = PaddingMode.PKCS7; } return(CreateSymmetricAlgorithm(esa, cm, pm)); }
/// <summary>文字列を暗号化する</summary> /// <param name="sourceString">暗号化する文字列</param> /// <param name="password">暗号化に使用するパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 暗号化された文字列 /// </returns> public static string EncryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 元文字列をbyte型配列に変換する(UTF-8 Enc) byte[] source = CustomEncode.StringToByte(sourceString, CustomEncode.UTF_8); // 暗号化(Base64) return(CustomEncode.ToBase64String( SymmetricCryptography.EncryptBytes(source, password, esa, salt, stretching))); }
/// <summary>暗号化された文字列を復号化する</summary> /// <param name="sourceString">暗号化された文字列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 復号化された文字列 /// </returns> public static string DecryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 暗号化文字列をbyte型配列に変換する(Base64) byte[] source = CustomEncode.FromBase64String(sourceString); // 復号化(UTF-8 Enc) return(CustomEncode.ByteToString( SymmetricCryptography.DecryptBytes(source, password, esa, salt, stretching), CustomEncode.UTF_8)); }
/// <summary> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダを生成 /// </summary> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダ /// </returns> private static SymmetricAlgorithm CreateSymmetricAlgorithm(EnumSymmetricAlgorithm esa) { SymmetricAlgorithm sa = null; // AesCryptoServiceProvider, AesManagedは.NET Framework 3.5からの提供。 // 暗号化プロバイダ選択の優先順は、高い順に、Managed → CAPI(CSP) → CNG。 // Aesは、ManagedがあるのでCAPI(CSP)のAesCryptoServiceProviderを削除。 // サポート範囲の変更により、今後、CAPI(CSP)とCNGの優先順位の反転を検討。 //if (esa == EnumSymmetricAlgorithm.AesCryptoServiceProvider) //{ // // AesCryptoServiceProviderサービスプロバイダ // sa = AesCryptoServiceProvider.Create(); // devps(1703) //} //else if (esa == EnumSymmetricAlgorithm.AesManaged) { // AesManagedサービスプロバイダ sa = AesManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.DESCryptoServiceProvider) { // DESCryptoServiceProviderサービスプロバイダ sa = DESCryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RC2CryptoServiceProvider) { // RC2CryptoServiceProviderサービスプロバイダ sa = RC2CryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RijndaelManaged) { // RijndaelManagedサービスプロバイダ sa = RijndaelManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider) { // TripleDESCryptoServiceProviderサービスプロバイダ sa = TripleDESCryptoServiceProvider.Create(); // devps(1703) } else { throw new ArgumentException( PublicExceptionMessage.ARGUMENT_INJUSTICE, "EnumSymmetricAlgorithm esa"); } return(sa); }
/// <summary> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダを生成 /// </summary> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダ /// </returns> private static SymmetricAlgorithm CreateSymmetricAlgorithm(EnumSymmetricAlgorithm esa) { SymmetricAlgorithm sa = null; // AesCryptoServiceProvider, AesManagedは3.5からの提供。 if (esa == EnumSymmetricAlgorithm.AesCryptoServiceProvider) { // AesCryptoServiceProviderサービスプロバイダ sa = AesCryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.AesManaged) { // AesManagedサービスプロバイダ sa = AesManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.DESCryptoServiceProvider) { // DESCryptoServiceProviderサービスプロバイダ sa = DESCryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RC2CryptoServiceProvider) { // RC2CryptoServiceProviderサービスプロバイダ sa = RC2CryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RijndaelManaged) { // RijndaelManagedサービスプロバイダ sa = RijndaelManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider) { // TripleDESCryptoServiceProviderサービスプロバイダ sa = TripleDESCryptoServiceProvider.Create(); // devps(1703) } else { throw new ArgumentException( PublicExceptionMessage.ARGUMENT_INJUSTICE, "EnumSymmetricAlgorithm esa"); } return(sa); }
/// <summary>暗号化されたバイト配列を復号化する</summary> /// <param name="source">暗号化されたバイト配列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 復号化されたバイト配列 /// </returns> public static byte[] DecryptBytes( byte[] source, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 暗号化サービスプロバイダを生成 SymmetricAlgorithm sa = SymmetricCryptography.CreateSymmetricAlgorithm(esa); // パスワードから共有キーと初期化ベクタを作成 byte[] key, iv; SymmetricCryptography.GenerateKeyFromPassword( password, sa.KeySize, out key, sa.BlockSize, out iv, salt, stretching); sa.Key = key; sa.IV = iv; // 復号化 byte[] temp = sa.CreateDecryptor().TransformFinalBlock(source, 0, source.Length); sa.Clear(); // devps(1725) return(temp); }
/// <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); }
/// <summary>暗号化された文字列を復号化する</summary> /// <param name="sourceString">暗号化された文字列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <returns> /// 対称アルゴリズムで /// 復号化された文字列 /// </returns> public static string DecryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt) { return SymmetricCryptography.DecryptString( sourceString, password, esa, salt, SymmetricCryptography.Stretching); }
/// <summary>Constructor</summary> /// <param name="algorithm">対称アルゴリズム</param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> public SymmetricCryptography(EnumSymmetricAlgorithm algorithm, byte[] salt, int stretching) { this.Algorithm = algorithm; this.Salt = salt; this.Stretching = stretching; }
/// <summary>暗号化されたバイト配列を復号化する</summary> /// <param name="source">暗号化されたバイト配列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <returns> /// 対称アルゴリズムで /// 復号化されたバイト配列 /// </returns> public static byte[] DecryptBytes( byte[] source, string password, EnumSymmetricAlgorithm esa, byte[] salt) { return(SymmetricCryptography.DecryptBytes( source, password, esa, salt, SymmetricCryptography.Stretching)); }
/// <summary>文字列を暗号化する</summary> /// <param name="sourceString">暗号化する文字列</param> /// <param name="password">暗号化に使用するパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 暗号化された文字列 /// </returns> public static string EncryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 元文字列をbyte型配列に変換する(UTF-8 Enc) byte[] source = CustomEncode.StringToByte(sourceString, CustomEncode.UTF_8); // 暗号化(Base64) return CustomEncode.ToBase64String( SymmetricCryptography.EncryptBytes(source, password, esa, salt, stretching)); }
public void EncryptStringTest(string testCaseID, string sourceString, string password, EnumSymmetricAlgorithm esa) { try { // Performs encryption using the components touryo. string encryptedString = SymmetricCryptography.EncryptString(sourceString, password, esa); // Performs decrypted using the components touryo. string decryptedString = SymmetricCryptography.DecryptString(encryptedString, password, esa); // Check whether it is decrypted into the original string. Assert.AreNotEqual(sourceString, encryptedString); Assert.AreEqual(sourceString, decryptedString); } catch (Exception ex) { // Print a stack trace when an exception occurs. Console.WriteLine(testCaseID + ":" + ex.StackTrace); throw; } }
/// <summary>Constructor</summary> /// <param name="algorithm">対称アルゴリズム</param> public SymmetricCryptography(EnumSymmetricAlgorithm algorithm) : this(algorithm, SymmetricCryptography.DefaultSalt) { }
/// <summary>文字列を暗号化する</summary> /// <param name="sourceString">暗号化する文字列</param> /// <param name="password">暗号化に使用するパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムで /// 暗号化された文字列 /// </returns> public static string EncryptString( string sourceString, string password, EnumSymmetricAlgorithm esa) { return(SymmetricCryptography.EncryptString( sourceString, password, esa, SymmetricCryptography.Salt, SymmetricCryptography.Stretching)); }
/// <summary> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダを生成 /// </summary> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダ /// </returns> private static SymmetricAlgorithm CreateSymmetricAlgorithm(EnumSymmetricAlgorithm esa) { SymmetricAlgorithm sa = null; // AesCryptoServiceProvider, AesManagedは3.5からの提供。 if (esa == EnumSymmetricAlgorithm.AesCryptoServiceProvider) { // AesCryptoServiceProviderサービスプロバイダ sa = AesCryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.AesManaged) { // AesManagedサービスプロバイダ sa = AesManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.DESCryptoServiceProvider) { // DESCryptoServiceProviderサービスプロバイダ sa = DESCryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RC2CryptoServiceProvider) { // RC2CryptoServiceProviderサービスプロバイダ sa = RC2CryptoServiceProvider.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.RijndaelManaged) { // RijndaelManagedサービスプロバイダ sa = RijndaelManaged.Create(); // devps(1703) } else if (esa == EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider) { // TripleDESCryptoServiceProviderサービスプロバイダ sa = TripleDESCryptoServiceProvider.Create(); // devps(1703) } else { throw new ArgumentException( PublicExceptionMessage.ARGUMENT_INJUSTICE, "EnumSymmetricAlgorithm esa"); } return sa; }
/// <summary>暗号化されたバイト配列を復号化する</summary> /// <param name="source">暗号化されたバイト配列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 復号化されたバイト配列 /// </returns> public static byte[] DecryptBytes( byte[] source, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 暗号化サービスプロバイダを生成 SymmetricAlgorithm sa = SymmetricCryptography.CreateSymmetricAlgorithm(esa); // パスワードから共有キーと初期化ベクタを作成 byte[] key, iv; SymmetricCryptography.GenerateKeyFromPassword( password, sa.KeySize, out key, sa.BlockSize, out iv, salt, stretching); sa.Key = key; sa.IV = iv; // 復号化 byte[] temp = sa.CreateDecryptor().TransformFinalBlock(source, 0, source.Length); sa.Clear(); // devps(1725) return temp; }
/// <summary>暗号化されたバイト配列を復号化する</summary> /// <param name="source">暗号化されたバイト配列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <returns> /// 対称アルゴリズムで /// 復号化されたバイト配列 /// </returns> public static byte[] DecryptBytes( byte[] source, string password, EnumSymmetricAlgorithm esa, byte[] salt) { return SymmetricCryptography.DecryptBytes( source, password, esa, salt, SymmetricCryptography.Stretching); }
/// <summary>暗号化された文字列を復号化する</summary> /// <param name="sourceString">暗号化された文字列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <param name="stretching">ストレッチング</param> /// <returns> /// 対称アルゴリズムで /// 復号化された文字列 /// </returns> public static string DecryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt, int stretching) { // 暗号化文字列をbyte型配列に変換する(Base64) byte[] source = CustomEncode.FromBase64String(sourceString); // 復号化(UTF-8 Enc) return CustomEncode.ByteToString( SymmetricCryptography.DecryptBytes(source, password, esa, salt, stretching), CustomEncode.UTF_8); }
/// <summary>Constructor</summary> /// <param name="algorithm">対称アルゴリズム</param> /// <param name="salt">ソルト</param> public SymmetricCryptography(EnumSymmetricAlgorithm algorithm, byte[] salt) : this(algorithm, salt, SymmetricCryptography.DefaultStretching) { }
/// <summary>暗号化された文字列を復号化する</summary> /// <param name="sourceString">暗号化された文字列</param> /// <param name="password">暗号化に使用したパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <param name="salt">ソルト</param> /// <returns> /// 対称アルゴリズムで /// 復号化された文字列 /// </returns> public static string DecryptString( string sourceString, string password, EnumSymmetricAlgorithm esa, byte[] salt) { return(SymmetricCryptography.DecryptString( sourceString, password, esa, salt, SymmetricCryptography.Stretching)); }
public void EncryptBytesTest2(string testCaseID, byte[] sourceBytes, string password, EnumSymmetricAlgorithm esa, byte[] salt) { try { // Performs encryption using the components of touryo. byte[] encryptedBytes = SymmetricCryptography.EncryptBytes(sourceBytes, password, esa, salt); // Performs decrypted using the components of touryo. byte[] decryptedBytes = SymmetricCryptography.DecryptBytes(encryptedBytes, password, esa, salt); // Check whether it is decrypted into the original string. Assert.AreNotEqual(sourceBytes, encryptedBytes); Assert.AreEqual(sourceBytes, decryptedBytes); } catch (Exception ex) { // Print a stack trace when an exception occurs. Console.WriteLine(testCaseID + ":" + ex.StackTrace); throw; } }
/// <summary>文字列を暗号化する</summary> /// <param name="sourceString">暗号化する文字列</param> /// <param name="password">暗号化に使用するパスワード</param> /// <param name="esa"> /// 対称アルゴリズムによる /// 暗号化サービスプロバイダの種類 /// </param> /// <returns> /// 対称アルゴリズムで /// 暗号化された文字列 /// </returns> public static string EncryptString( string sourceString, string password, EnumSymmetricAlgorithm esa) { return SymmetricCryptography.EncryptString( sourceString, password, esa, SymmetricCryptography.Salt, SymmetricCryptography.Stretching); }