CTF Crypto¶
- CTF Crypto
- これを読む
- 神本(無料)
- 神ツール
- Command gadgets
- Base N encoding
- 目Crypto
- 古典暗号
- 最近の暗号
- DES暗号
- AES暗号
- RSA暗号
- 基礎的なこと
- opensslでの諸操作
- RSA暗号運用でやってはいけない n のこと
- Wiener's Attack / Boneh-Durfee's low private exponent Attack
- weak rsa
- Common Modulus Attack
- Common Private Exponent Attack
- Hastad's Broadcast Attack
- Franklin-Reiter Related Message Attack
- Coppersmith's short pad Attack
- Partial-key exposure Attack / High-bit known Attack
- factordb.com
- 参考
- Hash
- デコード
- バーコード
- QRコード
- 難解プログラミング言語
- zip crack
- ステガノグラフィ
- その他の変換・逆変換
- Memo
これを読む¶
ふるつき - 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 |
Base26 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | |
Base32 | ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 or 0123456789ABCDEFGHJKMNPQRSTVWXYZ | RFC4648 |
Base36 | ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 | |
Base52 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz | |
Base58 | 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz | Bitcoinに利用 |
Base62 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 | JavaScriptの難読化等 |
Base64 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ | RFC4648 |
Base85(ASCII85) | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... 85種類の文字記号 | AdobeのPostScriptやPDFファイルで利用 |
Base91 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... 91種類の文字記号 | SECCON CTF 2013 オンライン予選で出題 |
Base92 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... 92種類の文字記号 | |
Base94 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... 94種類の文字記号 | |
Base95 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... 95種類の文字記号 | |
Base122 | UTF-8のテキスト変換方式 | エンコード方式 base-122 |
base65536 | Unicodeの中から65536文字 | github ferno/base65536 |
ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール¶
自作ツール。python2系。CentOSで動作確認済み。
#!/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,>,<,コ,ロみたいな記号が読み取れる これ |
ガラケーのキーパッド | 改行で区切られていてそれぞれの行に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¶
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が元ならば ae mod n 。
復号
暗号文をd乗して、nで割った余り(mod n)がもとの値となる。つまりbが暗号文ならば bd mod n 。
アリスがボブにメッセージ m を安全に送りたいとき
- ボブは素数 p,q と, (p−1)(q−1) と互いに素な自然数 e を用意して, n=pq,d を計算する.
- ボブは e,n を公開する.
- アリスは m に対して memodn を計算してボブに送信する.
- ここで第三者キャロルにアリスが送信した暗号文を盗み見られたとしても, d がわからないキャロルには暗号文を解読できない.
- 暗号文を受け取った ボブは秘密鍵 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 のこと¶
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だと
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|<N1/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 利用例2
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/ 参考
QRコード¶
How to read QR code. #qrcode pic.twitter.com/l7QiooASvU
— S Choe (@wireless_power) 2018年10月15日
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
strong-qr-decoder - 強力なQRコード解析ツール(ただし、テキスト化が必要)
https://github.com/waidotto/strong-qr-decoder
こんな感じでテキスト化 参考:ksnctf C92 write-up
仕組みが分かれば、スマホなどいらぬ……ッ! 肉眼のみで解読する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を使う
難解プログラミング言語¶
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