[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>.NET開発]] * 目次 [#ba3e104c] #contents *概要 [#i831ac3c] ・アルゴリズム の編集 一通り揃っている。 -ハッシュ --暗号ハッシュ([[様々な用途>https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0#.E7.94.A8.E9.80.94]]に利用可能) --キー付きハッシュ([[署名・検証>https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%AD%A6%E7%9A%84%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0#.E7.94.A8.E9.80.94]]にも利用可能) -暗号(暗号化・復号化、署名・検証に利用可能) --秘密鍵暗号方式 --公開鍵暗号方式 -署名(署名・検証に利用可能) --公開鍵暗号方式 *Managed、CSP、CNG実装とは? [#fde2f12c] -Managedで終わる名称のProviderは、.NET実装と思われる(mscorlib.dll)。 -CryptoServiceProvider(CSP)で終わる名称のProviderは、「暗号化サービス プロバイダー (CSP) を使用する」とある(System.Core.dll)。 -Cngで終わる名称のProviderは、PlatformNativeのCryptography Next Generation (CNG) 実装を使用している(System.Core.dll)。 **参考 [#le45730f] ***CSP [#n13961a2] -CryptoAPI Cryptographic Service Providers (Windows)~ https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb931357.aspx -Cryptographic API - Wikipedia~ https://ja.wikipedia.org/wiki/Cryptographic_API ***CNG [#if785c4b] -CNGとは (Cryptography Next Generation) シーエヌジー: - IT用語辞典バイナリ~ http://www.sophia-it.com/content/Cryptography+Next+Generationax -Cryptography Next Generation~ https://technet.microsoft.com/en-us/library/532ac164-da33-4369-bef0-8f019d5a18b8 **どれを使用すべき? [#ub3ba427] ***.NET Framework の暗号モデル [#ya3a33ad] https://msdn.microsoft.com/ja-jp/library/0ss79b2x.aspx には、以下のようにある。 -最適な実装を選択できる。 --マネージ実装~ .NET Framework をサポートするすべてのプラットフォームで利用可能。~ ただし、マネージ実装はFIPSに認定されておらず、ラッパー クラスよりも低速である場合がある。 --CAPI 実装~ CSPラッパー。以前のOSで使用可能だが、開発中止となっている。 --CNG 実装~ CNGラッパー。まさに最新の実装であり、新しい開発が行われる。 -アルゴリズムの選択 --データのプライバシー ---Aes --データの整合性 ---HMACSHA256 ---HMACSHA512 --デジタル署名 ---ECDsa ---RSA --キー交換 ---ECDiffieHellman ---RSA --乱数生成 ---RNGCryptoServiceProvider --パスワードからのキー生成 ---Rfc2898DeriveBytes ***CngKey [#v4011842] -How to use RSA in .NET: RSACryptoServiceProvider vs. RSACng and good practise patterns - Dusted Codes~ https://dusted.codes/how-to-use-rsa-in-dotnet-rsacryptoserviceprovider-vs-rsacng-and-good-practise-patterns 以下の様な違いがあるが、 >RSACngのキーはCngKeyクラスによって管理され、RSACngのコンストラクタに注入できますが、~ RSACryptoServiceProviderは独自のキー操作に結びついています。 どちらでも良さそう。 *.NETの暗号化Providerの列挙 [#da2f4388] **ハッシュ [#de661712] ***暗号ハッシュ(HashAlgorithm) [#l1894cde] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hashalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5cryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ripemd160.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ripemd160managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1cryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512managed.aspx ***キー付きハッシュ(KeyedHashAlgorithm) [#x4fe1902] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.keyedhashalgorithm.aspx -System.Security.Cryptography.HMAC~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmac.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacmd5.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacripemd160.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha1.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha256.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha384.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha512.aspx -System.Security.Cryptography.MACTripleDES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.mactripledes.aspx **暗号化 [#pdc25f19] ***秘密鍵暗号方式(SymmetricAlgorithm) [#r45cd534] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.symmetricalgorithm.aspx -System.Security.Cryptography.Aes~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aes.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aescng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aescryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aesmanaged.aspx -System.Security.Cryptography.DES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.des.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.descryptoserviceprovider.aspx -System.Security.Cryptography.RC2~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rc2.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rc2cryptoserviceprovider.aspx -System.Security.Cryptography.Rijndael~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndael.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndaelmanaged.aspx -System.Security.Cryptography.TripleDES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledes.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledescng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledescryptoserviceprovider.aspx ***公開鍵暗号方式(AsymmetricAlgorithm) [#q04bc939] AsymmetricAlgorithmの内、暗号化・復号化が可能な公開鍵暗号方式は、RS256(RSA)のみ。 https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.asymmetricalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacryptoserviceprovider.aspx **署名・検証(AsymmetricAlgorithm) [#lf5eb161] 署名・検証は、AsymmetricAlgorithmの内の、以下のProviderを使用する。 https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.asymmetricalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.dsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.dsacryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ecdsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ecdiffiehellmancng.aspx *参考 [#mf5f8a70] **DOBON.NET: VB.NET, C#, 無料ソフトウェア... [#j2316c2c] http://dobon.net/index.html -文字列、暗号化: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/index.html ***暗号ハッシュ [#bbfd012a] -MD5やSHA1などでハッシュ値を計算する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/md5.html -ファイルのMD5やSHA1などでハッシュ値を計算する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/filemd5.html ***秘密鍵暗号方式 [#geb60fa1] -パスワードで文字列を暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/encryptstring.html -パスワードでファイルを暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/encryptfile.html ***公開鍵暗号方式 [#icf617f4] -公開鍵暗号方法で暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/rsaencryption.html ***署名・検証 [#f3bcf75f] -デジタル署名を作成、検証する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/digitalsignature.html ***乱数生成、キー生成 [#gb1f54a6] -乱数を生成する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/programing/random.html **Open棟梁の暗号ラッパー [#he1630c1] ***暗号ハッシュ [#la4e1baf] Managed優先、無ければCSPを使用というポリシーで実装。 https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Util/GetHash.cs#L162 ***キー付きハッシュ [#o0ef5dab] HMACの実装が不足している(hmacmd5、hmacripemd160、hmacsha256、hmacsha384、hmacsha512)。 https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Util/GetKeyedHash.cs#L182 ***秘密鍵暗号方式 [#m1c66e75] Managed優先、無ければCSPを使用というポリシーで実装。~ (AesCryptoServiceProviderが例外的に余分に実装されている) https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/IO/SymmetricCryptography.cs#L430 ***公開鍵暗号方式 [#r9036717] https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/IO/ASymmetricCryptography.cs ***署名・検証 [#s1ca647e] なし。