/// <summary> /// Constructor /// X.509証明書(*.pfx, *.cer)からキーを設定する。 /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。 /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。 /// </summary> /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param> /// <param name="password">パスワード</param> /// <param name="hashAlgorithmName">HashAlgorithmName</param> /// <param name="flag">X509KeyStorageFlags</param> public DigitalSignX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName, X509KeyStorageFlags flag) { flag = flag | X509KeyStorageFlags.Exportable; // PrepareでExportParametersする可能性があるので足す。 this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag); this.HashAlgorithm = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name); this.Prepare(); }
/// <summary>デジタル署名を作成する</summary> /// <param name="data">デジタル署名を行なう対象データ</param> /// <returns>対象データに対してデジタル署名したデジタル署名部分のデータ</returns> public virtual byte[] SignByFormatter(byte[] data) { // ハッシュ byte[] hash = this.HashAlgorithm.ComputeHash(data); // デジタル署名 byte[] signedByte = null; if (this.AsymmetricAlgorithm is RSA) { // RSAPKCS1SignatureFormatterオブジェクトを作成 RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(this.AsymmetricAlgorithm); rsaFormatter.SetHashAlgorithm(HashAlgorithmCmnFunc.GetHashAlgorithmName(this.HashAlgorithm)); signedByte = rsaFormatter.CreateSignature(hash); } else if (this.AsymmetricAlgorithm is DSA) { // DSASignatureFormatterオブジェクトを作成 DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(this.AsymmetricAlgorithm); dsaFormatter.SetHashAlgorithm(HashNameConst.SHA1); signedByte = dsaFormatter.CreateSignature(hash); } else { throw new NotImplementedException(PublicExceptionMessage.NOT_IMPLEMENTED); } return(signedByte); }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="stretchCount">ストレッチ回数</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha, int stretchCount) { byte[] temp = null; #if NETSTD // NETSTDの場合の実装 if (eha == EnumHashAlgorithm.RIPEMD160_M) { // ハッシュ値を計算して返す。 temp = GetHash.GetDigestBytesByBC(asb, new RipeMD160Digest()); for (int i = 0; i < stretchCount; i++) { // stretchCountが1以上なら繰り返す。 temp = GetHash.GetDigestBytesByBC(temp, new RipeMD160Digest()); } return(temp); } #endif // ハッシュ(キー無し)サービスプロバイダを生成 HashAlgorithm ha = HashAlgorithmCmnFunc.CreateHashAlgorithmSP(eha); // ハッシュ値を計算して返す。 temp = ha.ComputeHash(asb); for (int i = 0; i < stretchCount; i++) { // stretchCountが1以上なら繰り返す。 temp = ha.ComputeHash(temp); } ha.Clear(); // devps(1725) return(temp); }
/// <summary>GetHashAlgorithmFromNameString</summary> /// <returns>HashAlgorithm</returns> public static HashAlgorithm GetHashAlgorithmFromNameString() { // 既定は何なのか?という話 // - HashAlgorithm.Create throws PNSE on .NET Core 2 // https://github.com/dotnet/corefx/issues/22626#issuecomment-319141782 // HashAlgorithm.CreateはSHA1の実装を作成します。 // これは、最近の進歩のために推奨されていません。 return(HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(HashNameConst.SHA256)); }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="data">データ(バイト配列)</param> /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param> /// <param name="key">キー(バイト配列)</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetKeyedHashBytes(byte[] data, EnumKeyedHashAlgorithm ekha, byte[] key) { // HMACMD5 :どのサイズのキーでも受け入れる ◯ // HMACRIPEMD160:どのサイズのキーでも受け入れる ◯ // HMACSHA1 :どのサイズのキーでも受け入れる ◯ // HMACSHA256 :どのサイズのキーでも受け入れる ◯ // HMACSHA384 :どのサイズのキーでも受け入れる ◯ // HMACSHA512 :どのサイズのキーでも受け入れる ◯ // MACTripleDES :長さが 16 または 24 バイトのキーを受け入れる if (ekha == EnumKeyedHashAlgorithm.MACTripleDES) { if (24 <= key.Length) { key = ArrayOperator.ShortenByteArray(key, 24); } else if (16 <= key.Length) { key = ArrayOperator.ShortenByteArray(key, 16); } else { throw new ArgumentException( PublicExceptionMessage.ARGUMENT_INCORRECT, "byte[] key"); } } #if NETSTD // NETSTDの場合の実装 if (ekha == EnumKeyedHashAlgorithm.HMACRIPEMD160) { return(GetKeyedHash.GetMacBytesByBC( data, key, new HMac(new RipeMD160Digest()))); } else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES) { return(GetKeyedHash.GetMacBytesByBC( data, key, new CbcBlockCipherMac(new DesEdeEngine(), 64))); } #endif // ハッシュ(キー付き)サービスプロバイダを生成 KeyedHashAlgorithm kha = HashAlgorithmCmnFunc. CreateKeyedHashAlgorithmSP(ekha, key); // ハッシュ(キー付き)を生成して返す。 byte[] temp = kha.ComputeHash(data); kha.Clear(); // devps(1725) return(temp); }
/// <summary> /// Constructor /// X.509証明書(*.pfx, *.cer)からキーを設定する。 /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。 /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。 /// </summary> /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param> /// <param name="password">パスワード</param> /// <param name="hashAlgorithmName">HashAlgorithmName</param> /// <param name="flag">X509KeyStorageFlags</param> public DigitalSignECDsaX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName, X509KeyStorageFlags flag) { flag = flag | X509KeyStorageFlags.Exportable; // PrepareでGetECDsaPrivateKeyする可能性があるので足す。 this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag); if (this.X509Certificate.HasPrivateKey) { this.AsymmetricAlgorithm = this.PrivateKey; } else { this.AsymmetricAlgorithm = this.PublicKey; } this.HashAlgorithm = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name); }
/// <summary> /// Constructor /// X.509証明書(*.pfx, *.cer)からキーを設定する。 /// *.cer証明書の場合は、証明書チェーンが繋がっている必要がある。 /// 自己証明書の場合「信頼されたルート証明機関」にInstallするなどする。 /// </summary> /// <param name="certificateFilePath">X.509証明書(*.pfx, *.cer)へのパス</param> /// <param name="password">パスワード</param> /// <param name="hashAlgorithmName">HashAlgorithmName</param> /// <param name="flag">X509KeyStorageFlags</param> public DigitalSignECDsaX509(string certificateFilePath, string password, HashAlgorithmName hashAlgorithmName, X509KeyStorageFlags flag = X509KeyStorageFlags.Exportable) { // X509KeyStorageFlags // - MachineKeySet : ECDsaは、インストールできない模様。 // - Exportable : PrepareでGetECDsaPrivateKeyするので。 this.X509Certificate = new X509Certificate2(certificateFilePath, password, flag); if (this.X509Certificate.HasPrivateKey) { this.AsymmetricAlgorithm = this.PrivateKey; } else { this.AsymmetricAlgorithm = this.PublicKey; } this.HashAlgorithm = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(hashAlgorithmName.Name); }
/// <summary>ハッシュ(キー無し)サービスプロバイダの生成</summary> /// <param name="eha">ハッシュ(キー無し)サービスプロバイダの列挙型</param> /// <returns>ハッシュ(キー無し)サービスプロバイダ</returns> /// <remarks> /// EnumHashAlgorithmから、HashAlgorithmを生成するために追加。 /// HashAlgorithm.Create(HashNameConst.SHA256) は .NET Core 2 で動作せず。 /// - KeyedHashAlgorithm.Create("HMACSHA1") throw PNSE (on .NET Core 2 /// https://github.com/dotnet/standard/issues/530#issuecomment-375043416 /// </remarks> public static HashAlgorithm CreateHashAlgorithmSP(EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダ HashAlgorithm ha = null; if (eha == EnumHashAlgorithm.Default) { // 既定の暗号化サービスプロバイダ ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703) } #region MD5 else if (eha == EnumHashAlgorithm.MD5_CSP) { // MD5CryptoServiceProviderサービスプロバイダ ha = MD5CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.MD5_CNG) { // MD5Cngサービスプロバイダ ha = MD5Cng.Create(); // devps(1703) } #endif #endregion #region RIPEMD160 else if (eha == EnumHashAlgorithm.RIPEMD160_M) { #if NETSTD ha = null; // BouncyCastleを使用する。 #else // RIPEMD160Managedサービスプロバイダ ha = RIPEMD160Managed.Create(); // devps(1703) #endif } #endregion #region SHA1 else if (eha == EnumHashAlgorithm.SHA1_CSP) { // SHA1CryptoServiceProviderサービスプロバイダ ha = SHA1CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA1_CNG) { // SHA1Cngサービスプロバイダ ha = SHA1Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA1_M) { // SHA1Managedサービスプロバイダ ha = SHA1Managed.Create(); // devps(1703) } #endregion #region SHA256 else if (eha == EnumHashAlgorithm.SHA256_CSP) { // SHA256CryptoServiceProviderサービスプロバイダ ha = SHA256CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA256_CNG) { // SHA256Cngサービスプロバイダ ha = SHA256Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA256_M) { // SHA256Managedサービスプロバイダ ha = SHA256Managed.Create(); // devps(1703) } #endregion #region SHA384 else if (eha == EnumHashAlgorithm.SHA384_CSP) { // SHA384CryptoServiceProviderサービスプロバイダ ha = SHA384CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA384_CNG) { // SHA384Cngサービスプロバイダ ha = SHA384Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA384_M) { // SHA384Managedサービスプロバイダ ha = SHA384Managed.Create(); // devps(1703) } #endregion #region SHA512 else if (eha == EnumHashAlgorithm.SHA512_CSP) { // SHA512CryptoServiceProviderサービスプロバイダ ha = SHA512CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA512_CNG) { // SHA512Cngサービスプロバイダ ha = SHA512Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA512_M) { // SHA512Managedサービスプロバイダ ha = SHA512Managed.Create(); // devps(1703) } #endregion else { // 既定の暗号化サービスプロバイダ ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703) } return(ha); }