# 16章 共通鍵暗号(前半) 共通鍵暗号とは,暗号化と復号で使用する鍵が同じである暗号の種類を指す.英語の文献などでは「対称(鍵)暗号:Symmetric key cryptosysytem」と呼ぶ. ## 16.1 共通鍵暗号の種類 ### 16.1.1 DES DES(Data Encryption Standard)は1976年にアメリカで標準暗号として採用されたブロック暗号アルゴリズムである.暗号に使用する鍵の長さは**56ビット**と非常に短いため,現在は使われていない.(しかし,アメリカで標準化されたアルゴリズムということで,多くの研究者から攻撃の対象とされ,その結果多くの攻撃方法が考案された.) DESでは**Feistel構造**が採用されている.このFeistel構造は暗号化と復号で同じ回路を使うができるというメリットがあるため,回路設計と相性がよくFEALやCamelliaなどの他の暗号アルゴリズムでも採用されている.  (引用:https://atmarkit.itmedia.co.jp/ait/articles/1505/21/news030.html) 暗号化関数f()はFeistel構造の肝の部分だが,実は強度を問わなければどのような関数を使用したとしてもきちんと復号できる暗号となる.(逆に言うと,この関数をいかにうまく設計できるかが暗号の安全性に直結する.) DESでは,「鍵と入力値のXORをした後Sボックスと呼ばれる置き換え関数を用いてデータを撹拌するという」関数が使われている.  ### 16.1.2 AES AES(Advanced Encryption Standard)はDESの光景として公募で選出されたブロック暗号アルゴリズムである.元はRijndaelというアルゴリズムだったが,標準化によってAESと呼ばれるようになった.  AESの暗号化手順 (引用:https://xtech.nikkei.com/atcl/nxt/keyword/18/00002/030800119/) - **SubBytes**:Sボックスを使用し入力ブロックを1バイト単位で置き換える. - **ShiftRows**:入力ブロック内のデータをバイト単位で転置 - **MixColumns**:入力ブロック内のデータを4×4行列とみなして列ごとの操作をする - **AddRoundKey**:AESの鍵から算出されたラウンドごとの鍵をXORする. DESと異なり**SPN**(Substitution Permutation Network)という構造を使用している. SPN構造ではFeistel構造と異なり,復号のために各操作の逆関数を用意する必要がある. ### 16.1.3 RC4 RC4はRonald Rivestによって開発されたストリーム暗号である.これは公式に発表されたものではなく,インターネット上に流出した仕様が基となっている.(そのため,商標問題回避のためにARCFOUR(Allged RC4))と呼ばれる場合がある) RC4は鍵を内部状態に変換するKSAと,内部状態から暗号化用のXOR鍵を(鍵ストリーム)を出力するPRGAの2種類のアルゴリズムから成り立っている.C言語の疑似乱数アルゴリズムで例えると,KSAがsrandにPRGAがrandに相当する. RC4は既に脆弱性が報告されているため,現在では積極的に使用されることはない. ### 16.1.4 ChaCha20 ChaCha20は,D.J.Bernsteinによって2008年に開発されたストリーム暗号である.RC4の後継として期待されており,GoogleによりTLS通信の暗号規格として採用された後,RFC7539として標準化された. 現在主流のAESに比べて暗号化の処理がシンプルかつ高速であるという特徴を持つ. ## 16.2 パディング方式 ブロック暗号では固定長のメッセージの暗号化を行うため,その長さよりも短いメッセージを暗号化するときのルールが必要となる.パディングの手法はいくつかあるが,その中でも共通鍵暗号によく使われる2つを紹介する. ### 16.2.1 PKCS#7パディング PKCS#7パディングとは,PKCS(Public-Key Cryptography Standards)の7番として定められた,暗号メッセージ構文に関する仕様の中で言及されているパディング方式である. - 1ブロックのサイズを255バイトまでとし,ブロックサイズに満たない部分を足りないバイト数の値で埋める. - もしブロックサイズちょうどのデータが与えられた場合には,パディングのみで構成されるブロックを1つ追加する. - パディングを取り除くときには,末尾1バイトの値を確認しその値のバイト数分だけ末尾から削除する. ### 16.2.2 ゼロパディング ゼロパディングはブロックサイズになるまでNULバイトで埋めるパディング方法である.しかし,元々のデータの末尾がNULバイトだった場合に,どこまでがパディングなのかわからなくなるという欠点がある.(そのため,末尾がNULバイトになる可能性のあるデータには適していない) ## 16.3 ブロック暗号利用モード ブロックよりも長いメッセージを暗号化したいとき,ブロック暗号利用モードを用いる. ### 16.3.1 ECBモード ECB(Electronic CodeBlock)モードは,メッセージを分割してそのまま暗号化するという超シンプルな発想に基づいている. 平文のブロックが一致していれば暗号文のブロックも同じものが出力されてしまう,という特徴がある.(→16.5:ECBモードに対する攻撃)  (引用http://www.spiritek.co.jp/spkblog/2016/12/01/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%8004-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E6%9A%97%E5%8F%B7%E3%81%AE%E3%83%A2%E3%83%BC%E3%83%89%E3%80%9C%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF/) ### 16.3.2 CBCモード CBC(Cipher Block Chaining)モードは暗号化する前に平文を1つ前のブロックの暗号文とXORしてから暗号化する方式である. 最初の1ブロックについては1つ前のブロクが存在しないため,**IV**(初期化ベクトル)という値を用意する必要がある.IVは多くの場合ランダムなバイト列が使われる.また,IVは暗号文ブロックの一部と言えるので特に秘密にする必要はなく,暗号文と同じような取り扱いをする. CBCモードの暗号文を復号するためには,ブロック暗号で復号した後に,更に1つ前のブロックの暗号文とXORすることで平文に戻すことができる. ### 16.3.3 CTRモード CTR(CounTeR)モードは,Nonceというランダムな値とブロックごとにインクリメントするカウンタの2つの値から擬似乱数を出力することで,ブロック暗号をストリーム暗号として使う方式である. Nonceとカウンタを結合した文字列を暗号化し,出力された暗号文を鍵ストリームとして使う.平文でXORを取ったデータが暗号文となる. 復号するときは暗号化したときのNonceとカウンタをとって鍵ストリームを生成し,XORを取って復号する.つまり,暗号化と複合では処理自体は同じのまま,入力値だけが入れ替わったことになる.
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up