暗号には、「共通鍵暗号」「公開鍵暗号」「ハッシュ関数」の3つがあります。※ハッシュ関数を暗号に含めることには、議論がありますが。
1.共通鍵暗号
(1)共通鍵暗号について
・暗号する鍵と復号する鍵が同じである方式
・ZIPのパスワードで暗号化し、復号するのも共通鍵暗号。暗号化と復号が同じ鍵だから。
(2)シーザー(Caesar)暗号
・古くはシーザー(Caesar)暗号で、鍵となる値を13にするとROT13。※ROTはRotationの略
https://ja.wikipedia.org/wiki/ROT13
(3)CyberChef
❶CyberChefでROT13をやってみよう。
RecipeにROT13とし、Inputに変換したい文字を入れ、Recipeに処理を入れます。
https://gchq.github.io/CyberChef/
ROT13 Brute Forceを使うと、全てのパターン(26個)で実施してくれるので、CTF等で使うには便利でしょう。
❷Magic
Magicというのもあり、イイ感じに変換してくれる場合がある
たとえば、以下
72 101 108 108 111 --> hello
%E3%82%BD%E3%83%AB%E3%83%88 --> ソルト
2.ハッシュ関数
(1)ハッシュ関数
・暗号化の一つともいえる。ただし、不可逆性(元に戻せない)
・MD5やSHA-1など色々あるが、古い方式はコンピュータの進化により、解読される可能性が高い。SHA-256などをハッシュから元のデータを探す
・パスワードもハッシュ化して保存される。
ためしに、shadowファイルを見てみましょう。
cat /etc/shadow
・パスワードを暗号化しておらず、情報漏えいした事件も発生
https://xtech.nikkei.com/atcl/nxt/column/18/00001/01661/
(2)ソルト
・ソルト(塩)を付加することで、復元を難しくしている。
・パスワードのファイル(shadowファイル)で確認しましょう。(管理者でしかできないと思います)
#ユーザを作成。パスワードは同じ echo password | passwd --stdin user1 echo password | passwd --stdin user2 #しかし、ハッシュ値が変わっています。 cat /etc/shadow user1:$6$axBL.lN4$bVxFfRW./HXeVGOZrticDk94XZ6PNtKZ2V4AJXlqgxWpNrRla9./JwSxslhsmxUzeQ2SZ8HWyEcZLANNcsJ.h0:19374:0:99999:7::: user2:$6$5ziXSyug$bhnd/dTczpgeGxTKM6G2FKY5ZFRUZxWZ3oYOVidcSe8/cwbOk8q3n0fm1WeFAehrmqv4ZofasZ0cfgccw2UWs/:19374:0:99999:7:::
自分のパスワードをpasswdコマンドで変更し、shadowファイルの中身を比較してみよう。 ※事前にchmod o+r+x /etc/shadow として、一般ユーザがログを閲覧できるようにしています。(本当はやってはいけません)
①shadowファイルの内容をメモしておく
②PWを変える ※簡単なのはダメです。8文字以上の複雑なのを設定してください。
③PWを元に戻す
④shadowファイルの内容を確認し、元の値と比較。
[user20]$ passwd Changing password for user20. (current) UNIX password: #現在のパスワードを入れます。 New password: #新しいパスワードですが、辞書にない、8文字以上の複雑なパスワードを入れます。 Retype new password: passwd: all authentication tokens updated successfully. cat /etc/shadow
パスワードが同じでも、ソルトが違うので、違うハッシュ値になっているはずです。
また、ハッシュ値は、$を区切りとして、以下の順に並んでいます。
<ユーザ名>:$<ハッシュアルゴリズム>$<ソルト>$<ハッシュ値>
ハッシュアルゴリズムに関して、↑では$6とあるので、SHA-512でハッシュしていることがわかります。
ID | ハッシュアルゴリズム |
---|---|
$1 | MD5 |
$2a,$2b | Blowfish(Bcrpyt) |
$5 | SHA-256 |
$6 | SHA-512 |
余談ですが、上記の場合、パスワードは password であり、ソルトは $axBL.lN4 です。
cryptコマンドによって、crypt(パスワード、ソルト)の構文で実施すると、shadowファイルに記載されたハッシュ値が計算できます。
# perl -e 'print crypt("password", "\$6\$axBL.lN4");' $6$axBL.lN4$bVxFfRW./HXeVGOZrticDk94XZ6PNtKZ2V4AJXlqgxWpNrRla9./JwSxslhsmxUzeQ2SZ8HWyEcZLANNcsJ.h0
3.公開鍵暗号
・秘密鍵と公開鍵を使った暗号方式。
・RSA暗号がその代表
・RSAの仕組みは少し複雑です。
https://it-trend.jp/encryption/article/64-0056
4.エンコード
(1)エンコードについて
・エンコードとは、文字やデータをルールに基づき変換することです。
❶パーセントエンコーディング
URLやHTTPヘッダには日本語や「<」などが使えないので、ASCIIコードに変換します。さらに、パーセントエンコーディングしたことを示すために%を付けます。URLエンコーディングとも言われます。
文字 | ASCIIコード | パーセントエンコード |
---|---|---|
1 | 31 | 1 |
< | 3c | %3c |
/ | 2f | %2f |
たとえば、以下のURLをデコードすると、どうなるでしょうか。
https://west-sec.com/crypto#4%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89
❷BASE64エンコード
電子メールはもともと、ASCII文字を想定していて、日本語文字などは送れません。そこで、BASE64エンコードによって、英数記号と+、/に変換します。
たとえば、元データ west を、BASE64エンコードすると d2VzdA== になります。このように、最後に=が入ることがあるのがBASE64エンコードの特徴です。=は、文字埋めの処理です。
(2)エンコードツール
・エンコードは、Windowsのコマンドプロンプトから、標準のコマンドcertutilでもできます。まあ、Webツールを使うのが便利でしょう。たくさんのサイトがありますが、以下のCyberChefがCTF利用者には人気です。
https://gchq.github.io/CyberChef/
Inputに変換したい文字を入れ、Recipeに処理を入れます。複数の処理を入れることも可能です。
たとえば、UTF-16LE(Encoding Text)に変換して、Base64(To Base64)をする場合は、2つを並べます。すると、Outputに処理結果が表示されます。処理については、左上にSearchがあるので、そこで処理を検索すると便利です。
5.PKI
・PKIは、デジタル署名と、証明書の理解が必要です。
・WEST-SECの証明書を見てみましょう。
https://west-sec.com
証明書の階層から、署名したのはISRG(=Let’s Encrypt)、件名にwest-sec.comが
記載。また、サブジェクトの公開鍵をみると、west-sec.comの公開鍵がわかります。
さらに、SHA-256指紋というのが、ディジタル署名です。