プロジェクト

全般

プロフィール

CTF Crypto » 履歴 » リビジョン 3

リビジョン 2 (kanata, 2025/04/13 14:35) → リビジョン 3/4 (kanata, 2025/05/10 09:25)

{{>toc}} 

 # CTF Crypto 

 {{last_updated_at}} {{toc}} 

 # これを読む 

 ふるつき - CTF crypto 逆引き 
 https://furutsuki.hatenablog.com/entry/2021/03/16/095021 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです 
 http://elliptic-shiho.hatenablog.com/ 

 # 神本(無料) 

 『クラウドを支えるこれからの暗号技術』 
 http://herumi.github.io/ango/ 

 # 神ツール 

 あらゆるフォーマットのエンコード・デコード・暗号化・復号化ができる 

 CyberChef 
 https://gchq.github.io/CyberChef/ 


 # Command gadgets 

 - 文字列操作でニッチなコマンド 

 rev tac 

 ## xxd 

 指定のファイル(file.txt)を16進数表記にして、その結果を出力する。 

 ``` 
 xxd file.txt 
 ``` 

 上のコマンドで16進数表記にしたファイル(file.hex)を元に戻して、その結果を出力する。 

 ``` 
 xxd -r file.hex 
 ``` 

 2進数表記でも出力することができます。 

 ``` 
 xxd -b file.hex 
 ``` 

 文字列を16進数に変換する 

 ``` 
 echo "targetStr" | xxd -ps 
 ``` 

 16進数を文字列に変換する 

 ``` 
 echo "targetStr" | xxd -ps -r 
 ``` 

 xxd -p(-psでも可)でバイナリ→16進文字列、xxd -r -pでバイナリ文字列→バイナリに変換できます。 


 ## bc 

 bc コマンドをつかうと、16進(任意の基数)での計算ができます 

 ``` 
 $ echo "obase=10;ibase=16;FF00+FF" | bc 
 65535 
 $ echo "obase=16;ibase=16;100*100*100-1" | bc 
 FFFFFF 
 $ echo "obase=2;ibase=16;F0-1" | bc 
 11101111 
 ``` 

 ## bashでアルファベット順にn文字ずらした文字列を得る 

 例えば 
 1文字ずらしだとhello→ifmmp 
 2文字ずらしだとhello→jgnnq 
 みたいな感じ 
 1文字ずらしなら 

 ``` 
 echo "hello" | tr '[a-z]' '[b-za-a]'   
 ``` 

 2文字ずらしなら 

 ``` 
 echo "hello" | tr '[a-z]' '[c-za-b]' 
 ``` 

 ## 文字列⇔16進数表現⇔2進数表現 

 文字列→16進数表現 

 ``` 
 echo "ABC"|xxd 
 ``` 

 文字列→2進数表現 

 ``` 
 echo "ABC"|xxd -b 
 ``` 

 16進数表現→文字列 

 ``` 
 echo 4142434445464748 | xxd -ps -r 
 ``` 

 16進数表現→2進数表現 

 ``` 
 echo 4142434445 | xxd -ps -r|xxd -b 
 ``` 

 2進数表現→16進数表現 

 ``` 
 echo "obase=16; ibase=2; 010000010100001001000011010001000100010100001010" | bc 
 ``` 

 2進数表現→文字列 

 ``` 
 echo "obase=16; ibase=2; 010000010100001001000011010001000100010100001010" | bc|xxd -ps -r 
 ``` 

 ## シェルスクリプト - 文字と数値の相互変換 

 ``` 
 #!/bin/sh 

 CHAR_ASCII=$1 
 CHAR_DIGIT=`printf "%d" \'$1` 

 CHAR_DIGIT=`expr ${CHAR_DIGIT} + 1` 

 printf "%b\n" $(printf '%s%x' '\x' ${CHAR_DIGIT}) 
 ``` 

 ## 10000 までの素数を出力するシェルスクリプト 

 ``` 
 seq 2 1000 | factor | awk 'NF==2{print $2}' 
 ``` 

 ## 文字列を任意の値でXORするシェルスクリプト 

 ``` 
 #!/bin/sh 

 LIST=`echo $1|fold -s1` 

 for WORD in ${LIST} 
 do 

 # setting 
 CHAR_ASCII=$WORD 
 CHAR_DIGIT=`printf "%d" \'$CHAR_ASCII` 

 #XOR_CHAR_ASCII=$2 
 #XOR_CHAR_DIGIT=`printf "%d" \'$XOR_CHAR_ASCII` 
 XOR_CHAR_DIGIT=0x01 

 # proccesing 
 CHAR_DIGIT=`echo $(( ${CHAR_DIGIT} ^ ${XOR_CHAR_DIGIT} ))` 
 printf "%b" $(printf '%s%x' '\x' ${CHAR_DIGIT}) 

 done 

 echo 

 exit 0 
 ``` 

 ## XORSearch 

 http://blog.didierstevens.com/programs/xorsearch/ http://www.aldeid.com/wiki/XORSearch 

 ファイルをXORでブルートフォース。 

 ``` 
 $ ./xorsearch -i /data/tmp/getdown.exe http: 
 Found XOR 83 position 1800: http://1.234.27.146/pcfix.exe 
 ``` 

 ファイルをXORでブルートフォース。ヒットした値をファイルとして保存する。 

 ``` 
 $ ./xorsearch -i -s /data/tmp/getdown.exe http: 
 Found XOR 83 position 1800: http://1.234.27.146/pcfix.exe 
 $ strings /data/tmp/getdown.exe.XOR.83 
 [SNIP] 
 http://1.234.27.146/pcfix.exe 
 affid=23456732-34459 
 [SNIP] 
 ``` 

 ## XORStrings 

 http://blog.didierstevens.com/programs/xorsearch/  

 XORでブルートフォースした時のASCII文字の分布を表示する。 

 ``` 
 ./XORStrings a.out 
 ``` 

 XORでブルートフォースした時のASCII文字の分布を表示する。ついでに、検出した長い文字順にソート。一番長い文字列を出力する。 

 ``` 
 ./XORStrings -m -d a.out 
 ``` 


 # Base N encoding 

 | 方式     | 使用される文字                                         | 参考 | 
 |--------|------------------------------------------------------|------| 
 | Base16 | 0123456789ABCDEF | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html) 
 | Base26 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |  
 | Base32 | ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 or 0123456789ABCDEFGHJKMNPQRSTVWXYZ | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html) 
 | Base36 | ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 | 
 | Base52 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |  
 | Base58 | 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz | Bitcoinに利用 
 | Base62 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 | JavaScriptの難読化等 
 | Base64 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html) 
 | Base85(ASCII85) | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [85種類の文字記号](http://welovy.hatenablog.com/entry/2012/11/22/162959)    | AdobeのPostScriptやPDFファイルで利用 
 | Base91 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [91種類の文字記号](http://base91.sourceforge.net/) | SECCON CTF 2013 オンライン予選で出題 
 | Base92 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [92種類の文字記号](https://github.com/thenoviceoof/base92) |  
 | Base94 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [94種類の文字記号](https://gist.github.com/iso2022jp/4054241) |  
 | Base95 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [95種類の文字記号](http://www.icerealm.org/FTR/?s=docs&p=base95) |  
 | Base122 | UTF-8のテキスト変換方式 | [エンコード方式 base-122](http://postd.cc/base122/) 
 | base65536 | Unicodeの中から65536文字 | [github ferno/base65536](https://github.com/ferno/base65536) 

 ## ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール 

 自作ツール。python2系。CentOSで動作確認済み。 

 attachment:base64_extraction.py 

 ~~~python 
 #!/usr/bin/env python 
 # -*- coding: utf-8 -*- 

 # base64_extraction.sh ver 0.2 
 # 引数のファイルに含まれるbase64部分を抽出・デコードしてファイルに保存する 
 # 第一引数… 入力フィル名 
 # 第二引数… 指定した数値より短い文字列はBase64の変換対象にしない(default 16) 
 # 2016.08.06 kanata 

 import os 
 import sys 
 import base64 
 import commands 
 import traceback 

 def write_decorded_base64(decodeed_base64,out_file_base,file_offset): 
     try : 
         file_content=base64.b64decode(decodeed_base64) 
     except : 
         #print "Base64 error" 
         return(1) 
     file_name=out_file_base[0] + "_" +str(file_offset) 
     out_fd = open(file_name, 'w+') 
     out_fd.write(file_content) 
     out_fd.close() 
     analysis_file_type(file_name) 

 def analysis_file_type(file_name): 
     # detect filename extension & rename 
     if os.name == "posix": 
         file_extention=commands.getoutput("file -i "+file_name+"|awk -F'/' '{print $NF}'|awk '{print $1}'|awk -F'-' '{print $NF}'|tr -d ';'") 
     else: 
         file_extention="dat" 
     #print "Debug:"+file_extention 
     new_file_name = file_name+"."+file_extention 
     if os.path.exists(new_file_name): 
         os.remove(new_file_name) 
     os.rename(file_name, new_file_name) 
     print "\t"+new_file_name 
     return(0) 

 if __name__ == '__main__': 
     allow_decord_length=16    # The strings length shoter than this number. The strings not base64 target. 
     file_offset=0 
     file_content="" 
     state_base64=False     # True:in False:out 
     i=0                    # counter 
     base64_length=0        # for chek allow_decord_length 

     if os.name != "posix": 
         print "[WARNING] I wonder this is not work encode for base64 by my windows7 enviroment. Please compare encoded file content by other ways." 

     if len(sys.argv) >= 2: 
         in_file=sys.argv[1] 
         out_file_base=os.path.splitext(os.path.basename(in_file)) 
         file_size=os.path.getsize(in_file) 
     else: 
         print "ex)"+sys.argv[0]+" [filename] [minimum base64 length]" 
         sys.exit(1) 

     if len(sys.argv) == 3 and sys.argv[2].isdigit(): 
         allow_decord_length=int(sys.argv[2]) 

     try : 
         in_fd = open(in_file,'rb') 
     except : 
         print "file error" 

     while 1 : 
         b = in_fd.read(1) 

         if b in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" : # base64対象文字列 
             state_base64=True 
             file_content = file_content + b 
             base64_length=base64_length + 1 
         elif b in "=": 
             file_content = file_content + b 
         elif b in "\n\r": 
             pass 
         elif b in "\\": 
             b = in_fd.read(1) 
             if b in "n": 
                 pass 
                 # TODO:2count \n are not pass 
             else: 
                 if state_base64 and base64_length > allow_decord_length: 
                     #print "Debug:"+file_content+" "+str(i) 
                     # ファイル出力処理,ファイル命名処理 # 
                     write_decorded_base64(file_content,out_file_base,i) 
                 state_base64=False 
                 file_content="" 
                 base64_length=0 
         else: 
             if state_base64 and base64_length > allow_decord_length: 
                 #print "Debug:"+file_content+" "+str(i) 
                 # ファイル出力処理,ファイル命名処理 # 
                 write_decorded_base64(file_content,out_file_base,i) 
             state_base64=False 
             file_content="" 
             base64_length=0 
         sys.stdout.write("\rchecking..."+str(i)+"/"+str(file_size)) 
         sys.stdout.flush() 
         i = i + 1 

         if i > file_size: 
             break 
     in_fd.close() 
     sys.stdout.write("\r") 
     sys.stdout.flush() 

 ~~~ 


 # 目Crypto 

 | 暗号           | 特徴                                                                         | 
 |--------------|----------------------------------------------------------------------------| 
 | 圧縮ファイル | 頻度解析を行うと0x00~0xffの値はほぼ均一に 0.4%程度  
 | シーザー暗号 | 意味不明な文字列かつ英数字以外の文字がそれなりに英語の文章っぽい 
 | ADFGV暗号      | ADFGVの文字が目立つ。ADFGVX?暗号は必ずマトリックスが必要 
 | ADFGVX暗号     | ADFGV以外にXを含んでいるかどうか。ADFGVX?暗号は必ずマトリックスが必要 
 | Vigenere暗号 | 大文字だけor小文字だけかつ特定のパターンを繰り返しているように見える 
 | ポリュビオスの暗号表 | 111523...のように2つの数値がペアになっているように見える数列(偶数長) 隣り合う数値で一意に変換可能なため、アルファベットに変換して換字式ソルバに流す 
 | ピッグペン暗号 | L,>,<,コ,ロみたいな記号が読み取れる [これ](http://www.yoshikoquilt.com/pigpen.html) 
 | ガラケーのキーパッド | 改行で区切られていてそれぞれの行に0-9の数値 
 | Base64         | 大文字,小文字のアルファベットに加え,"_"と"/"の全部で64種類 
 | Base32         | 大文字と数字と=しか存在しない 

 CTF的 覚えておくべき暗号・攻撃とその見分け方 @elliptic_shiho先生 
 http://elliptic-shiho.xyz/slide/ctf-crypto-matome.pdf 



 # 古典暗号 

 ## Portal 

 換字式暗号の解読 
 http://www.quipqiup.com/index.php http://www.blisstonia.com/software/WebDecrypto/index.php 
 http://rumkin.com/tools/cipher/cryptogram-solver.php 

 いろんな暗号デコーダのリンク一覧 
 http://rumkin.com/tools/cipher/ 

 ## シーザー暗号 

 シーザー暗号解読機 
 http://virtualseries.web.fc2.com/decode/caesar.html 

 Geocaching Toolbox - Caesar cipher (ROT13) 
 http://www.geocachingtoolbox.com/index.php?lang=en&page=caesarCipher 

 多言語シーザー暗号(Universal Caesar cipher) 
 http://anti.rosx.net/etc/tools/enc_caesar.php 

 ## ROT13 

 ROT13 
 https://www.kazamiya.net/rot13 

 ワンラナーでも可能 

 ``` 
 $ python -c "print \"ABC\".encode('rot13')" 
 $ echo ABC | tr A-Za-z N-ZA-Mn-za-m 
 $ echo ABC | nkf -r 
 $ nkf -r text.txt 
 ``` 

 ## ROT47 

 [Wikipedia ROT47](https://ja.wikipedia.org/wiki/ROT13#ROT47) 

 >ROT47 はROT13の変種で、基本的なアルファベットだけではなく、数字や他の多くの記号も変換する。ROT47はローテートするのにA-Zの範囲だけではなく、ASCIIで定義された文字コードのうちより広い範囲を用いる。 

 ``` 
 echo ABC | tr '!-~' 'P-~!-O' 
 ``` 

 Caesar cipher(ROT47を選択可能) 
 https://www.geocachingtoolbox.com/index.php?lang=en&page=caesarCipher 

 ## Vigenere暗号(ヴィジュネル暗号) 

 Vigenere Solver 
 http://www.guballa.de/vigenere-solver 

 Vigenere Ciphers 
 http://rumkin.com/tools/cipher/vigenere.php 

 The Black Chamber - Vigenère Cracking Tool 
 http://www.simonsingh.net/The_Black_Chamber/vigenere_cracking_tool.html 

 ヴィジュネル暗号解読(鍵数を5ずつ増やして試していくこと) 
 http://smurfoncrack.com/pygenere/pygenere.php  
 http://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx 

 >大文字だけor小文字だけかつ特定のパターンを繰り返しているように見える? 

 CrypTool 
 https://www.cryptool.org/en/ 

 ### Autokey暗号 

 Vigenere暗号の派生 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 古典暗号 - Beaufort暗号とAutokey暗号 
 http://elliptic-shiho.hatenablog.com/ 

 ### Beaufort暗号 

 Vigenere暗号の派生 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 古典暗号 - Beaufort暗号とAutokey暗号 
 http://elliptic-shiho.hatenablog.com/ 

 ## スキュタレー暗号 

 Scytale Cipher 
 http://www.dcode.fr/scytale-cipher 

 ## アフィン暗号 

 アフィン暗号解読(ただ、文字数が十分にあれば、統計的推論が可能なので、 http://www.quipqiup.com で解ける) 
 http://rumkin.com/tools/cipher/affine.php http://www.dcode.fr/affine-cipher http://www.richkni.co.uk/php/crypta/affine.php 

 ## ADFGVX暗号 

 ADFGVX encoder/decoder  
 http://www.grasoft.be/geotools/ADFGVX.htm 

 >ADFGVの文字が目立つならADFGV or ADFGVX暗号 

 ## エニグマ暗号 

 エニグマシミュレータ 
 http://enigmaco.de/enigma/enigma.html 

 ## アナグラム 

 英語のアナグラムを作ってくれるWEBサービス 
 http://wordsmith.org/anagram/ 

 ## ポリュビオスの暗号表 

 ポリュビオスの暗号表 
 隣り合う数値で一意に変換可能なため、アルファベットに変換して換字式ソルバに流す 

 >111523...のように2つの数値がペアになっているように見える数列(偶数長) 

 ## Merkle-Hellmanナップサック暗号 

 Wikipedia - Merkle-Hellmanナップサック暗号 
 https://ja.wikipedia.org/wiki/Merkle-Hellman%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E6%9A%97%E5%8F%B7 





 # 最近の暗号 

 ## 楕円暗号 

 ## Paillier暗号 






 # DES暗号 

 詳解 DES暗号化アルゴリズム 
 http://07c00.com/hj/des.txt 

 # AES暗号 

 security etc... - Padding Oracle AttackによるCBC modeの暗号文解読と改ざん  
 http://rintaro.hateblo.jp/entry/2017/12/31/174327 






 # RSA暗号 

 ## 基礎的なこと 

 | openssl         | 要素 | 説明                       | 
 |---------------|------|--------------------------| 
 |                 | m      | 平文(元のメッセージ)       | 
 |prime1,prime2    | p,q    | :十分大きい素数(p≠q)      | 
 | modulus         | n      | = pq                       | 
 |                 | ϕ(n)| = euler(n) = (p−1)(q−1)    | 
 |publicExponent | e      | ϕ(n) 未満かつ e と ϕ(n) は互いに素(最大公約数が1)となるような自然数 | 
 |privateExponent| d      | 1 mod ϕ(n) となるような自然数 | 

 **暗号化** 

 >元をe乗して、nで割った余り(mod n)が暗号文となる。つまりaが元ならば a^e mod n 。 

 **復号** 

 >暗号文をd乗して、nで割った余り(mod n)がもとの値となる。つまりbが暗号文ならば b^d mod n 。 

 --- 

 アリスがボブにメッセージ m を安全に送りたいとき 

 1. ボブは素数 p,q と, (p−1)(q−1) と互いに素な自然数 e を用意して, n=pq,d を計算する. 
 2. ボブは e,n を公開する. 
 3. アリスは m に対して memodn を計算してボブに送信する. 
 4. ここで第三者キャロルにアリスが送信した暗号文を盗み見られたとしても, d がわからないキャロルには暗号文を解読できない. 
 5. 暗号文を受け取った ボブは秘密鍵 d を用いて m を復元してメッセージを読む. 

 n=pqだけど、nからpとqを求めるのは現実的に無理(巨大な素数の素因数分解)という仕組み。 
 (鍵長が短ければ、pとqの算出が可能、40bitくらいだと解けちゃう。最近は2048bitの鍵長が一般的。) 

 ## opensslでの諸操作 

 2048bitの秘密鍵の作例 

 ``` 
 $ openssl genrsa 2048 > private-key.pem 
 ``` 

 秘密鍵の参照 

 ``` 
 $ openssl rsa -text < private-key.pem 
 ``` 

 公開鍵の作成 

 ``` 
 $ openssl rsa -pubout < private-key.pem > public-key.pem 
 ``` 

 公開鍵の参照 

 ``` 
 $ openssl rsa -text -pubin < public-key.pem 
 ``` 

 暗号化 

 ``` 
 $ echo "HELLO" | openssl rsautl -encrypt -pubin -inkey public-key.pem > message 
 ``` 

 復号化 

 ``` 
 $ cat message | openssl rsautl -decrypt -inkey private-key.pem 
 ``` 

 ## RSA暗号運用でやってはいけない n のこと  

 {{rawhtml(<iframe src="//www.slideshare.net/slideshow/embed_code/key/lbz9qv6fKMyDQS" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/sonickun/rsa-n-ssmjp" title="RSA暗号運用でやってはいけない n のこと #ssmjp" target="_blank">RSA暗号運用でやってはいけない n のこと #ssmjp</a> </strong> from <strong><a href="https://www.slideshare.net/sonickun" target="_blank">sonickun</a></strong> </div>)}} 

 ## Wiener's Attack / Boneh-Durfee's low private exponent Attack 

 細かい数学の世界の説明は、苦手なので省略する。 
 要は、RSA公開鍵は 

 * n(2つの素数の積:Modulus) 
 * e(publicExponent) 

 という2つの要素があって、このeがやたらと大きいと(通常は、60000とかそんなオーダー)なぜかRSA暗号は破られる。 
 これを解説している日本語サイトってたぶん無いんだよね。。 

 opensslで、nからeが求められる(nはPEM形式である必要がある) 

 ``` 
 $ cat warmup-c6aa398e4f3e72bc2ea2742ae528ed79.pub 
 -----BEGIN PUBLIC KEY----- 
 MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAQEDZxmNa1YU6VgTrdjyKkcX 
 vHK+HqvZM9G4aUT9t1uO0jC+YtfRtp0iIJXBKMhvggEuyxFhkf2dAYptAvhNsnvF 
 GiEwfchvS/dxxpHBQ+Wr5Um1vS1usaIf1icOfhtI/gYR+7LhsLNSTm9N6LTko0Xa 
 RKE96CW3JgjbbHxKQLeCZubIe7/e9rSDgdScRQeli81Ht21ktFkIsVi9frxNrLCx 
 z9bCwZV09A6y79Dp4Q3HAFytObyvUrnqw4czaNaQMcXnJGhKRPBo79HT3Altm11k 
 EeWL3uQ+RrmaDQSUudsoGVr5Aa/xMNSm4gPa0I2lf6fkAmKlutsqMj7aKLRGlqsw 
 XQKCAQEA85Wdl44C658G3vPzNdj4r9dgmVHdrGC3FLbCKvD6kS8hCzQga9JKlgHH 
 jfSgJ18Qf9OrVS2VBX65NOcb3c1wRcJLGFh7jI/PWt1MXYPwx3yU3JxQy+Q44rZ7 
 r9MWM7aq8XgdkMOtbwPQN7MyGAGyNUbUg+Z+JgZ/eyI0fdvAwtWSzoFMv138zBQU 
 N/FOCzmQ+IBh5fC65fAeP6cNsOlgXnz9V16cge/uxSnDP9kDeiD9is1ROsljd2gx 
 PmP5g4rjURzdCporUW8hSMjUdaNgoGNZRJc57s0lGrtCsBRXPkOfL6RXNVeyVpn/ 
 wR5jHOjul1qG5+JyvPX3apNFA0j+Pw== 
 -----END PUBLIC KEY----- 
 $ cat warmup-c6aa398e4f3e72bc2ea2742ae528ed79.pub 
 Public-Key: (2050 bit) 
 Modulus: 
     03:67:19:8d:6b:56:14:e9:58:13:ad:d8:f2:2a:47: 
     17:bc:72:be:1e:ab:d9:33:d1:b8:69:44:fd:b7:5b: 
     8e:d2:30:be:62:d7:d1:b6:9d:22:20:95:c1:28:c8: 
     6f:82:01:2e:cb:11:61:91:fd:9d:01:8a:6d:02:f8: 
     4d:b2:7b:c5:1a:21:30:7d:c8:6f:4b:f7:71:c6:91: 
     c1:43:e5:ab:e5:49:b5:bd:2d:6e:b1:a2:1f:d6:27: 
     0e:7e:1b:48:fe:06:11:fb:b2:e1:b0:b3:52:4e:6f: 
     4d:e8:b4:e4:a3:45:da:44:a1:3d:e8:25:b7:26:08: 
     db:6c:7c:4a:40:b7:82:66:e6:c8:7b:bf:de:f6:b4: 
     83:81:d4:9c:45:07:a5:8b:cd:47:b7:6d:64:b4:59: 
     08:b1:58:bd:7e:bc:4d:ac:b0:b1:cf:d6:c2:c1:95: 
     74:f4:0e:b2:ef:d0:e9:e1:0d:c7:00:5c:ad:39:bc: 
     af:52:b9:ea:c3:87:33:68:d6:90:31:c5:e7:24:68: 
     4a:44:f0:68:ef:d1:d3:dc:09:6d:9b:5d:64:11:e5: 
     8b:de:e4:3e:46:b9:9a:0d:04:94:b9:db:28:19:5a: 
     f9:01:af:f1:30:d4:a6:e2:03:da:d0:8d:a5:7f:a7: 
     e4:02:62:a5:ba:db:2a:32:3e:da:28:b4:46:96:ab: 
     30:5d 
 Exponent: 
     00:f3:95:9d:97:8e:02:eb:9f:06:de:f3:f3:35:d8: 
     f8:af:d7:60:99:51:dd:ac:60:b7:14:b6:c2:2a:f0: 
     fa:91:2f:21:0b:34:20:6b:d2:4a:96:01:c7:8d:f4: 
     a0:27:5f:10:7f:d3:ab:55:2d:95:05:7e:b9:34:e7: 
     1b:dd:cd:70:45:c2:4b:18:58:7b:8c:8f:cf:5a:dd: 
     4c:5d:83:f0:c7:7c:94:dc:9c:50:cb:e4:38:e2:b6: 
     7b:af:d3:16:33:b6:aa:f1:78:1d:90:c3:ad:6f:03: 
     d0:37:b3:32:18:01:b2:35:46:d4:83:e6:7e:26:06: 
     7f:7b:22:34:7d:db:c0:c2:d5:92:ce:81:4c:bf:5d: 
     fc:cc:14:14:37:f1:4e:0b:39:90:f8:80:61:e5:f0: 
     ba:e5:f0:1e:3f:a7:0d:b0:e9:60:5e:7c:fd:57:5e: 
     9c:81:ef:ee:c5:29:c3:3f:d9:03:7a:20:fd:8a:cd: 
     51:3a:c9:63:77:68:31:3e:63:f9:83:8a:e3:51:1c: 
     dd:0a:9a:2b:51:6f:21:48:c8:d4:75:a3:60:a0:63: 
     59:44:97:39:ee:cd:25:1a:bb:42:b0:14:57:3e:43: 
     9f:2f:a4:57:35:57:b2:56:99:ff:c1:1e:63:1c:e8: 
     ee:97:5a:86:e7:e2:72:bc:f5:f7:6a:93:45:03:48: 
     fe:3f 
 $  
 ``` 

 eが異様に大きかったら、nとeからd(秘密鍵?)が求められる。 
 これを解くpythonスクリプトが公開されてる(参考を参照) 

 c,d,nが判れば、cから平文を複合できる。 
 pythonだと 

 ```python 
 pow(c, d, n) 
 print("%0512x" %m).decode("hex")   
 ``` 

 でいける。 

 ---- 
 参考 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - Wiener's Attack 
 http://elliptic-shiho.hatenablog.com/entry/2015/12/18/205804 

 ## weak rsa 

 768bitであればweak rsaと呼ばれている素因数分解に成功しているものなので適当に探すだけで解けたりする 

 320bitだったりするとゴリ押しできる 
 > msieveを使って、1.5h程度(corei7+32Gとかリソースを使えば) 

 ## Common Modulus Attack 

 前提 

 * 複数のデータセットが与えられている 
 * 中でもeがそれぞれ違うけどもnが全部同じ時 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 RSA - Common Modulus Attack, 秘密鍵からの素因数分解 
 http://elliptic-shiho.hatenablog.com/entry/2015/12/14/043745 

 ## Common Private Exponent Attack 

 dが共通で、n, eが異なる際に使用できる攻撃。 

 ## Hastad's Broadcast Attack 

 前提 

 * 複数のデータセットが与えられている 
 * データセットの中でも全てのeが同じ、かつデータセットの数 = e 

 ## Franklin-Reiter Related Message Attack 

 前提 

 * enc(m)とenc(m+1)が与えられる 
 * e, nが同じかつenc(m)とenc(am+b)が与えられている時 

 ## Coppersmith's short pad Attack 

 そもそも、数式をここに表現できないww 

 Wikipedia - Coppersmith's Attack 
 https://en.wikipedia.org/wiki/Coppersmith's_Attack 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - 基礎 -> Coppersmith's short pad Attack 
 http://elliptic-shiho.hatenablog.com/entry/2015/11/12/182219 

 ムズ(><) 

 ## Partial-key exposure Attack / High-bit known Attack 

 pの上位ビットの一部が判明している時、その一部のpを p˜ と書く。この時、|p˜−p|<N^1/4 が成立するならば、元のpを復元することができる。 Coppersmithの定理、Howgrave-Grahamの定理を使用する。 

 ムズ(><) 

 ## factordb.com 

 素数のデータベース(素因数分解してくれる!) 
 http://www.factordb.com/ 


 ## 参考 

 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - 基礎 
 http://elliptic-shiho.hatenablog.com/entry/2015/11/12/182219 

 ろば電子が詰まっている - opensslでRSA暗号と遊ぶ 
 http://d.hatena.ne.jp/ozuma/20130510/1368114329 

 sekai013's blog - RSA暗号について雑にまとめた 
 http://sekai013.hatenablog.com/entry/2015/04/04/193447 

 A Python implementation of the Wiener attack on RSA public-key encryption scheme.  
 https://github.com/pablocelayes/rsa-wiener-attack 

 Capture the Swag - BCTF 2015 - warmup - Crypto Challenge  
 http://capturetheswag.blogspot.jp/2015/04/bctf-2015-warmup-crypto-challenge.html 

 詳解 RSA暗号化アルゴリズム 
 http://ruffnex.oc.to/kenji/xrea/rsa.txt 

 ius/rsatool 
 https://github.com/ius/rsatool 

 ももいろテクノロジー - PythonでPEM形式のRSA鍵を生成する方法のメモ 
 http://inaz2.hatenablog.com/entry/2016/02/11/162837 

 sonickun.log - BKPCTFのRSA暗号問題を解く 
 http://sonickun.hatenablog.com/entry/2016/03/23/220652 

 第0回 RSAへのAttack ~RSAってなに~ 
 https://falconctf.hatenablog.com/entry/2019/09/30/212910 







 # Hash 

 ## ハッシュ逆変換 

 CrackStation 
 https://crackstation.net/ 

 MD5 decryption 
 http://md5decryption.com/ 

 MD5逆変換 
 http://www.kiyori.co.jp/md5reverse/ 

 MD5,SHA1逆変換 
 http://md5.rednoize.com/ 

 MD5 SHA1 NTLM オンラインデータベース 
 http://www.hashkiller.co.uk/ 

 Reverse MD5/SHA1 hash 
 https://isc.sans.edu/tools/reversehash.html 

 AES    DES    RC4    Rabbit TripleDes の複合(鍵が必要) 
 http://icloud.sakura.ne.jp/encrypt.html 

 Online Hash Crack(メルアド要るので注意) 
 http://www.onlinehashcrack.com/ 

 sakurity(ハッシュの伸張攻撃 length-extension attack) 
 http://sakurity.com/lengthextension 

 ## ハッシュ衝突 - Hash collision 

 ここらへん、まだ実践したことない 

 Single-block collision for MD5 
 https://marc-stevens.nl/research/md5-1block-collision/ 

 hashcat & oclHashcat 
 https://hashcat.net/hashcat/ [利用例1](https://github.com/praetorian-inc/Hob0Rules) [利用例2](http://inaz2.hatenablog.com/entry/2016/05/20/011353) 

 HashClash - MD5やSHA-1ハッシュ値を衝突させるツール 
 https://github.com/cr-marcstevens/hashclash 

 GitHub - Simple hash-mining c library and its python binding. - md5とsha1を高速(標準ライブラリの少なくとも100倍速)に探索するpythonライブラリ 
 https://github.com/kmyk/libproofofwork 




 # デコード 

 データ変換ツール(BASE64, URLエンコード, HEX(16進ダンプ) 
 http://hogehoge.tk/tool/ 

 文字列ジェネレーター(Base64,ROT13,CRC32,MIME,HTML,URL,Unicode) 
 http://lazesoftware.com/tool/strgen/ 

 base64 Decoder 
 https://isc.sans.edu/tools/base64.html 

 URLエンコード、デコードのワンライナー 

 ``` 
 echo "http://hogeoge.com/encode?lang=ja&u=" | perl -MURI::Escape -lne 'print uri_escape($_)'  
 echo "http%3A%2F%2Fhogeoge.com%2Fencode%3Flang%3Dja%26u%3D" | perl -MURI::Escape -lne 'print uri_unescape($_)' 
 ``` 

 日本語JPドメイン名のPunycode変換・逆変換 
 http://punycode.jp/ 

 # バーコード 

 zbar 
 http://zbar.sourceforge.net/ [参考](https://qiita.com/labocho/items/11985fa376b867b8e9ff) 

 # QRコード 

 {{rawhtml(<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">How to read QR code. <a href="https://twitter.com/hashtag/qrcode?src=hash&amp;ref_src=twsrc%5Etfw">#qrcode</a> <a href="https://t.co/l7QiooASvU">pic.twitter.com/l7QiooASvU</a></p>&mdash; S Choe (@wireless_power) <a href="https://twitter.com/wireless_power/status/1051734876196503552?ref_src=twsrc%5Etfw">2018年10月15日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}} 

 QRazyBox 
 https://merricx.github.io/qrazybox/ 

 QRコード・バーコードデコーダー 
 http://zxing.org/w/decode.jspx 

 01のやつを貼り付けてボタン押すと QR コードを描くようにしたJavaScript 
 https://github.com/sekai013/ksnctf/tree/master/square_cipher 

 >参考:http://sekai013.hatenablog.com/entry/2015/04/06/220827 

 strong-qr-decoder - 強力なQRコード解析ツール(ただし、テキスト化が必要) 
 https://github.com/waidotto/strong-qr-decoder 

 こんな感じでテキスト化 参考:[ksnctf C92 write-up](https://qiita.com/arushiro/items/b063c9a7d82028ff9b49) 

 仕組みが分かれば、スマホなどいらぬ……ッ! 肉眼のみで解読するQRコード講座 
 http://nlab.itmedia.co.jp/nl/articles/1801/31/news008.html 

 Qiita - QRコードを人力で読み取る 
 https://qiita.com/amanao/items/b7c54a3c73a8301b2412 






 ## 動画等で見え隠れするQRコード対策 

 ### PhotoShopを使う方法 

 動画をPhotoshopで読み込んで,全レイヤーのモードを「比較(明)」で、できるらしい。 
 (自分は使った事ない) 

 ### ffmpegとImageMagicを使う方法 

 フレームごとに切り出す 

 ``` 
 $ ffmpeg -i video.mp4k -f image2 %06d.jpg 
 $ ffmpeg -i video.mp4    -f image2 -vf fps=fps=1 out\video_%05d.jpg 
 ``` 

 合成 

 ``` 
 $ convert *.jpg -background none -compose lighten -flatten export.png 
 ``` 

 ImageMagicは、オプションが膨大にあるので、単に合成と言っても、多数のやり方があるっぽい。 

 ``` 
 $ convert *.png -evaluate-sequence max ../export.png 
 ``` 

 maxのほかにmeanとかminとかある。 

 ### 動画差分 

 動画のフレームごとの差を求めて変化してた場合に保存するプログラム 
 https://github.com/teatime13/search_movie_diff 

 ### 比較明合成 

 [SiriusComp](http://phaku.net/siriuscomp/)を使う 



 # 難解プログラミング言語 

 ## Brainfuck 

 Brainfuck 
 http://ja.wikipedia.org/wiki/Brainfuck 

 Brainfuck言語オンラインツール  
 https://sange.fi/esoteric/brainfuck/impl/interp/i.html 

 ## Whitespace 

 Whitespace 
 http://ja.wikipedia.org/wiki/Whitespace 

 WS2JS convert Whitespace to JavaScript 
 http://ws2js.luilak.net/interpreter.html 

 ## Malbolge 

 Malbolge 
 http://malbolge.doleczek.pl/ 


 # zip crack 

 ## brute force attacks 

 FCrackZip 
 http://oldhome.schmorp.de/marc/fcrackzip.html 

 Qiita - GPUでZIPパスワードを解析する 
 https://qiita.com/lumin/items/cf1e10cccfe5727f8180 

 macOSの暗号化zipファイルはパスワード無しで解凍できる 
 https://blog.nflabs.jp/entry/2021/10/06/095121 

 macOSの暗号化zipの話の続き 
 https://blog.nflabs.jp/entry/2021/12/22/094845 


 ## zipファイルの既知平文攻撃 

 暗号化zipに含まれているファイルの一部が入手できるなら、既知平文攻撃が可能。 
 pkcrackを使う。 

 https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html 

 ``` 
 $ pkcrack -C [解読対象のzip] -c [平文1のファイル] -c [平文2のファイル] -P [平文をzipにしたもの] -p [平文1のファイル] -p [平文2のファイル] -d [出力先zipファイル名] 
 ``` 

 オプションの意味は、以下 

 ``` 
 -C [暗号化されたzipファイル] 
 -c [暗号化されたzipファイルの中で平文がわかるファイル] 
 -P [平文のファイルが入っている暗号化されていないzip] 
 -p [平文のファイル] 
 -d [出力先(復号したzipファイルの名前)] 
 ``` 

 # ステガノグラフィ 

 Steghide 
 http://steghide.sourceforge.net/ 

 >jpegに仕込むやつ 

 spamに見せたステガノグラフィツール 
 http://www.spammimic.com/decode.cgi 



 # その他の変換・逆変換 


 みかか変換ツール 
 http://tools.m-bsys.com/original_tooles/mikaka.php 

 >漢字混じりの入力は、 選択 + [変化] で平仮名に戻せる 


 # Memo 

 CRYPTO TOOL PORTAL 
 https://www.cryptool.org/en/ 

 QR code generator for text terminals 
 https://github.com/fumiyas/qrc 

 >指定されたテキストをQRコードにしてアスキーアートまたは Sixel で出力する qrc できた。qrcode-aa、qrcode-sixel(Ruby) を golangに移植したもの。Windows は AA 出力のみ対応。 

 プリンストン大学 CITP - MEMORY RESEARCH PROJECT SOURCE CODE 
 https://citp.princeton.edu/research/memory/code/ 

 >Memory imaging 
 >>USB / PXE Imaging Tools 	 	 bios_memimage-1.2.tar.gz 	   (sig) 
 >>EFI Netboot Imaging Tools 	 	 efi_memimage-1.0.tar.gz 	   (sig) 

 >Automatic key-finding 
 >>AESKeyFinder 	 	 aeskeyfind-1.0.tar.gz 	   (sig) 
 >>RSAKeyFinder 	 	 rsakeyfind-1.0.tar.gz 	   (sig) 

 >Error-correction for AES key schedules 
 >>AESFix 	 	 aesfix-1.0.1.tar.gz 	   (sig) 

 sonickun/ctf-crypto-writeups 
 https://github.com/sonickun/ctf-crypto-writeups 

 >sonickunさんのCTFの暗号問題のWriteupをまとめた場所 

 GitLab - Keita Xagawa - Beyond-CTF-crypto 
 https://gitlab.com/xagawa/Beyond-CTF-crypto 

 暗号の歴史と現代暗号の基礎理論(RSA, 楕円曲線)-前半- 
 https://tech-blog.abeja.asia/entry/cryptographic-fundamental-theory-202304-1