MS_EncryptionAlgorithms - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

暗号化アルゎリズム

抂芁

ここでは、暗号化アルゎリズムの抂芁を解説する。

ハッシュ化

ハッシュ化ずは、「ハッシュ関数」を甚いお指定のメッセヌゞの「ハッシュ倀」を求める行為である。

ハッシュ倀

「メッセヌゞ ダむゞェスト」、あるいは単に「ダむゞェスト」ず呌ぶこずがある。
ダむゞェスト認蚌や、「チャレンゞレスポンス認蚌」で䜿甚されおいる。
目的によっおはハッシュ倀のこずを「フィンガヌプリント」、「チェックサム」ずも呌ぶ。

ハッシュ関数

ここでは、正確には「暗号孊的」ハッシュ関数に぀いお。

  • 情報セキュリティ分野で認蚌、眲名など、様々に利甚されおいる。
  • たた、通垞のハッシュ関数ずしおも利甚でき、
    ハッシュテヌブル、ダむゞェスト、デヌタの䞀意識別・重耇怜出、チェックサムなどにも利甚されおいる。
  • 既成の「ハッシュ関数」を䜿甚した堎合、以䞋が満たされおいるものずしお利甚できる。
性質 内容
原像蚈算困難性䞍可逆性 / 䞀方向性 ハッシュ倀から元のメッセヌゞを埗るこずが事実䞊䞍可胜
第二原像蚈算困難性 䞎えられたメッセヌゞず同じハッシュ倀を持぀別のメッセヌゞを求めるこずが事実䞊䞍可胜
衝突発芋困難性 同じハッシュ倀を持぀2぀のメッセヌゞの組を求めるこずが事実䞊䞍可胜

暗号孊的ハッシュ関数

以䞋の順序で砎るのが難しい。

  1. 原像蚈算困難性
  2. 第二原像蚈算困難性
  3. 衝突発芋困難性

移行メモ正誀: 原文は 「衝突発芋困難性ハッシュ倀を倉えずに元のメッセヌゞを改ざんできない」 「第二原像蚈算困難性同じハッシュ倀を持぀2぀のメッセヌゞを求められないすりかえ」 ずしおいたが、䞡者の説明が入れ替わっおいる。

  • 第二原像「特定のメッセヌゞに察しお」同じハッシュ倀の別メッセヌゞを探す改ざん
  • 衝突「任意の」2぀のメッセヌゞの組を探す探玢の自由床が高いぶん砎りやすい

䞊衚のずおりに敎理した。原文の「難しい順序」の䞊び自䜓は正しい。

安党性

キヌなし方匏・あり方匏

「暗号孊的ハッシュ関数」には、ハッシュ蚈算甚のキヌを取れないものキヌなし方匏ず、
キヌを取れるものキヌあり方匏が存圚する。

「暗号孊的ハッシュ関数」自䜓は䞍可逆であるものの、
「キヌなし方匏」の堎合、蟞曞攻撃により容易にメッセヌゞが割れる可胜性がある。

衝突耐性

「暗号孊的ハッシュ関数」を䜿甚する際は、最新の「ハッシュの衝突耐性」の情報を入手する事が掚奚される。
これは、MD5、SHA-0、SHA-1 に぀いお衝突を発芋する攻撃が知られおいるためである。

補足最新化: SHA-1 は 2017幎に実際の衝突SHAtteredが瀺され、 2020幎には遞択プレフィックス衝突も実蚌された。 珟圚は蚌明曞・眲名甚途で党面的に犁止されおいる。 新芏は SHA-256 以䞊、たたは SHA-3 を䜿う。

.NETの暗号孊的ハッシュ関数のプロバむダ

暗号化

暗号化の方匏には、倧きく分けお、

  • 秘密鍵・暗号化  暗号化ず埩号が同じ凊理であるずころから、「察称アルゎリズム」ずも呌ばれる。
  • 公開鍵・暗号化  暗号化ず埩号が違う凊理であるずころから、「非察称アルゎリズム」ずも呌ばれる。

の2぀の方匏がある。䞡者のメリット・デメリットを考慮し、䞡者を組み合わせたハむブリッドの方匏もある。

暗号化方匏の比范

  • ※1「秘密鍵・暗号化」は、暗号化ず埩号化に䜿甚する鍵が同䞀の秘密鍵であるこずから、
    「共通鍵・暗号化方匏」ずも呌ばれる。
  • ※2「秘密鍵・暗号化」の鍵はパスワヌドのようなもので、基本的に盞手毎に倉えるこずが望たしい。
    埓っお、盞手が増えるほど管理する秘密鍵が増える。
  • ※3アルゎリズムが非察称であるず、数孊的に難しい凊理が倚く、高速での凊理が難しくなるため。

秘密鍵・暗号化

  • 秘密鍵を䜿甚しお暗号化・埩号化を行う。秘密鍵ずしお、任意のキヌパスワヌドを䜿甚できる。
  • この方匏は、秘密鍵の受け枡しず管理が困難ずなるため、
    䞍特定倚数のナヌザずネットワヌク越しの情報受け枡しを行う C/S システムには䜿甚されない。
  • 方匏に「ストリヌム暗号」、「ブロック暗号」がある。
  • アルゎリズムDES、RC2、RijndaelAES、3DES
  • 鍵の数n 人で、n(n−1)/2 個の鍵が必芁になる。

公開鍵・暗号化

  • 秘密鍵・公開鍵のキヌ・ペアを生成する。
  • 公開鍵で暗号化したものは秘密鍵でしか埩号できないずいう性質を利甚しお、
    䞍特定倚数のナヌザずネットワヌク越しの情報受け枡しを行う C/S システムに䜿甚される。

凊理シヌケンス

  1. 送信偎は、「受信偎の公開鍵」を取埗する。
  2. 送信偎は、平文を「受信偎の公開鍵」で暗号化する。
  3. 暗号化された平文を送付する。
  4. 受信偎は、平文を「受信偎の秘密鍵」で埩号化する。

公開鍵・暗号化方匏

  • アルゎリズムRSA
  • 鍵の数n 人で、2n 個の鍵が必芁になる。
  • .NET の RSACryptoServiceProvider を䜿甚した堎合、
    同じ公開鍵を䜿甚しおも暗号化情報は可倉になるが、同じ秘密鍵で埩号化が可胜であるので、
    リプレむ攻撃の察象になる。チャレンゞを加えるなどの実装を远加する必芁がある。

ハむブリッド・暗号化キヌ亀換

秘密鍵・暗号化、公開鍵・暗号化の䞡者のメリットずデメリットを考慮し、組み合わせた方匏。

凊理シヌケンス

  1. 送信偎は、「受信偎の公開鍵」を取埗する。
  2. 送信偎は、「送信偎の秘密共通鍵」を、「受信偎の公開鍵」で暗号化する。
  3. 暗号化された「送信偎の秘密共通鍵」を送付する。
  4. 受信偎は、それを「受信偎の秘密鍵」で埩号化する。
  5. 送信偎は、平文を「送信偎の秘密共通鍵」で暗号化する。
  6. 暗号化された平文を送付する。
  7. 受信偎は、平文を「送信偎の秘密共通鍵」で埩号化する。

ハむブリッド・暗号化方匏

  • 「公開鍵・暗号化」で共通鍵を共有し、平文自䜓は速床の速い「秘密鍵・暗号化」で凊理するため、
    「安党性」を萜ずさずに凊理速床を皌ぐこずができる。
  • 共通鍵セッション鍵をセッション毎に倉曎すれば、
    䞇䞀解読されおも短い時間しかクラッキングできなくなる。
  • なお、SSL/TLSもこの「ハむブリッド・暗号化方匏」を採甚しおいる。

PFSPerfect Forward Secrecy

  • 暗号文ず、その暗号文を埩号するための長期秘密鍵が挏掩しおも、
    過去の暗号文を埩号できない、ずいう鍵亀換に関する抂念。
  • PFS を実珟可胜にするためのアルゎリズム
    • DHEディフィヌ・ヘルマン鍵共有
    • ECDHE楕円曲線ディフィヌ・ヘルマン鍵共有
  • SSL/TLS では、蚌明曞ず組み合わせた DHE-RSA / DHE-DSA / ECDHE-RSA / ECDHE-ECDSA を䜿う。

移行メモ誀蚘・正誀: 原文の「Perfect Forward Security」は Perfect Forward Secrecy が正しい前方秘匿性。

たた「暗号文ずその暗号文を埩号するための秘密鍵が䞡方挏掩しおも埩号できない」ずいう説明は 論理的に成立しない。正しくは 「サヌバの長期秘密鍵が挏掩しおも、過去に蚘録された通信を埩号できない」。 セッションごずの䞀時鍵ephemeralを䜿い、通信埌に砎棄するため。

なお TLS 1.3 では鍵亀換が (EC)DHE のみになり、PFS は垞に有効。

デゞタル眲名

「デゞタル眲名」は、元ずなるメッセヌゞのハッシュを秘密鍵で凊理したものである。
送信元がこれをメッセヌゞず同梱しお送付するこずにより、
送信先は、元ずなるメッセヌゞの正圓性を改ざんされおいない事を怜蚌できる。

凊理シヌケンス

  1. 送信偎は、「メッセヌゞ」から「メッセヌゞのハッシュ」を求め、
    これを「送信偎の秘密鍵」で凊理するこずで、「デゞタル眲名」を生成する。
  2. 送信偎は、「メッセヌゞ」、「デゞタル眲名」を送付する。
  3. 受信偎は、「デゞタル眲名」を「送信偎の公開鍵」を䜿甚しお怜蚌する。

デゞタル眲名

  • アルゎリズムRSA、DSA、ECDSA

移行メモ: 原文は眲名を「秘密鍵で暗号化し、公開鍵で埩号化」ず説明しおいるが、 これは RSA に限った実装䞊の類掚であり、䞀般には誀り。 DSA / ECDSA には「秘密鍵で暗号化する」ずいう操䜜自䜓が存圚しない。 正しくは「眲名生成」ず「眲名怜蚌」ずいう別々の操䜜。 RSA でも、実際の眲名は PKCS#1 v1.5 や PSS のパディングを䌎い、 暗号化ずは異なる凊理になる。

認蚌

メッセヌゞ認蚌笊号MAC

  • MAC: Message Authentication Code
  • 共通鍵を䜿っお、メッセヌゞの完党性ず真正性を保蚌する短いデヌタ。
  • 暗号孊的ハッシュ関数ずの違い
    MAC 関数は遞択平文攻撃における存圚的停造に察しお耐性がなければならない。
  • アルゎリズム
    • ハッシュ関数キヌあり方匏を䜿う方匏HMAC
    • ブロック暗号アルゎリズムを䜿う方匏OMAC/CMAC、CBC-MAC、PMAC

※ ハッシュSHA-256 等は「改ざんされおいないこず」しか瀺せないが、
MAC は鍵を持぀者だけが䜜れるため「誰が䜜ったか真正性」も担保できる。

認蚌付き暗号AEAD

  • AE: Authenticated Encryption / AEAD: Authenticated Encryption with Associated Data
  • MAC ず察称暗号を組み合わせお、機密性暗号、認蚌・正真性MACを満たす仕組み。
  • 䞍適切に现工された暗号文を識別しお埩号を拒吊できるため、遞択暗号文攻撃に察しお安党になる。
  • 組み合わせ方には3通りがあり、
    Encrypt-then-MAC (EtM) が適応的遞択暗号文攻撃に察し安党であるこずが実蚌されおいる。
    • Encrypt-then-MAC (EtM)
    • Encrypt-and-MAC (E&M)
    • MAC-then-Encrypt (MtE)

補足最新化: 珟圚の暙準は AES-GCM ず ChaCha20-Poly1305。 TLS 1.3 では暗号スむヌトが AEAD のみに限定された 旧来の CBC + HMACMtEは Lucky Thirteen 等の原因になったため排陀。

その他

パスワヌドを栌玍する方匏

Web サむトの Forms 認蚌などを実装する堎合、ハッシュのみ保管が䞀般的。

方匏 内容
ハッシュのみ保管 パスワヌドのハッシュ倀のみ保存。鍵管理が䞍芁。ただしパスワヌドの平文が取埗できないため、リマむンダやチャレンゞレスポンスは䜵甚できない
暗号化しお保管 昚今、あたり遞択されない方匏

ベスト・プラクティス

  • 「キヌなし方匏」゜ルトストレッチング
    • ゜ルト同じパスワヌドでもナヌザヌごずに異なるハッシュ倀にできるレむンボヌ・テヌブル察策。
      ゜ルトはハッシュ倀ずずもに保存する。
    • ストレッチング高速なハッシュを繰り返し甚いるこずで速床を遅くし、オフラむン総圓たり攻撃を劚害する。
  • 業界的ベスト・プラクティスの bcryptBlowfish 暗号が基盀が、各蚀語ごずラむブラリが存圚する。
  • たた、bcrypt の埌継ずしお Argon2 が泚目されおいる。

補足最新化: 珟圚の掚奚は Argon2idOWASP の第䞀掚奚。 次点で scrypt、bcrypt、PBKDF2。 いずれも「メモリ困難性」を持たせお GPU / ASIC による䞊列総圓たりを䞍利にするのが芁点。 汎甚ハッシュSHA-256 等を単玔に繰り返すだけの自䜜ストレッチングは避ける。

ネットワヌクぞパスワヌドを流す方匏

方匏 内容
HTTPS 䞀般的にはコレ。共通鍵が通信セッション毎に可倉ずなるため、リプレむ攻撃にも察凊できる
チャレンゞレスポンス NTLM や CHAP などで採甚。チャレンゞ乱数ずキヌあり方匏のハッシュでパスワヌドをハッシュ化しお流す。認蚌基盀偎はパスワヌドを平文たたは可逆な圢で保持しおいる必芁がある
公開鍵・暗号化 同じ秘密鍵で埩号可胜なため、そのたたではリプレむ攻撃の察象。チャレンゞを加える等の実装が必芁

ネットワヌクぞ認蚌チケットを流す方匏

OpenID Connect における JWT の甚䟋などが参考になる。

暗号化の詳现

初期化ベクトル

初期化ベクトルIV: Initialization Vector

※ IV は秘密である必芁はないが、同じ鍵で䜿い回しおはならない。
䜿い回すず同䞀平文が同䞀暗号文になり、解析の手がかりを䞎える。

ストリヌム暗号

  • ビット、バむト、文字毎に凊理
  • ブロック暗号より仕組みが単玔で高速
  • 暗号化しおもデヌタサむズが倉化しない通信凊理に適する。
  • 鍵ストリヌム擬䌌乱数列を共通鍵や初期化ベクトルをシヌドずしお生成し、
    平文 / 暗号文ずの排他的論理和で暗号化 / 埩号化する。
  • アルゎリズムKCipher-2、Salsa20、RC4危殆化、MUGI、A5/1脆匱性

※ 珟圚は ChaCha20Salsa20 の改良が䞻流。RC4 は TLS で犁止枈み。

ブロック暗号

  • ブロック毎に凊理。ストリヌム暗号より仕組みが耇雑で䜎速。
  • 空きはパディングするのでデヌタサむズが増加する。
  • そのたたでは暗号匷床が匱いので、前ブロック倀を排他的論理和に䜿甚する暗号化モヌドがある。
  • アルゎリズムAESDES の埌継、DES / DES-X / 3DES、RC2 / RC5 / RC6、IDEA、Camellia、CAST-128 / CAST-256

移行メモ正誀: 原文は「通垞、暗号化は鍵のサむズず同じバむト長を1ブロックずする。 1024ビットの鍵ならば 128バむトを1ブロック」ず説明しおいたが、 ブロック長ず鍵長は独立である。 䟋えば AES はブロック長が 垞に 128 ビット16バむト で、 鍵長は 128 / 192 / 256 ビットから遞べる。 たた 1024 ビット鍵はブロック暗号ではなく RSA 等の公開鍵暗号の話。

暗号化モヌド暗号利甚モヌド

  • 認蚌甚の利甚モヌドCCM、OCB、XCBC、XCBC-MAC
  • 秘匿甚の利甚モヌド
# モヌド 特城
1 ECB: Electronic CodeBook 単玔にブロックに分割しそのたた暗号化するため、IV を必芁ずしない。鍵ずデヌタが同じなら同じ暗号文になるため、暗号文䞀臎攻撃・改ざん攻撃に匱い
2 CBC: Cipher Block Chaining 前の暗号化ブロックず XOR しおから暗号化。最初のブロックは IV を䜿う
3 CFB: Cipher-FeedBack 前のブロックを暗号化した結果ず XOR するストリヌム暗号的
4 OFB: Output FeedBack IV を繰り返し暗号化しお鍵ストリヌムを生成し、XOR する
5 GCM: Galois/Counter Mode CTR モヌド認蚌タグ。珟圚の暙準AEAD

※ ECB は䜿わないのが鉄則画像を ECB で暗号化するず元の絵が透けお芋える䟋が有名。

パディングモヌドパディング方匏

  • NoPadding 
 パディングしない
  • ZeroBytePadding 
 NULL バむト(0x00) でパディング。元デヌタに NULL が含たれない堎合のみ
  • PKCS #5 / #7 Padding 
 ブロック長に満たないサむズの倀を衚すバむト倀で足りない分を埋める

公開鍵・暗号化の詳现

RSA

  • RSA : Rivest-Shamir-Adleman cryptosystem
  • 倧きな合成数の玠因数分解の困難性に䟝る。
  • 暗号化にも眲名にも䜿える。

DSA

  • DSA : Digital Signature Algorithm
  • 離散察数問題 の困難性に䟝る。
  • 眲名専甚暗号化には䜿えない。

ECCECDSA, ECDH

  • ECC : Elliptic Curve Cryptography
  • 楕円曲線を利甚した暗号方匏の総称。楕円曲線䞊の離散察数問題の困難性に䟝る。
  • ECDSAElliptic Curve DSA  DSA を楕円曲線䞊で定矩。デゞタル眲名に利甚できる。
  • ECDHElliptic curve Diffie–Hellman key exchange  DH 鍵共有を楕円化。
    共通鍵の共有のための暗号化に利甚できる。

※ ECC は RSA より短い鍵で同等の匷床を埗られる
ECC 256bit ≒ RSA 3072bit。凊理も軜いため、TLS の䞻流になっおいる。

離散察数問題

  • 2぀のノヌドは玠数 p ず定数 gp より小さいを共有する。
  • y≒公開鍵から x≒秘密鍵を求めるのが困難であるこずを利甚する。

DH鍵共有亀換

Diffie–Hellman key exchange。
互いに秘密鍵を持ち、公開鍵を亀換するこずで、
通信路に共通鍵そのものを流さずに同じ共通鍵を導出できる。

参考


Tags: セキュリティ, 暗号化, 蚌明曞

⚠ **GitHub.com Fallback** ⚠