<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>暗号技術 on M1KE BL0G</title><link>https://www.m1ke.org/categories/crypt/</link><description>Recent content in 暗号技術 on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><atom:link href="https://www.m1ke.org/categories/crypt/index.xml" rel="self" type="application/rss+xml"/><item><title>HTTPS通信について</title><link>https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link><pubDate>Thu, 30 Apr 2026 23:52:18 +0900</pubDate><guid>https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid><description>&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/https.png" alt="Featured image of post HTTPS通信について" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTPSについて調べていたときのメモを発見したのでこっちにコピーする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="基本"&gt;基本&lt;/h2&gt;
&lt;h3 id="共通鍵暗号方式-des-aes"&gt;共通鍵暗号方式 (DES, AES)&lt;/h3&gt;
&lt;p&gt;一番ベーシックな暗号方式は共通鍵暗号方式。
シーザー暗号もこの一種。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/1.png"
width="1165"
height="731"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/1_hu_400bd36ab46a987e.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/1_hu_90103db6e01a2842.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="159"
data-flex-basis="382px"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;予め共通鍵を共有する&lt;/li&gt;
&lt;li&gt;送信者は送るテキストを共通鍵で暗号化&lt;/li&gt;
&lt;li&gt;受信者に送信&lt;/li&gt;
&lt;li&gt;受信者は暗号化された文を共通鍵で復号&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="desとaesとは"&gt;DESとAESとは？&lt;/h4&gt;
&lt;p&gt;第二次世界大戦で利用されたエニグマなど1976年以前の暗号は共通鍵暗号に分類される。
この暗号方式は1977年にアメリカ政府が策定した56ビットの鍵を用いるDES(Data Encryption Standard)として広く用いられてきた。
しかし、現在では総当たり攻撃で解読可能なほど安全性が低くなっており、2001年にNISTが公募し規格化したAES(Advanced Encryption Standard)が標準として利用されている。&lt;/p&gt;
&lt;h3 id="公開鍵暗号方式とは"&gt;公開鍵暗号方式とは？&lt;/h3&gt;
&lt;p&gt;共通鍵暗号方式では、ひとつの鍵（共通鍵）を使用するが、公開鍵暗号方式では対になっている 2つの暗号鍵を用いる。&lt;/p&gt;
&lt;p&gt;この 2つの鍵は、それぞれ「公開鍵 (Public Key)」と 「プライベート鍵(Private Key)もしくは秘密鍵」と呼び、対となる 2つの鍵の組み合わせを「鍵ペア」と呼ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/2.png"
width="382"
height="197"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/2_hu_830c9c73dc4ddf7a.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/2_hu_56e94e9db870c29e.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="465px"
&gt;&lt;/p&gt;
&lt;h4 id="メッセージの送信フロー"&gt;メッセージの送信フロー&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;受信者は予め公開鍵を送信者に送る&lt;/li&gt;
&lt;li&gt;送信者はメッセージを公開鍵で暗号化して送信する&lt;/li&gt;
&lt;li&gt;受信者は秘密鍵で暗号文を復号する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/3.png"
width="397"
height="191"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/3_hu_62345021209489.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/3_hu_278b24c094addd05.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="207"
data-flex-basis="498px"
&gt;&lt;/p&gt;
&lt;h4 id="なぜ公開鍵で暗号化して秘密鍵で復号化するのか"&gt;なぜ公開鍵で暗号化して、秘密鍵で復号化するのか？&lt;/h4&gt;
&lt;p&gt;基本的には公開鍵で暗号化して、秘密鍵で複合する。
なぜ逆はないかというと、秘密鍵で暗号化すると、みんな読めてしまう状態になるから。&lt;/p&gt;
&lt;h3 id="ハイブリッド暗号-公開鍵暗号方式と共通鍵暗号方式を組み合わせ"&gt;ハイブリッド暗号 (公開鍵暗号方式と共通鍵暗号方式を組み合わせ)&lt;/h3&gt;
&lt;p&gt;実際のメッセージの中身の暗号化では、公開鍵暗号方式と共通鍵暗号化方式を組み合わせる。&lt;/p&gt;
&lt;h4 id="なぜ公開鍵暗号方式と共通暗号方式を組み合わせるのか"&gt;なぜ公開鍵暗号方式と共通暗号方式を組み合わせるのか？&lt;/h4&gt;
&lt;p&gt;公開鍵暗号方式では実は処理が重いから。
公開鍵暗号方式は複雑な演算処理を行うため、共通鍵暗号方式の数百倍もの計算が必要になる。
そこで実際には、高速な処理を可能にするため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用する。&lt;/p&gt;
&lt;h4 id="公開鍵暗号方式と共通暗号方式を組み合わせによるメッセージの暗号化"&gt;公開鍵暗号方式と共通暗号方式を組み合わせによるメッセージの暗号化&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/4.png"
width="538"
height="348"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/4_hu_389e66d3f21963eb.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/4_hu_bffa585123f90374.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="154"
data-flex-basis="371px"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;共通鍵 (S) を生成する。（A さん）&lt;/li&gt;
&lt;li&gt;生成した共通鍵 (S) を用いて、平文 (T) を暗号化する。（A さん）&lt;/li&gt;
&lt;li&gt;各送信相手の公開鍵 (B, C, D) を用いて、共通鍵を暗号化 (SB, SC, SD) する。（A さん）&lt;/li&gt;
&lt;li&gt;暗号文 (TS) と暗号化した共通鍵 (SB, SC, SD) を送信する。（A さん）&lt;/li&gt;
&lt;li&gt;自分の公開鍵(B)で暗号化された共通鍵 (SB) を選択し、自分のプライベート鍵(B’)を用いて復号(S)する。（B さん、C さん、D さん）&lt;/li&gt;
&lt;li&gt;復号した共通鍵 (S) で暗号文 (TS) を復号 (T) する。（B さん、C さん、D さん）&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="公開鍵暗号方式と共通暗号方式の組み合わせのポイント"&gt;公開鍵暗号方式と共通暗号方式の組み合わせのポイント&lt;/h4&gt;
&lt;p&gt;共通鍵でメッセージを暗号化するが、共通鍵は公開鍵で暗号化して、秘密鍵で共通鍵を復号化してその復号化した共通鍵でメッセージを復号化するところ。
つまり、共通鍵方式で問題だった、共通鍵の安全なやり取りの問題を公開鍵方式で解決しているところ。
共通鍵方式では一旦共通鍵がバレルと暗号文は全部ダダ漏れだから。&lt;/p&gt;
&lt;h3 id="非公開鍵による変換デジタル署名"&gt;非公開鍵による変換（デジタル署名）&lt;/h3&gt;
&lt;p&gt;デジタル署名とは？&lt;/p&gt;
&lt;p&gt;メッセージに対するダイジェストを秘密鍵で暗号化することで、メッセージの改ざんを検出することができる。これをデジタル署名 (Digital Signature) と呼ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/5.png"
width="499"
height="274"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/5_hu_4fd30ededd721069.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/5_hu_3196342c2ea410c2.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="182"
data-flex-basis="437px"
&gt;&lt;/p&gt;
&lt;p&gt;公開鍵は誰でも取得できるため、プライベート鍵で暗号化しても 守秘性の確保にはならないが、
プライベート鍵が特定の個人のみ所有しているので、電子文書の真正性と完全性の保証を実現することができる。&lt;/p&gt;
&lt;p&gt;これがデジタル署名 (Digital Signature) と呼ばれる技術。&lt;/p&gt;
&lt;p&gt;デジタル署名では、&lt;strong&gt;署名と検証&lt;/strong&gt;の2つのことを行う。&lt;/p&gt;
&lt;h4 id="デジタル署名の検証の目的"&gt;デジタル署名の検証の目的&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;メッセージが改ざんされていないこと&lt;/li&gt;
&lt;li&gt;メッセージは、検証に使用した公開鍵と対になる秘密鍵(鍵ペア)によって署名されたこと&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="なぜ非公開鍵で暗号化するのか"&gt;なぜ非公開鍵で暗号化するのか？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基本的に公開鍵方式では、公開鍵で暗号化して、非公開鍵で復号化する。&lt;/li&gt;
&lt;li&gt;(なぜなら、その逆だと、公開されている公開鍵でだれても暗号文を解読できてしまうから)&lt;/li&gt;
&lt;li&gt;ただし、RSA暗号方式の場合、これとは逆に、プライベート鍵で暗号化(署名)して公開鍵で復号(検証)することもできる。&lt;/li&gt;
&lt;li&gt;この仕組みによって、署名を検証することで、改ざんされていないことや鍵ペアが正しいことを検証する。&lt;/li&gt;
&lt;li&gt;NOTE: メッセージの中身自体は暗号化されていないので注意。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="用途による鍵ペアの名称"&gt;用途による鍵ペアの名称&lt;/h3&gt;
&lt;p&gt;メッセージの中身自体を暗号化したい場合は、公開鍵を使って暗号化して、秘密鍵で復号化する。
他方、署名(デジタル署名)をしたい場合は、非公開鍵で暗号化して、秘密鍵で検証する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/6.png"
width="520"
height="242"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/6_hu_547c44e0d0b5dcd8.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/6_hu_87f7112b7a5e6e10.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="515px"
&gt;&lt;/p&gt;
&lt;h4 id="用途による意味の違い"&gt;用途による意味の違い&lt;/h4&gt;
&lt;p&gt;意味的には、暗号鍵と復号鍵と検証鍵がある。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;プライベート鍵 (Private Key)&lt;/th&gt;
&lt;th&gt;公開鍵 (Public Key)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;守秘&lt;/td&gt;
&lt;td&gt;復号鍵&lt;/td&gt;
&lt;td&gt;暗号鍵&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ディジタル署名(RSA暗号)&lt;/td&gt;
&lt;td&gt;署名鍵&lt;/td&gt;
&lt;td&gt;検証鍵&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="rsa暗号について"&gt;RSA暗号について&lt;/h3&gt;
&lt;p&gt;基本、公開鍵暗号方式では、公開鍵は公開されているので、暗号化用で、非公開鍵は復号化ように使われる。
ただし、RSAはちょっと違う。双方向で暗号と復号が可能。その構造上、デジタル署名のアルゴリズムとして使われている。
順を追って説明する。&lt;/p&gt;
&lt;h4 id="rsa暗号の仕組み"&gt;RSA暗号の仕組み&lt;/h4&gt;
&lt;p&gt;RSAでは公開鍵と秘密鍵の２つの鍵を &lt;strong&gt;素数の掛け算と素因数分解の計算コストの差&lt;/strong&gt;を利用して実現する。&lt;/p&gt;
&lt;p&gt;A: 素数
B: 素数
C = A x B&lt;/p&gt;
&lt;p&gt;その計算には次の特徴がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;掛け算は簡単
&lt;ul&gt;
&lt;li&gt;AとBが数百桁あったとしても、かなり短時間で計算できる。&lt;/li&gt;
&lt;li&gt;23451532523 x 53523532532235 = ??? みたいな&lt;/li&gt;
&lt;li&gt;単に計算すればOK = ローコスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;素因数分解は難しい
&lt;ul&gt;
&lt;li&gt;??? x ??? = 5057230593780528023&lt;/li&gt;
&lt;li&gt;これは5057230593780528023を素因数分解する必要がある。&lt;/li&gt;
&lt;li&gt;ただし、因数は素数なので大きな素数の掛け算になる。&lt;/li&gt;
&lt;li&gt;虱潰しに計算しないといけない = ハイコスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="rsa暗号の具体的な例"&gt;RSA暗号の具体的な例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;RSAの公開鍵 (素因数分解)
&lt;ul&gt;
&lt;li&gt;この鍵で暗号化したものを平文化するためには、秘密鍵が必要&lt;/li&gt;
&lt;li&gt;A × B = C のうちの C だけが書かれている&lt;/li&gt;
&lt;li&gt;計算によって、Cから AとB を特定するのは困難(=公開鍵から秘密鍵は作れない)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公開鍵から秘密鍵を作ることができない&lt;/strong&gt;ため、「閉めることしかできない鍵」となる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RSAの秘密鍵 (掛け算)
&lt;ul&gt;
&lt;li&gt;公開鍵で暗号化したものを平文化することができる鍵&lt;/li&gt;
&lt;li&gt;A × B = C のうちの AとB が書かれている&lt;/li&gt;
&lt;li&gt;計算によって、AとB から Cを求めるのは簡単(=秘密鍵から公開鍵を作れる)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;秘密鍵から公開鍵を作ることができる&lt;/strong&gt;ので、間接的には閉めることもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要なのは、RSAでは、秘密鍵だけ大事に保管しておけば、
無くしてしまった公開鍵をあとから生成しなおすことができる&lt;/p&gt;
&lt;h4 id="rsaの公開鍵と非公開鍵はどちらでも暗号化と復号化が可能"&gt;RSAの公開鍵と非公開鍵はどちらでも暗号化と復号化が可能&lt;/h4&gt;
&lt;p&gt;実は RSAの公開鍵と秘密鍵は同じ構造をしているので、どちらの鍵をつかっても暗号化することができる&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;あなた&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;相手&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;秘密鍵で平文化&lt;/td&gt;
&lt;td&gt;&amp;lt;=暗号化=&lt;/td&gt;
&lt;td&gt;公開鍵で暗号化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;秘密鍵で暗号化&lt;/td&gt;
&lt;td&gt;=暗号化=&amp;gt;&lt;/td&gt;
&lt;td&gt;公開鍵で平文化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;つまり、双方向でできてしまう。
ただし、秘密鍵から公開鍵は作成できないので、公開鍵を渡すようにする。&lt;/p&gt;
&lt;p&gt;また、公開鍵で暗号化してもあまり意味がない。
なぜなら、公開鍵は公開されているので、誰でも暗号化できるため。
Githubみたいに(&lt;a class="link" href="https://github.com/mgoldchild.keys" target="_blank" rel="noopener"
&gt;https://github.com/mgoldchild.keys&lt;/a&gt;)、公開鍵として公開されている。&lt;/p&gt;
&lt;h4 id="非公開鍵で暗号化できるメリット"&gt;非公開鍵で暗号化できるメリット&lt;/h4&gt;
&lt;p&gt;それは暗号文を自分で暗号化したことを証明できる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;明日送金します。by Mike&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;というメッセージが平文で(暗号化されずに)送られてきた時に、
そのままではこのメッセージを書いたのが本当にMikeなのか、
それとも第三者が捏造したものなのかを区別することができない。&lt;/p&gt;
&lt;p&gt;それを区別できるようにするのが電子署名。&lt;/p&gt;
&lt;p&gt;RSAの電子署名は、 秘密鍵による暗号文を作り出すことで実現する。
上記文章をMikeの秘密鍵で暗号化すると、受け取った人はMikeの公開鍵を使って平文化できる。&lt;/p&gt;
&lt;p&gt;Mikeさんの公開鍵は公開されているので誰でも読めるが
公開鍵で平文化できる暗号文を作れたということは、
Aさんの秘密鍵を持っているということ、&lt;/p&gt;
&lt;p&gt;つまり 本人が書いた文章だということがわかる。これが電子署名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;つまり、メッセージを暗号化する共通鍵方式や普通の公開鍵暗号方式とは違い、
RSA暗号ではメッセージではなく、送信者を保証することを目的とする。&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="コマンドの具体例"&gt;コマンドの具体例&lt;/h4&gt;
&lt;p&gt;コマンドでは一旦メッセージを計算コストの低くなるdigitにsha1などで変換してから、非公開鍵で暗号化する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo -n &amp;#34;明日送金します。by Mike&amp;#34; | openssl dgst -sha1 -sign private-key.pem | hexdump
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000000 c2 1f 73 6d 4f b5 fa 5a 9d 9d 02 e0 a3 fe 70 0c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000010 93 ef f5 f1 3c 34 ec 5f e0 8d 21 58 6a 27 3a e1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000020 b0 49 81 a8 15 d2 92 39 cc fe ce 2d 3f 9f 91 3d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000030 68 cf 99 ce 91 04 2e 72 e7 e5 c5 71 55 29 87 7d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000040 f5 e9 f0 c3 f5 6b af f4 be 8f f9 c4 34 bb 52 1c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000050 51 8d cf c7 64 e0 84 d2 33 ed bb 80 4f 9a 3f 42
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000060 84 2e ef 41 e4 fc b4 04 51 5e 55 11 86 63 31 fc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000070 a1 b7 6b 93 f7 e0 67 31 04 69 e4 2e 97 e6 5f a2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="まとめ"&gt;まとめ&lt;/h3&gt;
&lt;p&gt;インターネットで身元を確認して挨拶するのは大変という話。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mike&amp;gt; Hi John.
John&amp;gt; Good morning Mike.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;顔が見えないインターネットでは次のような疑問が浮かぶ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人
&lt;ul&gt;
&lt;li&gt;本当にMikeなのか？&lt;/li&gt;
&lt;li&gt;本当にJohnなのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メッセージ
&lt;ul&gt;
&lt;li&gt;途中で誰かにメッセージを盗聴されていないか？&lt;/li&gt;
&lt;li&gt;途中で誰かにメッセージを改ざんされていないか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そういう背景があって暗号化が必要になる。&lt;/p&gt;
&lt;h4 id="比較"&gt;比較&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;アルゴ&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;th&gt;処理&lt;/th&gt;
&lt;th&gt;メリット&lt;/th&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;共通鍵暗号方式&lt;/td&gt;
&lt;td&gt;メッセージをの暗号化&lt;/td&gt;
&lt;td&gt;共通の鍵でメッセージを暗号化&lt;/td&gt;
&lt;td&gt;メッセージを双方向に暗号化可能&lt;/td&gt;
&lt;td&gt;共通鍵を渡すときに、共通鍵が流出すると問題&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開鍵暗号方式&lt;/td&gt;
&lt;td&gt;メッセージをの暗号化&lt;/td&gt;
&lt;td&gt;公開鍵を渡して暗号化してもらう&lt;/td&gt;
&lt;td&gt;公開鍵を持っている人から他人が盗聴できないメッセージを非公開鍵を持っている人に送れる&lt;/td&gt;
&lt;td&gt;計算コストが高い。また、双方向ではメッセージを暗号化できない。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ハイブリッド暗号方式&lt;/td&gt;
&lt;td&gt;共通鍵を安全に送信する&lt;/td&gt;
&lt;td&gt;公開鍵で共通鍵を暗号化して非公開鍵でそれを復号化してもらう&lt;/td&gt;
&lt;td&gt;計算コストが低い。また、双方向でメッセージを暗号化可能。&lt;/td&gt;
&lt;td&gt;公開鍵を渡しても、公開鍵自体が改ざんされている可能性がある。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DH鍵交換&lt;/td&gt;
&lt;td&gt;共通鍵を安全に送信する&lt;/td&gt;
&lt;td&gt;通信内容がバレても問題ない数字を双方向にパラメータとして決めて、秘密な共通鍵（秘密鍵でもある）を生成する&lt;/td&gt;
&lt;td&gt;共通鍵自体をハイブリッド方式のように送信しないので共有鍵交換中に&lt;/td&gt;
&lt;td&gt;中間者攻撃を受ける可能性がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル署名（サーバー証明書）&lt;/td&gt;
&lt;td&gt;公開鍵を安全に送信する&lt;/td&gt;
&lt;td&gt;公開鍵をメッセージとして、非公開鍵でそれに署名をつけて、公開鍵でそれを検証する&lt;/td&gt;
&lt;td&gt;公開鍵を非公開鍵を持っている人が送信したことを確認できる&lt;/td&gt;
&lt;td&gt;公開鍵を渡してきた人が本当にその人本人なのかが分からない。例えばMikeから送られた。では本当にMikeなのか？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル署名（中間証明書）&lt;/td&gt;
&lt;td&gt;サーバー証明書を証明する&lt;/td&gt;
&lt;td&gt;信頼できる第三者機関（Trusted Third Party）に送信者の公開鍵をメッセージとして、第三者機関の非公開鍵でそれに署名をつけて、第三者機関の公開鍵でそれを検証する&lt;/td&gt;
&lt;td&gt;公開鍵を渡してきた人の信憑性が権威のある信頼できる第三者機関によって保証される。中間者攻撃を防ぐ。&lt;/td&gt;
&lt;td&gt;ただし、その信頼できる第三者機関自体が改ざんされていたら&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル署名（ルート証明書）&lt;/td&gt;
&lt;td&gt;中間証明書を証明する&lt;/td&gt;
&lt;td&gt;さらに信頼できる第三者機関からその元々の第三者機関を証明してもらう(ルート証明書)。&lt;/td&gt;
&lt;td&gt;さらに信頼のある第三者から中間証明者を保証してもらう。中間者攻撃を防ぐ。&lt;/td&gt;
&lt;td&gt;最終的には自己署名の問題に回帰するが、多段に検証している分安全なので、問題なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAC(メッセージ認証コード)&lt;/td&gt;
&lt;td&gt;メッセージの改竄を防ぐ&lt;/td&gt;
&lt;td&gt;通信データに改ざん検知用の確認データ(メッセージ認証コード)を付与する機能&lt;/td&gt;
&lt;td&gt;メッセージにDigitをつけてメッセージ自体が改ざんされていないかを保証する&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="公開鍵暗号方式の種類"&gt;公開鍵暗号方式の種類&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種別&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DH(Diffie-Hellman)&lt;/td&gt;
&lt;td&gt;鍵交換&lt;/td&gt;
&lt;td&gt;W. Diffie と M. Hellman が 1976年に発表した、共通鍵を安全に交換するための鍵配送アルゴリズムである。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSA(Rivest-Shamir-Adleman)&lt;/td&gt;
&lt;td&gt;暗号化 署名鍵交換&lt;/td&gt;
&lt;td&gt;Rivest, Shamir, Adleman の 3名が 1978年に発明したアルゴリズムである。同じ鍵ペアを暗号化と署名の両方に利用できることが特徴である。大きな整数の素因数分解が困難であるという仮定に基づいている。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSA(Digital Signature Algorithm)&lt;/td&gt;
&lt;td&gt;署名&lt;/td&gt;
&lt;td&gt;NIST が 1991年に提唱した、デジタル署名のためのアルゴリズムである。離散対数問題を解くことが難しいという仮定に基づいている。デジタル署名専用のアルゴリズムであり、暗号化の機能はない。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;楕円曲線暗号(ECC: Elliptic Curve cryptosystem)&lt;/td&gt;
&lt;td&gt;暗号化 署名鍵交換&lt;/td&gt;
&lt;td&gt;Neal Koblitz と Miller が 1985年に別々に考案した方式である。特定のアルゴリズムを指すのではなく、離散対数問題に楕円曲線を適用させて、強度を保ちつつ鍵長を小さくするために用いられる [15]。主な適用例として、DSA に適用したECDSA が有名である。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="dh鍵共有"&gt;DH鍵共有&lt;/h2&gt;
&lt;h3 id="dh-離散対数問題とフェルマーの小定理"&gt;DH 離散対数問題とフェルマーの小定理&lt;/h3&gt;
&lt;h4 id="素数と離散対数問題-discrete-logarithm-problem"&gt;素数と離散対数問題 (Discrete Logarithm Problem)&lt;/h4&gt;
&lt;p&gt;2^x mod n = xを次の表で示す。
例えば、2の2(x)乗=4を3(n)でmodすると、答えは1。つまり、あまりは1。
すると、nが素数のとき (7, 17, 23, 31 を除いて)、計算結果に 1 から n-1 までの全ての整数が登場する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/7.png"
width="928"
height="645"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/7_hu_3fb938d77015167.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/7_hu_d28805e4628dbed7.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="143"
data-flex-basis="345px"
&gt;&lt;/p&gt;
&lt;p&gt;例えば n=37 のとき、1 から 36 が 1 回ずつ登場する。&lt;/p&gt;
&lt;p&gt;また、そのようにならなかった n=7, 17, 31 についても、3^x mod n を計算すると同様に 1 から n-1 までの全ての整数が登場する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/8.png"
width="737"
height="118"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/8_hu_25af578c4fef7a57.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/8_hu_9829769f09e2c34.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="624"
data-flex-basis="1498px"
&gt;&lt;/p&gt;
&lt;p&gt;このように、n が素数で、基数 g (前述の 2 とか 3 の部分) を適切な値に選ぶと、g^x mod n (1 ≦ x ≦ n-1) は 1 から n-1 までの整数が 1 回ずつ登場する。&lt;/p&gt;
&lt;p&gt;このようなとき、g^x mod n = K の計算で、K 以外の 3 つのパラメータが与えられていて K を計算するのは比較的簡単であるのに対し、x 以外の 3 つのパラメータが与えられて x を計算するのは難しい、という性質がある。&lt;/p&gt;
&lt;p&gt;この x を求める難しい問題のことをDiscrete Logarithm Problem (DLP: 離散対数問題) と呼ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/9.png"
width="846"
height="336"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/9_hu_1f39b0f7dd61e4e7.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/9_hu_6ece027d1d800876.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="251"
data-flex-basis="604px"
&gt;&lt;/p&gt;
&lt;p&gt;以降、mod n の n (法の n) が素数のとき、mod p と記述する。素数を英語で prime と呼ぶからである。&lt;/p&gt;
&lt;p&gt;DH 鍵共有アルゴリズムでは、g (基数) と n 改め p (適切な大きな素数) を公開パラメータ、x (1 ≦ x ≦ p-1) を各個人の秘密鍵、K (g^x mod p) を各個人の公開鍵として使う。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;鍵のタイプ&lt;/th&gt;
&lt;th&gt;数字&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;秘密鍵&lt;/td&gt;
&lt;td&gt;g(基数)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;秘密鍵&lt;/td&gt;
&lt;td&gt;p(素数)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開鍵&lt;/td&gt;
&lt;td&gt;K(あまり)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="フェルマーの小定理"&gt;フェルマーの小定理&lt;/h4&gt;
&lt;p&gt;先程の表で、n が素数のとき、n-1 の計算結果が必ず 1 になっていることに着目する。これはフェルマーの小定理と呼ばれるものである。&lt;/p&gt;
&lt;h3 id="dh法の問題点は中間者攻撃"&gt;DH法の問題点は中間者攻撃&lt;/h3&gt;
&lt;p&gt;中間者攻撃とは、通信を行う２者の間に第三者が介入し、２者に気づかれないように情報を盗み見る方法。&lt;/p&gt;
&lt;p&gt;下地図のように中間攻撃者がいると、共通鍵がバレてしまうので、メッセージの内容を復号化して中身を読めてしまう。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/10.png"
width="581"
height="625"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/10_hu_6b57d0f4a475f311.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/10_hu_5cef0787c8db4d66.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="92"
data-flex-basis="223px"
&gt;&lt;/p&gt;
&lt;h3 id="dh鍵共有とは"&gt;DH鍵共有とは&lt;/h3&gt;
&lt;p&gt;共通鍵暗号方式のために使われる共通暗号を共有する仕組み。
具体的には、$a$, $b$を非公開鍵、$g$, $p$をパラメータとし、$g^a \mod p$や$g^b \mod p$を公開鍵とし、認識を合わせた上で、共有鍵を作る方式。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/11.png"
width="605"
height="526"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/11_hu_345fb38b2c8e90c5.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/11_hu_a9d743e05deefd14.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="115"
data-flex-basis="276px"
&gt;&lt;/p&gt;
&lt;h4 id="dh鍵共有の具体的な計算"&gt;DH鍵共有の具体的な計算&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/12.png"
width="708"
height="694"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/12_hu_74554c752a99ceb0.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/12_hu_be466d4187787952.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="102"
data-flex-basis="244px"
&gt;&lt;/p&gt;
&lt;h4 id="dh鍵共有を使うプロトコル"&gt;DH鍵共有を使うプロトコル&lt;/h4&gt;
&lt;p&gt;IP ネットワーク通信において、暗号化による機密性と認証による通信相手の正当性を担保する技術として「IPsec」や「SSL/TLS」、「SSH」等がある。
この 3 つのプロトコルは用途によって使い分けられるが、いずれも共通鍵暗号方式での通信暗号化のための「共通鍵の共有」を、【Diffie-Hellman 鍵共有 (DH 鍵共有)】というアルゴリズムによって実現している。&lt;/p&gt;
&lt;h3 id="dh鍵交換の簡単な計算例"&gt;dh鍵交換の簡単な計算例&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/13.png"
width="475"
height="365"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/13_hu_694789051636f7de.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/13_hu_e8338c0667a427f.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="130"
data-flex-basis="312px"
&gt;&lt;/p&gt;
&lt;p&gt;50 / 7 = 4あまり1を次のように表現する。&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
50 \mod 7 = 1 \\
324 \mod 7 = 2
\end{align}
$$&lt;/p&gt;
&lt;p&gt;この剰余演算は普通の計算と同じような、以下の性質がある。&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
(a \mod n) + (b \mod n) = (a+b) \mod n \\
(a \mod n) - (b \mod n) = (a-b) \mod n \\
(a \mod n) × (b \mod n) = ab \mod n \\
(a \mod n)^b = a^b \mod n \\
\end{align}
$$&lt;/p&gt;
&lt;p&gt;割り算も条件付きで定義可能だが、ここでは省略する。&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
(50 \mod 7) + (324 \mod 7) = 374 \mod 7 = 3 \\
(50 \mod 7) - (324 \mod 7) = -274 \mod 7 = 6 \\
(50 \mod 7) × (324 \mod 7) = 16200 \mod 7 = 2 \\
\end{align}
$$&lt;/p&gt;
&lt;h2 id="ssl証明書"&gt;SSL証明書&lt;/h2&gt;
&lt;h3 id="ssl証明書とは"&gt;SSL証明書とは&lt;/h3&gt;
&lt;p&gt;HTTP通信を暗号化するには次のファイルが必要となる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバーの公開鍵(CSR)と秘密鍵(Key)&lt;/li&gt;
&lt;li&gt;認証局(CA)が電子署名したSSL証明書(CRT)と中間CA証明書
SSL証明書はサーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報が署名されているファイルである。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サーバの公開鍵はクライアントとの通信を「暗号化」する際に使用し、署名は「なりすまし」を防ぐために使う。&lt;/p&gt;
&lt;p&gt;署名は、証明書を発行するCAと呼ばれる第三者機関が、CSRの情報を元に行う。&lt;/p&gt;
&lt;p&gt;中間CA証明書は、SSL証明書を発行する認証局またはその配下にある別の認証局によって署名されたファイルである。必須ではありませんが、セキュリティレベルの向上を理由に、中間CAを1つい上用いる階層構造とる認証が現在は主流となっている。&lt;/p&gt;
&lt;h3 id="sslの用語と設定の違い"&gt;SSLの用語と設定の違い&lt;/h3&gt;
&lt;h4 id="事前に用意するモノ"&gt;事前に用意するモノ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;KEY&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;SSLの為のサーバー用の秘密鍵のこと。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CSR (Certificate Signing Request)&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;SSLの為のサーバー用の公開鍵のこと。&lt;/li&gt;
&lt;li&gt;CSR には「公開鍵」とその所有者情報、及び申請者が対応する秘密鍵を持っていることを示すために申請者の署名が記載されている&lt;/li&gt;
&lt;li&gt;サーバの公開鍵はクライアントとの通信を「暗号化」する際に使用するリクエスト用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSRの例&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/14.png"
width="450"
height="292"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/14_hu_a34d3ea121d8bb1e.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/14_hu_e494ff6efe492e5f.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="154"
data-flex-basis="369px"
&gt;&lt;/p&gt;
&lt;h4 id="ca認証局によって発行されるssl証明書"&gt;CA(認証局)によって発行されるSSL証明書&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CRT&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;サーバー証明書&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INCRT&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;中間CA証明書&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ROOTCRT&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ルート証明書&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CRTの例&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/15.png"
width="579"
height="635"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/15_hu_171060fec09630f6.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/15_hu_987fe8f186267186.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="91"
data-flex-basis="218px"
&gt;&lt;/p&gt;
&lt;h4 id="ssl証明書の中身"&gt;SSL証明書の中身&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SSL証明書&lt;/code&gt; or &lt;code&gt;SSLサーバー証明書&lt;/code&gt; or &lt;code&gt;サーバー証明書&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CRT&lt;/code&gt;と&lt;code&gt;INCRT&lt;/code&gt;と&lt;code&gt;ROOTCRT&lt;/code&gt;の中身&lt;/li&gt;
&lt;li&gt;サーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報が電子署名されているファイル&lt;/li&gt;
&lt;li&gt;階層構造になっている&lt;/li&gt;
&lt;li&gt;トラストチェーンでサーバー証明書を証明する中間CA証明書を証明するルート証明書という感じになっている&lt;/li&gt;
&lt;li&gt;ルート証明書はPCに直接保存されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example CA Root X1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └Example CA intermediate G2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └example.jp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="ssl証明書発行と設定の流れ"&gt;SSL証明書発行と設定の流れ&lt;/h4&gt;
&lt;p&gt;SSL証明書の発行には、次のような手順が踏む。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自分のサーバーでCSRとKEYを作成&lt;/li&gt;
&lt;li&gt;CSRをCAへ送信して証明書の発行を申請&lt;/li&gt;
&lt;li&gt;CAから電子署名されたCRTと中間CA証明書を受け取る&lt;/li&gt;
&lt;li&gt;受け取った証明書類をWebサーバーへ設置する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/16.png"
width="582"
height="349"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/16_hu_dadf7f67b7d431e7.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/16_hu_cb7adacae4b309f6.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="166"
data-flex-basis="400px"
&gt;&lt;/p&gt;
&lt;h3 id="ディスティングイッシュネームとは"&gt;ディスティングイッシュネームとは？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ディスティングイッシュネームとは、CSRを作成する際に登録をする、ウェブサイトの所有者情報のことである。&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目名&lt;/th&gt;
&lt;th&gt;項目の内容&lt;/th&gt;
&lt;th&gt;入力例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Common Name&lt;/td&gt;
&lt;td&gt;ウェブサイトのFQDN(Fully Qualified Domain Name)を登録する。サイトURLが「https://www.securecore.co.jp/」の場合だと、 Common Nameは「www.securecore.co.jp」と指定する必要がある。※CoreSSLワイルドカードの場合はサブドメインにも対応しているので、「*(アスタリスク).ドメイン名」で登録する。※FQDNとは ドメイン名・サブドメイン名・ホスト名を省略せず記載した形式のことを指す。&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://www.securecore.co.jp" target="_blank" rel="noopener"
&gt;www.securecore.co.jp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organizational Name(※1)&lt;/td&gt;
&lt;td&gt;ウェブサイト運営組織の法律上の正式英文名称を登録する。 法人格(Co Ltd Inc K.K.等)は入力必須である。&lt;/td&gt;
&lt;td&gt;SecureCore,Inc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organizational Unit(※1)&lt;/td&gt;
&lt;td&gt;ウェブサイト運営組織の部署名を登録する。&lt;/td&gt;
&lt;td&gt;Sales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;City or Locality(※1)&lt;/td&gt;
&lt;td&gt;ウェブサイト運営組織の市区町村名を登録する。&lt;/td&gt;
&lt;td&gt;Osaka-Shi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State or Province(※1)&lt;/td&gt;
&lt;td&gt;ウェブサイト運営組織の都道府県名を登録する。&lt;/td&gt;
&lt;td&gt;Osaka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Country&lt;/td&gt;
&lt;td&gt;国を示す２文字のISO略語である。 大文字で登録する。&lt;/td&gt;
&lt;td&gt;JP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="電子証明書"&gt;電子証明書&lt;/h2&gt;
&lt;h3 id="csr-証明書発行要求-とは"&gt;CSR (証明書発行要求) とは&lt;/h3&gt;
&lt;p&gt;CSR とは証明書発行要求 (Certificate Signing Request) と呼ばれるもので、これを生成する際に、秘密鍵と公開鍵も作られる。&lt;/p&gt;
&lt;p&gt;CSR には公開鍵が含まれており、この CSR を中間認証局に送り、中間認証局の秘密鍵で生成した電子署名 (CSR をハッシュ化したものを秘密鍵で暗号化) を CSR の末尾に付け加えることでデジタル証明書が出来上がる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSR = 公開鍵を含む情報&lt;/li&gt;
&lt;li&gt;電子証明 = 認証局の秘密鍵で生成&lt;/li&gt;
&lt;li&gt;デジタル証明書 = 電子証明 + CSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/17.png"
width="557"
height="592"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/17_hu_241e1295e877fbe7.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/17_hu_3b812a3bda2ab5b1.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="94"
data-flex-basis="225px"
&gt;&lt;/p&gt;
&lt;h3 id="デジタル署名とは"&gt;デジタル署名とは？&lt;/h3&gt;
&lt;p&gt;電子文章をハッシュ化して非公開鍵を使って電子署名を作成。
それに対して、公開鍵で検証する仕組み。&lt;/p&gt;
&lt;h5 id="rsa署名の作成"&gt;RSA署名の作成&lt;/h5&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/18.png"
width="544"
height="541"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/18_hu_6179f5e46e65461a.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/18_hu_e63286e44cc79eb2.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="241px"
&gt;&lt;/p&gt;
&lt;h4 id="rsa署名の検証"&gt;RSA署名の検証&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/19.png"
width="544"
height="571"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/19_hu_9215a62fbee71b68.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/19_hu_fef089c71771a1fb.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="95"
data-flex-basis="228px"
&gt;&lt;/p&gt;
&lt;p&gt;電子証明書が正しいかどうかは、認証局の公開鍵を用いて署名検証鍵（署名の対象となる電子文章）を復号化して、それをハッシュ関数に渡してハッシュ値が一致するかを確認する。&lt;/p&gt;
&lt;p&gt;大前提として、非公開鍵で暗号化された文章は複合が可能。&lt;/p&gt;
&lt;h3 id="電子証明書は印鑑登録書と同じ仕組み"&gt;電子証明書は印鑑登録書と同じ仕組み&lt;/h3&gt;
&lt;p&gt;SSL（電子証明書）の仕組みは、単純に言えば、印鑑登録証(印鑑証明)と同じ仕組み。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/20.png"
width="532"
height="613"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/20_hu_ff80efd89d7ae8ce.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/20_hu_9ff920eb37f7975c.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="86"
data-flex-basis="208px"
&gt;&lt;/p&gt;
&lt;p&gt;デジタル証明書を発行する中間認証局が、その中間認証局の秘密鍵でデジタル証明書にデジタル署名する。これにより、デジタル証明書に書かれたホスト名の機器は、中間認証局がお墨付きをくれた状態になる。(印鑑証明で言う地方役所)&lt;/p&gt;
&lt;p&gt;じゃあ中間認証局の身元は誰が保証するの？というと、更に上位の認証局。&lt;/p&gt;
&lt;p&gt;このプロセスを最上位であるルート認証局まで繰り返すが、ルート認証局の身元は誰が保証するの？というと、自分自身でサインする。これは自己署名証明書と呼ばれる (俗に言うオレオレ証明書)。(印鑑証明で言う日本国)&lt;/p&gt;
&lt;p&gt;=&amp;gt; なのでルート証明書は必ず自己署名証明書 (オレオレ証明書) になる。&lt;/p&gt;
&lt;h2 id="その他"&gt;その他&lt;/h2&gt;
&lt;h3 id="実際のフロー"&gt;実際のフロー&lt;/h3&gt;
&lt;h4 id="webサーバーの事前準備"&gt;Webサーバーの事前準備&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Webサーバーは予めCSRと秘密鍵を発行する&lt;/li&gt;
&lt;li&gt;そのCSRを認証局に送る&lt;/li&gt;
&lt;li&gt;認証局はCSRを認証局が持つ秘密鍵で暗号化する=デジタル証明書の作成&lt;/li&gt;
&lt;li&gt;認証局はその暗号化したCSR(デジタル証明書)をWebサーバーに返す&lt;/li&gt;
&lt;li&gt;Webサーバーはデジタル証明書と秘密鍵を設置する&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="userからのアクセス"&gt;Userからのアクセス&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Userはデジタル証明書をWebサーバーに要求する&lt;/li&gt;
&lt;li&gt;Userはデジタル証明書を認証局の公開鍵を使って検証
&lt;ul&gt;
&lt;li&gt;相手が認証局に証明されているデジタル証明書を使っているかを確認&lt;/li&gt;
&lt;li&gt;この時点で認証局に証明されたWebサーバーの公開鍵が入っているがまだ使わない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WebサーバーはDH公開鍵(SV)を作成&lt;/li&gt;
&lt;li&gt;Webサーバーは秘密鍵でDH公開鍵(SV)を署名する = デジタル証明書(2)&lt;/li&gt;
&lt;li&gt;Webサーバーはその新たなデジタル証明書(2)をUserに送る&lt;/li&gt;
&lt;li&gt;Userはデジタル証明書の公開鍵でデジタル証明書(2)を検証
&lt;ul&gt;
&lt;li&gt;送られたデジタル証明書(2)は間違いなく認証局に認証されたWebサーバーから署名されたモノ&lt;/li&gt;
&lt;li&gt;つまり、中間攻撃者がいないことを認証局を使って確認した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Userは自分のDH公開鍵(CL)を送る&lt;/li&gt;
&lt;li&gt;DH公開鍵(CL/SV)により、UserとWebサーバーは共通鍵を生成&lt;/li&gt;
&lt;li&gt;それを利用してメッセージを暗号化する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/21.png"
width="825"
height="589"
srcset="https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/21_hu_355cb5c80547acf7.png 480w, https://www.m1ke.org/p/https%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/21_hu_9fcab15dbdc1e218.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="336px"
&gt;&lt;/p&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CL = Client&lt;/li&gt;
&lt;li&gt;SV = Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tsl-sniとは"&gt;TSL SNIとは？&lt;/h3&gt;
&lt;p&gt;つのサーバーで1つしか使えなかったSSLサーバー証明書が、ドメイン名（URL）単位で利用できるようになる技術。&lt;/p&gt;
&lt;p&gt;仕組みとしてはSSL通信時にドメイン名を通知することで、サーバー側がどのSSLサーバー証明書を利用すべきか判別する。&lt;/p&gt;
&lt;p&gt;これによって、1台のサーバーでもドメイン名の数だけSSLサーバー証明書の利用が可能になり、URLが途中で変わってしまう心配や、SSLサーバー証明書ごとに別々のサーバーを用意するといった手間やコストの負担が軽減された。&lt;/p&gt;
&lt;h3 id="暗号スイートとは"&gt;暗号スイートとは&lt;/h3&gt;
&lt;p&gt;SSLは4種類の機能を組み合わせたハイブリット暗号技術。
英語で Cipher Suites と言い、TLSの暗号通信のためのプロトコルで複数の暗号化アルゴリズムの組み合わせのことを指す。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;th&gt;アルゴ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kx(鍵交換方式)&lt;/td&gt;
&lt;td&gt;鍵交換に使われる暗号化アルゴリズム&lt;/td&gt;
&lt;td&gt;DHE (ディフィー・ヘルマン鍵共有)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Au(鍵認証方式)&lt;/td&gt;
&lt;td&gt;鍵が正しいかの認証に使われる暗号化アルゴリズム&lt;/td&gt;
&lt;td&gt;RSA認証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enc(メッセージ暗号方式)&lt;/td&gt;
&lt;td&gt;暗号化したい通信データ自体の暗号化。アプリケーション層の暗号化に使われるアルゴリズム&lt;/td&gt;
&lt;td&gt;AES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac(メッセージ署名方式)&lt;/td&gt;
&lt;td&gt;暗号化した通信データの改ざんチェック。メッセージの検証に使われるアルゴリズム&lt;/td&gt;
&lt;td&gt;SHA1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="例"&gt;例&lt;/h4&gt;
&lt;p&gt;opensslで使われる暗号化スイートの一覧。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openssl ciphers -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一番上を抜粋すると、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1 2 3 4 5 6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;番号で読み解くと次の意味&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.暗号化スイートの名前
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ECDHE-RSA-AES256-GCM-SHA384 の箇所
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. SSLのバージョン
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. ECDHE : 鍵交換方式(Kx)を意味する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. RSA : 鍵認証方式(Au)を意味する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. AES256 : メッセージ暗号方式(Enc)を意味する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. GCM : ブロック処理を意味する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5.6. SHA384 : メッセージ署名方式(Mac)を意味する
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://keita-blog.com/programming/security-common-open" target="_blank" rel="noopener"
&gt;https://keita-blog.com/programming/security-common-open&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ipa.go.jp/security/pki/022.html" target="_blank" rel="noopener"
&gt;https://www.ipa.go.jp/security/pki/022.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ipa.go.jp/security/pki/022.html" target="_blank" rel="noopener"
&gt;https://www.ipa.go.jp/security/pki/022.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kunichiko/items/ef5efdb41611d6cf7775" target="_blank" rel="noopener"
&gt;https://qiita.com/kunichiko/items/ef5efdb41611d6cf7775&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14234965664" target="_blank" rel="noopener"
&gt;https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14234965664&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/angel_p_57/items/30a12a0d45457b5f76d5" target="_blank" rel="noopener"
&gt;https://qiita.com/angel_p_57/items/30a12a0d45457b5f76d5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ipa.go.jp/security/pki/022.html" target="_blank" rel="noopener"
&gt;https://www.ipa.go.jp/security/pki/022.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://milestone-of-se.nesuke.com/nw-basic/tls/diffie-hellman-summary/" target="_blank" rel="noopener"
&gt;https://milestone-of-se.nesuke.com/nw-basic/tls/diffie-hellman-summary/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://it-trend.jp/encryption/article/64-0055" target="_blank" rel="noopener"
&gt;https://it-trend.jp/encryption/article/64-0055&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://milestone-of-se.nesuke.com/nw-basic/tls/diffie-hellman-summary/" target="_blank" rel="noopener"
&gt;https://milestone-of-se.nesuke.com/nw-basic/tls/diffie-hellman-summary/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://avinton.com/academy/creating-ssl-certificate-by-certbot/" target="_blank" rel="noopener"
&gt;https://avinton.com/academy/creating-ssl-certificate-by-certbot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ssl.sakura.ad.jp/column/difference-in-ssl/" target="_blank" rel="noopener"
&gt;https://ssl.sakura.ad.jp/column/difference-in-ssl/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.securecore.co.jp/support/manual/csr_distinguish.php" target="_blank" rel="noopener"
&gt;https://www.securecore.co.jp/support/manual/csr_distinguish.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/" target="_blank" rel="noopener"
&gt;https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/" target="_blank" rel="noopener"
&gt;https://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ハッシュ・MAC・デジタル署名・証明書・鍵交換の関係</title><link>https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/</link><pubDate>Thu, 30 Apr 2026 22:08:46 +0900</pubDate><guid>https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/</guid><description>&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/crypt.jpg" alt="Featured image of post ハッシュ・MAC・デジタル署名・証明書・鍵交換の関係" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;昔、仕事で暗号技術を理解して実装する必要があった。&lt;/p&gt;
&lt;p&gt;そのときに調べていたメモが見つかったため、消すのももったいないので、ここに整理して残しておく。今は細かいところを忘れているし、また必要になる時が来る気がする。&lt;/p&gt;
&lt;p&gt;この記事では、暗号技術のうち、特に混乱しやすい以下の関係を整理する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ハッシュ&lt;/li&gt;
&lt;li&gt;MAC / HMAC&lt;/li&gt;
&lt;li&gt;デジタル署名&lt;/li&gt;
&lt;li&gt;デジタル証明書&lt;/li&gt;
&lt;li&gt;PKI&lt;/li&gt;
&lt;li&gt;共通鍵暗号&lt;/li&gt;
&lt;li&gt;公開鍵暗号&lt;/li&gt;
&lt;li&gt;Diffie-Hellman鍵交換&lt;/li&gt;
&lt;li&gt;ゼロ知識証明&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="この記事の結論"&gt;この記事の結論&lt;/h2&gt;
&lt;p&gt;暗号技術は、それぞれ守る対象が違う。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技術&lt;/th&gt;
&lt;th&gt;主な目的&lt;/th&gt;
&lt;th&gt;守れるもの&lt;/th&gt;
&lt;th&gt;守れないもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;共通鍵暗号&lt;/td&gt;
&lt;td&gt;暗号化&lt;/td&gt;
&lt;td&gt;機密性&lt;/td&gt;
&lt;td&gt;鍵配送、送信者の証明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ハッシュ&lt;/td&gt;
&lt;td&gt;要約値の生成&lt;/td&gt;
&lt;td&gt;変更検知の材料&lt;/td&gt;
&lt;td&gt;機密性、真正性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAC / HMAC&lt;/td&gt;
&lt;td&gt;メッセージ認証&lt;/td&gt;
&lt;td&gt;完全性、共有鍵ベースの真正性&lt;/td&gt;
&lt;td&gt;否認防止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル署名&lt;/td&gt;
&lt;td&gt;署名・検証&lt;/td&gt;
&lt;td&gt;完全性、公開鍵ベースの真正性、否認防止&lt;/td&gt;
&lt;td&gt;機密性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル証明書&lt;/td&gt;
&lt;td&gt;公開鍵の身元確認&lt;/td&gt;
&lt;td&gt;公開鍵と主体者の対応関係&lt;/td&gt;
&lt;td&gt;メッセージ本文の暗号化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DH / ECDH鍵交換&lt;/td&gt;
&lt;td&gt;鍵合意&lt;/td&gt;
&lt;td&gt;通信路に共有鍵を流さずに鍵材料を作ること&lt;/td&gt;
&lt;td&gt;相手認証単体&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ざっくり言うと、こういう関係になる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;メッセージを隠したいなら、AESなどの共通鍵暗号で暗号化する。&lt;/li&gt;
&lt;li&gt;メッセージが変わっていないか確認したいなら、ハッシュを使う。ただし、ハッシュだけでは攻撃者による改ざんには弱い。&lt;/li&gt;
&lt;li&gt;メッセージの改ざんと、共有鍵を知っている相手から来たことを確認したいなら、MACを使う。&lt;/li&gt;
&lt;li&gt;第三者にも「この人が署名した」と示したいなら、デジタル署名を使う。&lt;/li&gt;
&lt;li&gt;その公開鍵が本当に本人のものか確認したいなら、デジタル証明書とPKIを使う。&lt;/li&gt;
&lt;li&gt;通信のたびに安全な共通鍵を作りたいなら、DH / ECDH鍵交換を使う。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="情報セキュリティ"&gt;情報セキュリティ&lt;/h2&gt;
&lt;h3 id="情報セキュリティの三要素"&gt;情報セキュリティの三要素&lt;/h3&gt;
&lt;p&gt;情報セキュリティでは、よく次の3要素が使われる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;要素&lt;/th&gt;
&lt;th&gt;英語&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;機密性&lt;/td&gt;
&lt;td&gt;Confidentiality&lt;/td&gt;
&lt;td&gt;許可された者だけが情報にアクセスできる状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;完全性&lt;/td&gt;
&lt;td&gt;Integrity&lt;/td&gt;
&lt;td&gt;情報が正確で、改ざん・破壊されていない状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可用性&lt;/td&gt;
&lt;td&gt;Availability&lt;/td&gt;
&lt;td&gt;許可された者が、必要なときに情報へアクセスできる状態&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;暗号技術は、このうち主に機密性・完全性・真正性を支えるために使われる。&lt;/p&gt;
&lt;h3 id="isms"&gt;ISMS&lt;/h3&gt;
&lt;p&gt;ISMSは &lt;code&gt;Information Security Management System&lt;/code&gt; の略で、日本語では「情報セキュリティマネジメントシステム」と呼ばれる。&lt;/p&gt;
&lt;p&gt;組織が情報の機密性・完全性・可用性を維持し、継続的に改善するための管理の仕組みである。&lt;/p&gt;
&lt;h2 id="zkp"&gt;ZKP&lt;/h2&gt;
&lt;h3 id="zkpとは"&gt;ZKPとは&lt;/h3&gt;
&lt;p&gt;ZKPは &lt;code&gt;Zero-Knowledge Proof&lt;/code&gt; の略で、日本語ではゼロ知識証明と呼ばれる。&lt;/p&gt;
&lt;p&gt;ゼロ知識証明とは、証明者が「ある秘密を知っている」という主張を、秘密そのものを明かさずに検証者へ納得させるためのプロトコルである。&lt;/p&gt;
&lt;p&gt;ポイントは次の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;証明者は秘密を知っている&lt;/li&gt;
&lt;li&gt;検証者は秘密そのものを知らない&lt;/li&gt;
&lt;li&gt;検証者は「証明者が秘密を知っている」という事実だけを確認する&lt;/li&gt;
&lt;li&gt;秘密に関する余計な情報は漏れない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="アリババの洞窟"&gt;アリババの洞窟&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/1.png"
width="774"
height="409"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/1_hu_e30723d83915affa.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/1_hu_dbeada31af765cf2.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="189"
data-flex-basis="454px"
&gt;&lt;/p&gt;
&lt;h3 id="前提"&gt;前提&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;洞窟にはAとBの2つの通路がある&lt;/li&gt;
&lt;li&gt;奥には鍵で開く扉があり、AとBは奥でつながっている&lt;/li&gt;
&lt;li&gt;Victorは鍵を知らない&lt;/li&gt;
&lt;li&gt;Peggyは鍵を知っている&lt;/li&gt;
&lt;li&gt;Victorは、Peggyが本当に鍵を持っているか確認したい&lt;/li&gt;
&lt;li&gt;Peggyは、Victorに鍵そのものを教えたくない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで妥協点として、Peggyは「扉を開ける能力がある」という事実だけを示す。鍵そのものは教えない。&lt;/p&gt;
&lt;h3 id="アルゴリズム"&gt;アルゴリズム&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/2.png"
width="572"
height="567"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/2_hu_fba3e4567d00762.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/2_hu_1ecbbb4af9a21e7b.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="242px"
&gt;&lt;/p&gt;
&lt;p&gt;初期状態では、Peggyは分岐点にいる。Victorは洞窟の入口にいる。&lt;/p&gt;
&lt;p&gt;次のラウンドを必要な回数だけ繰り返す。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Peggyは、分岐点からPath AまたはPath Bのどちらかを選んで進む。この時点でVictorはPeggyがどちらを選んだか見えない。&lt;/li&gt;
&lt;li&gt;Victorは、Peggyに「Aから戻ってきて」または「Bから戻ってきて」と指示する。&lt;/li&gt;
&lt;li&gt;Peggyは、Victorの指示通りのPathから分岐点に戻る。
&lt;ul&gt;
&lt;li&gt;Peggyが最初に選んだPathとVictorの要求Pathが同じなら、そのまま戻ればよい。&lt;/li&gt;
&lt;li&gt;Peggyが最初に選んだPathとVictorの要求Pathが違うなら、扉の鍵を使って反対側へ移動し、要求されたPathから戻る。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Victorは、Peggyが要求通りのPathから戻ってきたか確認する。
&lt;ul&gt;
&lt;li&gt;要求通りなら検証OK。&lt;/li&gt;
&lt;li&gt;要求通りでなければ検証NG。「Peggyは鍵を持っていない」と判断する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Victorは入口に戻る。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Peggyが鍵を知らない場合、1回のラウンドを偶然突破できる確率は1/2である。ラウンド数を増やすほど、偶然すべて成功する確率は小さくなる。&lt;/p&gt;
&lt;h3 id="注意点"&gt;注意点&lt;/h3&gt;
&lt;p&gt;重要なのは、PeggyがVictorの指示より前にPathを選択する点である。&lt;/p&gt;
&lt;p&gt;Victorが先にPathを指定してしまうと、PeggyはそのPathに進めばよいだけになる。これでは、Peggyが鍵を持っていることの証明にならない。&lt;/p&gt;
&lt;p&gt;また、VictorがPeggyの進んだPathを最初から見てしまうのもよくない。Victorに見られたという事実がPeggyへのヒントになり、プロトコルの性質が変わる。&lt;/p&gt;
&lt;h3 id="oauthとの違い"&gt;OAuthとの違い&lt;/h3&gt;
&lt;p&gt;OAuthは、パスワードを第三者サービスに渡さずに権限を委譲する仕組みである。この点だけを見ると、「秘密を直接渡さない」という意味でゼロ知識証明と似て見える。&lt;/p&gt;
&lt;p&gt;ただし、OAuthはゼロ知識証明ではない。OAuthは認可のためのフレームワークであり、第三者アプリケーションに限定的なアクセス権を与えるための仕組みである。&lt;/p&gt;
&lt;h2 id="暗号の種類"&gt;暗号の種類&lt;/h2&gt;
&lt;h3 id="共通鍵暗号と公開鍵暗号"&gt;共通鍵暗号と公開鍵暗号&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/3.png"
width="645"
height="97"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/3_hu_e18be18bb72d3a25.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/3_hu_ed1b935d3a9fcd00.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="664"
data-flex-basis="1595px"
&gt;&lt;/p&gt;
&lt;p&gt;暗号方式は、大きく次の2つに分けられる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種類&lt;/th&gt;
&lt;th&gt;別名&lt;/th&gt;
&lt;th&gt;鍵の使い方&lt;/th&gt;
&lt;th&gt;代表例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;共通鍵暗号&lt;/td&gt;
&lt;td&gt;対称鍵暗号、秘密鍵暗号&lt;/td&gt;
&lt;td&gt;暗号化と復号に同じ鍵を使う&lt;/td&gt;
&lt;td&gt;AES、ChaCha20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開鍵暗号&lt;/td&gt;
&lt;td&gt;非対称鍵暗号&lt;/td&gt;
&lt;td&gt;公開鍵と秘密鍵のペアを使う&lt;/td&gt;
&lt;td&gt;RSA、ElGamal、楕円曲線暗号&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="共通鍵暗号"&gt;共通鍵暗号&lt;/h3&gt;
&lt;p&gt;共通鍵暗号は、暗号化と復号に同じ鍵を使う方式である。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/4.png"
width="682"
height="301"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/4_hu_4d4d90d0dee01999.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/4_hu_67b346259678a069.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="226"
data-flex-basis="543px"
&gt;&lt;/p&gt;
&lt;p&gt;たとえばAESでは、送信者と受信者が同じ秘密鍵を共有し、その鍵でデータを暗号化・復号する。&lt;/p&gt;
&lt;p&gt;共通鍵暗号の特徴は次の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;処理が速い&lt;/li&gt;
&lt;li&gt;大量データの暗号化に向いている&lt;/li&gt;
&lt;li&gt;送信者と受信者が同じ鍵を持つ必要がある&lt;/li&gt;
&lt;li&gt;鍵をどう安全に共有するか、という鍵配送問題がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代表的な共通鍵暗号には、AESやChaCha20がある。RC4、DES、3DESは歴史的には重要だが、現在の新規設計では避けるべきレガシーな方式として扱う方がよい。&lt;/p&gt;
&lt;h3 id="公開鍵暗号"&gt;公開鍵暗号&lt;/h3&gt;
&lt;p&gt;公開鍵暗号は、ペアとなる2つの鍵を使う方式である。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/5.png"
width="682"
height="542"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/5_hu_3e7e71ebd661ec4f.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/5_hu_de80aef00f0c798a.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="125"
data-flex-basis="301px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公開鍵は他人に渡してよい&lt;/li&gt;
&lt;li&gt;秘密鍵は本人だけが持つ&lt;/li&gt;
&lt;li&gt;公開鍵で暗号化したデータは、対応する秘密鍵で復号する&lt;/li&gt;
&lt;li&gt;秘密鍵で作った署名は、対応する公開鍵で検証する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公開鍵暗号を使うと、共通鍵暗号のように「同じ鍵を事前に安全な経路で渡す」必要は減る。&lt;/p&gt;
&lt;p&gt;ただし、公開鍵暗号にも別の問題がある。受け取った公開鍵が本当に相手本人のものか分からなければ、中間者攻撃を受ける可能性がある。そのため、公開鍵の真正性を確認する仕組みとして、デジタル証明書やPKIが必要になる。&lt;/p&gt;
&lt;h3 id="diffie-hellman鍵交換"&gt;Diffie-Hellman鍵交換&lt;/h3&gt;
&lt;p&gt;Diffie-Hellman鍵交換は、安全でない通信路上で、共通鍵の材料となる共有秘密を作るための鍵合意方式である。&lt;/p&gt;
&lt;p&gt;注意点として、DH鍵交換は「共通鍵を安全に送る方式」ではない。共通鍵そのものは通信路に流さない。双方が公開情報を交換し、それぞれの秘密情報と組み合わせて同じ共有秘密を計算する。&lt;/p&gt;
&lt;p&gt;その共有秘密から、KDF（Key Derivation Function）を使って実際の暗号鍵を導出する。&lt;/p&gt;
&lt;p&gt;DH鍵交換の特徴は次の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共通鍵そのものを通信路に流さない&lt;/li&gt;
&lt;li&gt;データ本文の暗号化方式ではない&lt;/li&gt;
&lt;li&gt;鍵交換・鍵合意のための方式である&lt;/li&gt;
&lt;li&gt;認証なしのDHは中間者攻撃に弱い&lt;/li&gt;
&lt;li&gt;実際のプロトコルでは、証明書や署名などと組み合わせて相手認証を行う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;楕円曲線を使う方式はECDHと呼ばれる。現在のTLSでは、ECDHEのような一時鍵を使う方式がよく使われる。&lt;/p&gt;
&lt;h2 id="ハッシュ"&gt;ハッシュ&lt;/h2&gt;
&lt;h3 id="ハッシュ化とは"&gt;ハッシュ化とは&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/11.png"
width="462"
height="97"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/11_hu_cd28afa1b73eea42.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/11_hu_93fcc8e01838a905.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="476"
data-flex-basis="1143px"
&gt;&lt;/p&gt;
&lt;p&gt;ハッシュ化とは、元データからハッシュ関数を使って固定長の値を生成する処理である。この固定長の値を、ハッシュ値、ダイジェスト、メッセージダイジェストなどと呼ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/6.png"
width="547"
height="109"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/6_hu_eceb8270d7c4230f.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/6_hu_433d3d797409e15f.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="501"
data-flex-basis="1204px"
&gt;&lt;/p&gt;
&lt;p&gt;暗号学的ハッシュ関数には、主に次の性質が求められる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;性質&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;原像計算困難性&lt;/td&gt;
&lt;td&gt;ハッシュ値から元データを求めるのが困難であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第二原像計算困難性&lt;/td&gt;
&lt;td&gt;あるデータと同じハッシュ値になる別データを作るのが困難であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;衝突困難性&lt;/td&gt;
&lt;td&gt;同じハッシュ値になる2つの異なるデータを見つけるのが困難であること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ハッシュは暗号化ではない。ハッシュ値から元データを復元することを目的としない。&lt;/p&gt;
&lt;h3 id="ハッシュで確認できること"&gt;ハッシュで確認できること&lt;/h3&gt;
&lt;p&gt;ハッシュは、データが変化していないか確認する材料として使える。&lt;/p&gt;
&lt;p&gt;たとえば、ソフトウェアの配布元がハッシュ値を公開している場合、ダウンロードしたファイルのハッシュ値を自分で計算し、公開値と一致するか確認できる。&lt;/p&gt;
&lt;p&gt;ただし、ハッシュだけで改ざんを防げるわけではない。攻撃者がファイル本体とハッシュ値の両方を差し替えられる場合、ハッシュ値も一緒に作り直されてしまう。&lt;/p&gt;
&lt;p&gt;つまり、ハッシュ単体では次のことは保証できない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;誰が作ったデータか&lt;/li&gt;
&lt;li&gt;攻撃者が本文とハッシュ値を両方差し替えていないか&lt;/li&gt;
&lt;li&gt;データが秘匿されているか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを確認するには、MACやデジタル署名が必要になる。&lt;/p&gt;
&lt;h3 id="代表的なハッシュ関数"&gt;代表的なハッシュ関数&lt;/h3&gt;
&lt;p&gt;代表的な暗号学的ハッシュ関数には、次のようなものがある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SHA-256&lt;/li&gt;
&lt;li&gt;SHA-384&lt;/li&gt;
&lt;li&gt;SHA-512&lt;/li&gt;
&lt;li&gt;SHA-3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MD5やSHA-1も歴史的にはよく使われたが、現在の新規設計では使うべきではない。MD5やSHA-1は衝突攻撃に対して弱く、現代のセキュリティ用途ではレガシーな方式として扱う。&lt;/p&gt;
&lt;h3 id="crcチェックサムパリティチェックとの違い"&gt;CRC、チェックサム、パリティチェックとの違い&lt;/h3&gt;
&lt;p&gt;CRC、チェックサム、パリティチェックも、データの誤り検出に使われる。&lt;/p&gt;
&lt;p&gt;ただし、これらは主に偶発的なエラー検出のための仕組みであり、攻撃者による意図的な改ざんに耐えることを目的としていない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;主な用途&lt;/th&gt;
&lt;th&gt;暗号学的な改ざん耐性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;パリティチェック&lt;/td&gt;
&lt;td&gt;単純なビット誤り検出&lt;/td&gt;
&lt;td&gt;ない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チェックサム&lt;/td&gt;
&lt;td&gt;簡易な誤り検出&lt;/td&gt;
&lt;td&gt;ない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRC&lt;/td&gt;
&lt;td&gt;通信・保存時の誤り検出&lt;/td&gt;
&lt;td&gt;ない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;暗号学的ハッシュ&lt;/td&gt;
&lt;td&gt;改ざん検出の材料&lt;/td&gt;
&lt;td&gt;ある&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="パスワードのハッシュ化"&gt;パスワードのハッシュ化&lt;/h2&gt;
&lt;h3 id="通常のハッシュとの違い"&gt;通常のハッシュとの違い&lt;/h3&gt;
&lt;p&gt;パスワード保存では、単純にSHA-256などでハッシュ化するだけでは不十分である。&lt;/p&gt;
&lt;p&gt;理由は、パスワードは人間が覚えるため、入力の候補が偏りやすいからである。攻撃者はよく使われるパスワードを大量に試すことで、ハッシュ値から元のパスワードを推測できる。&lt;/p&gt;
&lt;p&gt;そのため、パスワード保存では専用のパスワードハッシュ方式を使う。&lt;/p&gt;
&lt;p&gt;代表例は次の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Argon2id&lt;/li&gt;
&lt;li&gt;bcrypt&lt;/li&gt;
&lt;li&gt;scrypt&lt;/li&gt;
&lt;li&gt;PBKDF2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ソルト"&gt;ソルト&lt;/h3&gt;
&lt;p&gt;ソルトは、パスワードごとに付与するランダムな値である。&lt;/p&gt;
&lt;p&gt;パスワードとソルトを組み合わせてハッシュ化し、ソルトとハッシュ値をデータベースに保存する。&lt;/p&gt;
&lt;p&gt;ソルトの目的は、同じパスワードでもユーザーごとに異なるハッシュ値にすること。これにより、レインボーテーブル攻撃や、同じパスワードを使っているユーザーの一括特定を難しくできる。&lt;/p&gt;
&lt;p&gt;ソルトは秘密にする必要はない。ハッシュ値と一緒に保存してOK。&lt;/p&gt;
&lt;h3 id="ストレッチング"&gt;ストレッチング&lt;/h3&gt;
&lt;p&gt;ストレッチングは、ハッシュ計算を意図的に重くする考え方である。&lt;/p&gt;
&lt;p&gt;攻撃者が1つの候補パスワードを試すたびに高い計算コストがかかるようにし、総当たり攻撃や辞書攻撃を遅くする。&lt;/p&gt;
&lt;p&gt;現在は「数千〜数万回ハッシュ化する」とだけ考えるより、Argon2id、bcrypt、scrypt、PBKDF2などのパスワード保存用アルゴリズムを使い、ワークファクターやメモリコストを適切に設定する方がよい。&lt;/p&gt;
&lt;h2 id="認証真正性完全性"&gt;認証・真正性・完全性&lt;/h2&gt;
&lt;h3 id="用語の整理"&gt;用語の整理&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用語&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;完全性&lt;/td&gt;
&lt;td&gt;データが改ざん・破壊されていないこと&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;真正性&lt;/td&gt;
&lt;td&gt;主張された主体・データ・記録が本物であること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;認証&lt;/td&gt;
&lt;td&gt;相手やデータが主張通りであることを確認すること&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;否認防止&lt;/td&gt;
&lt;td&gt;後から「自分はやっていない」と否認しにくくすること&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;メッセージ認証とは、受信したメッセージが改ざんされておらず、期待した相手から来たものだと確認する技術である。&lt;/p&gt;
&lt;h2 id="mac--hmac"&gt;MAC / HMAC&lt;/h2&gt;
&lt;h3 id="macとは"&gt;MACとは&lt;/h3&gt;
&lt;p&gt;MACは &lt;code&gt;Message Authentication Code&lt;/code&gt; の略で、日本語ではメッセージ認証コードと呼ばれる。&lt;/p&gt;
&lt;p&gt;MACは、共有鍵とメッセージから短い認証コードを生成する仕組みである。&lt;/p&gt;
&lt;p&gt;送信側は、メッセージと共有鍵からMAC値を計算し、メッセージと一緒に送る。受信側も同じ共有鍵と受信メッセージからMAC値を計算し、送られてきたMAC値と比較する。&lt;/p&gt;
&lt;p&gt;一致すれば、次のことを確認できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージが改ざんされていないこと&lt;/li&gt;
&lt;li&gt;同じ共有鍵を知っている相手がMAC値を作ったこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/7.png"
width="697"
height="389"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/7_hu_6c0bf02cb4c47239.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/7_hu_6ce527ec014edc45.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="179"
data-flex-basis="430px"
&gt;&lt;/p&gt;
&lt;h3 id="hmacとは"&gt;HMACとは&lt;/h3&gt;
&lt;p&gt;HMACは、ハッシュ関数を使ってMACを構成する方式である。&lt;/p&gt;
&lt;p&gt;たとえば、HMAC-SHA-256、HMAC-SHA-512などがある。&lt;/p&gt;
&lt;p&gt;HMACは単なる &lt;code&gt;hash(key + message)&lt;/code&gt; ではない。鍵とメッセージを安全に組み合わせるための決まった構造を持つ。&lt;/p&gt;
&lt;h3 id="macの限界"&gt;MACの限界&lt;/h3&gt;
&lt;p&gt;MACは、共有鍵を持つ者同士のメッセージ認証には向いている。&lt;/p&gt;
&lt;p&gt;ただし、共有鍵を使うため、第三者に対する証明には向かない。AとBが同じ鍵を持っている場合、あるMAC値を作ったのがAなのかBなのかを第三者に証明できない。&lt;/p&gt;
&lt;p&gt;そのため、MACには否認防止性がない。&lt;/p&gt;
&lt;h2 id="aead"&gt;AEAD&lt;/h2&gt;
&lt;p&gt;実際の通信では、「暗号化」と「MAC」を別々に組み合わせるより、AEADを使うことが多い。&lt;/p&gt;
&lt;p&gt;AEADは &lt;code&gt;Authenticated Encryption with Associated Data&lt;/code&gt; の略で、暗号化と認証をまとめて扱う方式である。&lt;/p&gt;
&lt;p&gt;代表例は次の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AES-GCM&lt;/li&gt;
&lt;li&gt;ChaCha20-Poly1305&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AEADを使うと、次の性質を同時に得られる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージの機密性&lt;/li&gt;
&lt;li&gt;メッセージの完全性&lt;/li&gt;
&lt;li&gt;メッセージの真正性&lt;/li&gt;
&lt;li&gt;追加認証データの保護&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TLSなどの現代的なプロトコルでは、AEADが重要な役割を持つ。&lt;/p&gt;
&lt;h2 id="デジタル署名"&gt;デジタル署名&lt;/h2&gt;
&lt;h3 id="デジタル署名とは"&gt;デジタル署名とは&lt;/h3&gt;
&lt;p&gt;デジタル署名は、秘密鍵で署名を生成し、公開鍵で署名を検証する仕組みである。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/8.png"
width="540"
height="337"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/8_hu_45c692a348220cf2.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/8_hu_5b9dfa1827708e66.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="160"
data-flex-basis="384px"
&gt;&lt;/p&gt;
&lt;p&gt;基本的な流れは次の通り。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;送信者はメッセージを作成する。&lt;/li&gt;
&lt;li&gt;送信者はメッセージからハッシュ値を計算する。&lt;/li&gt;
&lt;li&gt;送信者は秘密鍵を使って署名値を生成する。&lt;/li&gt;
&lt;li&gt;送信者はメッセージと署名値を受信者に送る。&lt;/li&gt;
&lt;li&gt;受信者はメッセージからハッシュ値を計算する。&lt;/li&gt;
&lt;li&gt;受信者は送信者の公開鍵を使って署名を検証する。&lt;/li&gt;
&lt;li&gt;検証に成功すれば、メッセージの完全性と、秘密鍵を持つ主体による署名であることを確認できる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここで重要なのは、「秘密鍵で暗号化して公開鍵で復号する」と雑に理解しないこと。&lt;/p&gt;
&lt;p&gt;RSA署名ではそのように説明されることもあるが、ECDSAやEdDSAではその説明は成り立たない。一般化して言うなら、秘密鍵で署名を生成し、公開鍵で署名を検証する、という理解がよい。&lt;/p&gt;
&lt;h3 id="デジタル署名で分かること"&gt;デジタル署名で分かること&lt;/h3&gt;
&lt;p&gt;デジタル署名によって、次のことを確認できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メッセージが改ざんされていないこと&lt;/li&gt;
&lt;li&gt;対応する秘密鍵を持つ主体が署名したこと&lt;/li&gt;
&lt;li&gt;署名者が後から否認しにくいこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし、デジタル署名は暗号化ではない。署名付きメッセージは、暗号化されていなければ中身を読める。&lt;/p&gt;
&lt;p&gt;機密性が必要なら、署名とは別に暗号化が必要である。&lt;/p&gt;
&lt;h3 id="デジタル署名の代表例"&gt;デジタル署名の代表例&lt;/h3&gt;
&lt;p&gt;代表的なデジタル署名方式には、次のものがある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RSA署名&lt;/li&gt;
&lt;li&gt;DSA&lt;/li&gt;
&lt;li&gt;ECDSA&lt;/li&gt;
&lt;li&gt;EdDSA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;新規設計では、利用環境や標準に応じて、ECDSAやEdDSAなどの楕円曲線ベースの署名方式が使われることが多い。&lt;/p&gt;
&lt;h2 id="macとデジタル署名の違い"&gt;MACとデジタル署名の違い&lt;/h2&gt;
&lt;p&gt;MACとデジタル署名は、どちらもメッセージの完全性と真正性に関係する。ただし、使う鍵と性質が違う。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;比較項目&lt;/th&gt;
&lt;th&gt;MAC&lt;/th&gt;
&lt;th&gt;デジタル署名&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;鍵&lt;/td&gt;
&lt;td&gt;共通鍵&lt;/td&gt;
&lt;td&gt;秘密鍵・公開鍵ペア&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;検証者&lt;/td&gt;
&lt;td&gt;同じ共通鍵を持つ者&lt;/td&gt;
&lt;td&gt;公開鍵を持つ者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;完全性&lt;/td&gt;
&lt;td&gt;確認できる&lt;/td&gt;
&lt;td&gt;確認できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;真正性&lt;/td&gt;
&lt;td&gt;共有鍵を知る相手として確認できる&lt;/td&gt;
&lt;td&gt;秘密鍵を持つ署名者として確認できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;否認防止&lt;/td&gt;
&lt;td&gt;できない&lt;/td&gt;
&lt;td&gt;できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;処理速度&lt;/td&gt;
&lt;td&gt;速い&lt;/td&gt;
&lt;td&gt;MACより重いことが多い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代表例&lt;/td&gt;
&lt;td&gt;HMAC-SHA-256、AES-CMAC&lt;/td&gt;
&lt;td&gt;RSA署名、ECDSA、EdDSA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;MACは「内輪での確認」に強い。デジタル署名は「第三者にも示せる証明」に強い。&lt;/p&gt;
&lt;h2 id="pkiとデジタル証明書"&gt;PKIとデジタル証明書&lt;/h2&gt;
&lt;h3 id="pkiとは"&gt;PKIとは&lt;/h3&gt;
&lt;p&gt;PKIは &lt;code&gt;Public Key Infrastructure&lt;/code&gt; の略で、日本語では公開鍵基盤と呼ばれる。&lt;/p&gt;
&lt;p&gt;PKIの目的は、公開鍵と主体者の対応関係を信頼できる形で扱うこと。&lt;/p&gt;
&lt;p&gt;公開鍵暗号やデジタル署名では、公開鍵を使って暗号化や検証を行う。しかし、そもそもその公開鍵が本当に相手本人のものか分からなければ意味がない。&lt;/p&gt;
&lt;p&gt;そこで、CA（認証局）が「この公開鍵はこの主体者のものだ」と証明する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/9.png"
width="476"
height="263"
srcset="https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/9_hu_53b62be3540d80a0.png 480w, https://www.m1ke.org/p/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5mac%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E9%8D%B5%E4%BA%A4%E6%8F%9B%E3%81%AE%E9%96%A2%E4%BF%82/9_hu_5465a31e3baffd9.png 1024w"
loading="lazy"
alt="image.png"
class="gallery-image"
data-flex-grow="180"
data-flex-basis="434px"
&gt;&lt;/p&gt;
&lt;h3 id="デジタル証明書とは"&gt;デジタル証明書とは&lt;/h3&gt;
&lt;p&gt;デジタル証明書は、公開鍵と主体者情報を結びつけ、それにCAが署名したデータである。&lt;/p&gt;
&lt;p&gt;より正確には、一般に使われるX.509証明書には、次のような情報が含まれる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主体者名&lt;/li&gt;
&lt;li&gt;主体者の公開鍵&lt;/li&gt;
&lt;li&gt;発行者名&lt;/li&gt;
&lt;li&gt;有効期間&lt;/li&gt;
&lt;li&gt;鍵用途&lt;/li&gt;
&lt;li&gt;拡張領域&lt;/li&gt;
&lt;li&gt;CAによる署名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、デジタル証明書は「公開鍵そのもの」ではない。「公開鍵が誰のものか」を証明するためのデータである。&lt;/p&gt;
&lt;h3 id="デジタル署名とデジタル証明書の違い"&gt;デジタル署名とデジタル証明書の違い&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用語&lt;/th&gt;
&lt;th&gt;たとえ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;デジタル署名&lt;/td&gt;
&lt;td&gt;ハンコ&lt;/td&gt;
&lt;td&gt;データに対して、秘密鍵で署名する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デジタル証明書&lt;/td&gt;
&lt;td&gt;身分証・印鑑証明&lt;/td&gt;
&lt;td&gt;公開鍵が誰のものかをCAが証明する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;デジタル署名は、メッセージやファイルなどのデータに対する署名である。&lt;/p&gt;
&lt;p&gt;デジタル証明書は、公開鍵と主体者の対応関係に対する証明である。&lt;/p&gt;
&lt;p&gt;ざっくり言うと、次の関係になる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;デジタル署名 = データに対して秘密鍵で作る署名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;デジタル証明書 = 公開鍵と主体者情報に対してCAが署名したもの
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="証明書だけでは中身は隠れない"&gt;証明書だけでは中身は隠れない&lt;/h3&gt;
&lt;p&gt;証明書は、公開鍵が誰のものかを確認するためのものだ。メッセージ本文を暗号化するものではない。&lt;/p&gt;
&lt;p&gt;そのため、通信では次のように複数の技術を組み合わせる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;証明書で相手の公開鍵を確認する。&lt;/li&gt;
&lt;li&gt;署名や証明書チェーンで相手を認証する。&lt;/li&gt;
&lt;li&gt;DH / ECDHで共有秘密を作る。&lt;/li&gt;
&lt;li&gt;KDFで共通鍵を導出する。&lt;/li&gt;
&lt;li&gt;AES-GCMやChaCha20-Poly1305などのAEADで通信内容を保護する。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="属性証明書"&gt;属性証明書&lt;/h2&gt;
&lt;p&gt;通常のX.509公開鍵証明書は、公開鍵と主体者の対応関係を証明する。&lt;/p&gt;
&lt;p&gt;一方、属性証明書は、主体者の権限や役割などの属性情報を証明するための証明書である。&lt;/p&gt;
&lt;p&gt;たとえば、「この利用者は管理者権限を持つ」「この主体は特定のロールに所属する」といった情報を、公開鍵証明書とは別に扱う考え方である。&lt;/p&gt;
&lt;p&gt;公開鍵証明書が「この公開鍵は誰のものか」を扱うのに対して、属性証明書は「その主体がどの属性を持つか」を扱う。&lt;/p&gt;
&lt;h2 id="否認防止"&gt;否認防止&lt;/h2&gt;
&lt;p&gt;デジタル署名には否認防止の効果がある。&lt;/p&gt;
&lt;p&gt;たとえば、A社がB社へ発注書を送る場面を考える。A社が発注書にデジタル署名し、B社がA社の公開鍵で署名を検証できたとする。&lt;/p&gt;
&lt;p&gt;このとき、B社は次のことを主張しやすくなる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;発注書は改ざんされていない&lt;/li&gt;
&lt;li&gt;A社の秘密鍵で署名された&lt;/li&gt;
&lt;li&gt;A社は後から「送っていない」と否認しにくい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし、現実の否認防止は署名アルゴリズムだけでは完結しない。秘密鍵の管理、証明書の有効性、失効確認、タイムスタンプ、運用ルールなども関係する。&lt;/p&gt;
&lt;h2 id="全体の流れ"&gt;全体の流れ&lt;/h2&gt;
&lt;p&gt;ここまでの話を、実際の通信に近い流れでまとめる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;暗号化で機密性を守る
&lt;ul&gt;
&lt;li&gt;メッセージを第三者に見られたくない場合、AESなどの共通鍵暗号で暗号化する。&lt;/li&gt;
&lt;li&gt;ただし、暗号化だけでは「改ざんされていないか」「誰が送ったのか」までは十分に確認できない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ハッシュで変更検知の材料を作る
&lt;ul&gt;
&lt;li&gt;ハッシュを使うと、データから固定長の値を作れる。&lt;/li&gt;
&lt;li&gt;ハッシュ値を信頼できる経路で受け取れるなら、データが変化していないか確認できる。&lt;/li&gt;
&lt;li&gt;ただし、攻撃者が本文とハッシュ値を両方差し替えられる場合、ハッシュだけでは不十分である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MACでメッセージ認証する
&lt;ul&gt;
&lt;li&gt;共有鍵を使ってMACを計算すれば、メッセージの完全性と、共有鍵を知っている相手から来たことを確認できる。&lt;/li&gt;
&lt;li&gt;ただし、MACは共有鍵方式であるため、第三者に対する否認防止には使いにくい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デジタル署名で第三者にも示せる署名を作る
&lt;ul&gt;
&lt;li&gt;デジタル署名を使えば、秘密鍵で署名を生成し、公開鍵で検証できる。&lt;/li&gt;
&lt;li&gt;これにより、完全性、公開鍵ベースの真正性、否認防止を実現できる。&lt;/li&gt;
&lt;li&gt;ただし、デジタル署名だけでは本文は隠れない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;証明書で公開鍵を信頼する
&lt;ul&gt;
&lt;li&gt;デジタル署名を検証するには公開鍵が必要である。&lt;/li&gt;
&lt;li&gt;しかし、その公開鍵が本当に本人のものか分からなければ、検証結果は信用できない。&lt;/li&gt;
&lt;li&gt;そこで、CAが署名したデジタル証明書を使い、公開鍵と主体者の対応関係を確認する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;鍵交換で通信ごとの共通鍵を作る&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;共通鍵暗号は高速だが、共通鍵をどう共有するかという問題がある。&lt;/li&gt;
&lt;li&gt;DH / ECDH鍵交換を使うと、共通鍵そのものを通信路に流さずに、双方で共有秘密を作れる。&lt;/li&gt;
&lt;li&gt;実際の通信では、公開鍵証明書で相手を認証し、ECDHEなどで共有秘密を作り、そこから導出した共通鍵でAEAD暗号化する、というハイブリッド方式がよく使われる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;暗号技術は、ひとつだけで全てを守るものではない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;機密性を守るなら、共通鍵暗号やAEADを使う&lt;/li&gt;
&lt;li&gt;完全性の確認材料を作るなら、ハッシュを使う&lt;/li&gt;
&lt;li&gt;共有鍵ベースで真正性も確認するなら、MACを使う&lt;/li&gt;
&lt;li&gt;第三者にも示せる署名が必要なら、デジタル署名を使う&lt;/li&gt;
&lt;li&gt;公開鍵の持ち主を確認するなら、デジタル証明書とPKIを使う&lt;/li&gt;
&lt;li&gt;通信ごとの鍵を安全に作るなら、DH / ECDH鍵交換を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ハッシュ、MAC、デジタル署名、証明書は似た場所に出てくるため混乱しやすい。&lt;/p&gt;
&lt;p&gt;しかし、見るべき軸はシンプル。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;使う技術&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;中身を隠したい&lt;/td&gt;
&lt;td&gt;暗号化、AEAD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;変わっていないか見たい&lt;/td&gt;
&lt;td&gt;ハッシュ、MAC、署名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共有鍵を知る相手か見たい&lt;/td&gt;
&lt;td&gt;MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;秘密鍵を持つ署名者か見たい&lt;/td&gt;
&lt;td&gt;デジタル署名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開鍵が本人のものか見たい&lt;/td&gt;
&lt;td&gt;デジタル証明書、PKI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共通鍵を通信ごとに作りたい&lt;/td&gt;
&lt;td&gt;DH / ECDH鍵交換&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この対応関係を押さえると、暗号技術の全体像がかなり見えやすくなる。&lt;/p&gt;
&lt;p&gt;そのうち、エンドツーエンドの暗号化やmTSLや秘密分散なども残す。&lt;/p&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc2104" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc2104&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc5116" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc5116&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc5280" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc5280&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc5755" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc5755&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc6749" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc6749&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc8446" target="_blank" rel="noopener"
&gt;https://datatracker.ietf.org/doc/html/rfc8446&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://csrc.nist.gov/pubs/sp/800/56/a/r3/final" target="_blank" rel="noopener"
&gt;https://csrc.nist.gov/pubs/sp/800/56/a/r3/final&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://csrc.nist.gov/news/2022/nist-transitioning-away-from-sha-1-for-all-apps" target="_blank" rel="noopener"
&gt;https://csrc.nist.gov/news/2022/nist-transitioning-away-from-sha-1-for-all-apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html" target="_blank" rel="noopener"
&gt;https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/business/executive/02.html" target="_blank" rel="noopener"
&gt;https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/business/executive/02.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tech.gmogshd.com/zkp1/" target="_blank" rel="noopener"
&gt;https://tech.gmogshd.com/zkp1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>