共通鍵暗号方式(AES <ECBモード>)
こんにちは、tangoです。
今回なんですが、共通鍵暗号方式(AES)について学習したので、簡易的にまとめてみました。
学習の目的としては、ECBモードの仕組みを理解することです。
前に、公開鍵暗号方式(RSA)について学習したんですが、共通鍵暗号方式(AES)はまだ学習してない&面白そうと思い、学習してみようと思いました。
ECBモードは、セキュリティ的に非推奨なのですが、他のモードの基礎となっているのではないかと思いECBモードにしました。
★共通鍵暗号方式とは
1つの鍵を用いて、暗号化と復号化を行う暗号方式のこと
★AES(ECBモード)の仕組み
【暗号化】
<Initial Round>
1.暗号化するデータと鍵データ[a][b]を排他的論理和で計算する(AddRoundKey)
<Main Rounds>(※9回繰り返して処理)
2.1で計算したデータをS-BOXを用いて変換する(SubBytes)
3.2で変換したデータの2段目⇒1個 3段目⇒2個 4段目⇒3個 左にシフトする(ShiftRows)
4.3でシフトしたデータをガロア体を用いて計算する(MixColumns)
5.4で計算したデータと鍵データ[a][b]を排他的論理和で計算する(AddRoundKey)
<Final Round>
6.5で計算したデータをS-BOXを用いて変換する(SubBytes)
7.6で変換したデータの2段目⇒1個 3段目⇒2個 4段目⇒3個 左にシフトする(ShiftRows)
8.7でシフトしたデータと鍵データ[a][b]を排他的論理和で計算する(AddRoundKey)
【復号化】
<Initial Round>
1.復号化するデータと鍵データ[a][b]を排他的論理和で計算する(InvAddRoundKey)
2.1で計算したデータの2段目⇒1個 3段目⇒2個 4段目⇒3個 右にシフトする(InvShiftRows)
3.2でシフトしたデータをInvS-BOXを用いて変換する(InvSubBytes)
<Main Rounds>(※4~7を9回繰り返し処理)
4.3で変換したデータと鍵データ[a][b]を排他的論理和で計算する(InvAddRoundKey)
5.4で計算したデータをガロア体を用いて計算する(InvMixColumns)
6.5で計算したデータの2段目⇒1個 3段目⇒2個 4段目⇒3個 右にシフトする(InvShiftRows)
7.6でシフトしたデータをInvS-BOXを用いて変換する(InvSubBytes)
<Final Round>
8.7で変換したデータと鍵データ[a][b]を排他的論理和で計算する(InvAddRoundKey)
【Key Schedule】(※16byteかつRound10の場合)
<Rot Word>
1.鍵データ[a][w]に[1][3]、[2][3]、[3][3]、[0][3]の順で格納する
<SubBytes>
2.1で格納したデータをS-BOXを用いて変換する
<RoundKey Create>(※Round10の場合は、3~4を10回繰り返し処理)
3.【鍵データ[a][w-4]】と【②で変換したデータ[a][w] 】と【Rcon[a][b]】を排他的論理和で計算する
4.新規の鍵データ[a][w]を作成するために【鍵データ[a][w-4]】と【鍵データ[a][w-1]】を排他的論理和で計算する
⇒各AddRoundごとに鍵データ[4][4]必要なので、鍵データ[4][4]になるまで4を繰り返し実行
⇒鍵データ[4][4]まで作成できたら、3に戻る
★MixColumns&InvMixColumns
・MixColumns&InvMixColumnsの計算方法
★ソースコード
ECBモードの仕組みを理解するために、実際にC言語でコードを書いてみました。
本来なら外部ライブラリーを用いた方がいいんですが、今回の目的は仕組みを理解するなので、外部ライブラリーを使わずに1からコードを書いてみました。
そのため、復号化はできるのですが完璧ではなく、ある条件が揃えば期待通り暗号化や復号化できなかったり、復号化後に半角スペースが入ったりとまだまだ改善していかないといけないんですが、仕組みを理解するのが目的だったので目的は達成できたかなと思います。
ですが、もっと完璧なコードを書きたいのでご指摘をして頂ければ幸いです。
★実行結果
<鍵が16Byteの場合>
・暗号化対象のデータ&共通鍵
・暗号化&復号化
<鍵が16Byte以外の場合>
・暗号化対象のデータ&共通鍵
・暗号化&復号化
共通鍵の値が16byteでない時は、エラーメッセージが表示され暗号化&復号化の処理が途中で強制終了するようにしました。
また、二重起動防止とエラーメッセージが常に最前面になるようにして、実行に制限をかけるようにしました。
以上が、共通鍵暗号方式(AES)の学習のまとめになります。
まだまだ甘いコードですが、実際にコードを書いてみてどういった流れで処理されているかが理解できました。
今回学んだ知識を今後も活かせるようにしっかり覚えておきたいと思います。
それでは今回はこの辺で終わりたいと思います。
みなさんのエンジニアライフに少しでもお役に立てれば幸いです。
ありがとうございました。
★概要欄
・Twitter
https://twitter.com/tango3564
・Instagram
https://www.instagram.com/tango3690/
・公開鍵暗号方式
https://note.com/tango9512357/n/n222d36448bf2
・MixColumns&InvMixColumnsの計算方法
https://github.com/tango3304/AES_ECB/tree/main/!%E8%A8%88%E7%AE%97%E5%BC%8F
・AES ECBモードのソースコード
https://github.com/tango3304/AES_ECB