プロジェクト

全般

プロフィール

CTF Crypto » 履歴 » バージョン 1

kanata, 2025/04/13 14:35
ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール

1 1 kanata
# CTF Crypto
2
3
{{rawhtml(<canvas id="map"></canvas><script src="/javascripts/pagemap.min.js"></script><script>pagemap(document.querySelector("#map"));</script>)}}
4
5
{{toc}}
6
7
# これを読む
8
9
ふるつき - CTF crypto 逆引き
10
https://furutsuki.hatenablog.com/entry/2021/03/16/095021
11
12
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです
13
http://elliptic-shiho.hatenablog.com/
14
15
# 神本(無料)
16
17
『クラウドを支えるこれからの暗号技術』
18
http://herumi.github.io/ango/
19
20
# 神ツール
21
22
あらゆるフォーマットのエンコード・デコード・暗号化・復号化ができる
23
24
CyberChef
25
https://gchq.github.io/CyberChef/
26
27
28
# Command gadgets
29
30
- 文字列操作でニッチなコマンド
31
32
rev tac
33
34
## xxd
35
36
指定のファイル(file.txt)を16進数表記にして、その結果を出力する。
37
38
```
39
xxd file.txt
40
```
41
42
上のコマンドで16進数表記にしたファイル(file.hex)を元に戻して、その結果を出力する。
43
44
```
45
xxd -r file.hex
46
```
47
48
2進数表記でも出力することができます。
49
50
```
51
xxd -b file.hex
52
```
53
54
文字列を16進数に変換する
55
56
```
57
echo "targetStr" | xxd -ps
58
```
59
60
16進数を文字列に変換する
61
62
```
63
echo "targetStr" | xxd -ps -r
64
```
65
66
xxd -p(-psでも可)でバイナリ→16進文字列、xxd -r -pでバイナリ文字列→バイナリに変換できます。
67
68
69
## bc
70
71
bc コマンドをつかうと、16進(任意の基数)での計算ができます
72
73
```
74
$ echo "obase=10;ibase=16;FF00+FF" | bc
75
65535
76
$ echo "obase=16;ibase=16;100*100*100-1" | bc
77
FFFFFF
78
$ echo "obase=2;ibase=16;F0-1" | bc
79
11101111
80
```
81
82
## bashでアルファベット順にn文字ずらした文字列を得る
83
84
例えば
85
1文字ずらしだとhello→ifmmp
86
2文字ずらしだとhello→jgnnq
87
みたいな感じ
88
1文字ずらしなら
89
90
```
91
echo "hello" | tr '[a-z]' '[b-za-a]'  
92
```
93
94
2文字ずらしなら
95
96
```
97
echo "hello" | tr '[a-z]' '[c-za-b]'
98
```
99
100
## 文字列⇔16進数表現⇔2進数表現
101
102
文字列→16進数表現
103
104
```
105
echo "ABC"|xxd
106
```
107
108
文字列→2進数表現
109
110
```
111
echo "ABC"|xxd -b
112
```
113
114
16進数表現→文字列
115
116
```
117
echo 4142434445464748 | xxd -ps -r
118
```
119
120
16進数表現→2進数表現
121
122
```
123
echo 4142434445 | xxd -ps -r|xxd -b
124
```
125
126
2進数表現→16進数表現
127
128
```
129
echo "obase=16; ibase=2; 010000010100001001000011010001000100010100001010" | bc
130
```
131
132
2進数表現→文字列
133
134
```
135
echo "obase=16; ibase=2; 010000010100001001000011010001000100010100001010" | bc|xxd -ps -r
136
```
137
138
## シェルスクリプト - 文字と数値の相互変換
139
140
```
141
#!/bin/sh
142
143
CHAR_ASCII=$1
144
CHAR_DIGIT=`printf "%d" \'$1`
145
146
CHAR_DIGIT=`expr ${CHAR_DIGIT} + 1`
147
148
printf "%b\n" $(printf '%s%x' '\x' ${CHAR_DIGIT})
149
```
150
151
## 10000 までの素数を出力するシェルスクリプト
152
153
```
154
seq 2 1000 | factor | awk 'NF==2{print $2}'
155
```
156
157
## 文字列を任意の値でXORするシェルスクリプト
158
159
```
160
#!/bin/sh
161
162
LIST=`echo $1|fold -s1`
163
164
for WORD in ${LIST}
165
do
166
167
# setting
168
CHAR_ASCII=$WORD
169
CHAR_DIGIT=`printf "%d" \'$CHAR_ASCII`
170
171
#XOR_CHAR_ASCII=$2
172
#XOR_CHAR_DIGIT=`printf "%d" \'$XOR_CHAR_ASCII`
173
XOR_CHAR_DIGIT=0x01
174
175
# proccesing
176
CHAR_DIGIT=`echo $(( ${CHAR_DIGIT} ^ ${XOR_CHAR_DIGIT} ))`
177
printf "%b" $(printf '%s%x' '\x' ${CHAR_DIGIT})
178
179
done
180
181
echo
182
183
exit 0
184
```
185
186
## XORSearch
187
188
http://blog.didierstevens.com/programs/xorsearch/ http://www.aldeid.com/wiki/XORSearch
189
190
ファイルをXORでブルートフォース。
191
192
```
193
$ ./xorsearch -i /data/tmp/getdown.exe http:
194
Found XOR 83 position 1800: http://1.234.27.146/pcfix.exe
195
```
196
197
ファイルをXORでブルートフォース。ヒットした値をファイルとして保存する。
198
199
```
200
$ ./xorsearch -i -s /data/tmp/getdown.exe http:
201
Found XOR 83 position 1800: http://1.234.27.146/pcfix.exe
202
$ strings /data/tmp/getdown.exe.XOR.83
203
[SNIP]
204
http://1.234.27.146/pcfix.exe
205
affid=23456732-34459
206
[SNIP]
207
```
208
209
## XORStrings
210
211
http://blog.didierstevens.com/programs/xorsearch/ 
212
213
XORでブルートフォースした時のASCII文字の分布を表示する。
214
215
```
216
./XORStrings a.out
217
```
218
219
XORでブルートフォースした時のASCII文字の分布を表示する。ついでに、検出した長い文字順にソート。一番長い文字列を出力する。
220
221
```
222
./XORStrings -m -d a.out
223
```
224
225
226
# Base N encoding
227
228
| 方式   | 使用される文字                                       | 参考 |
229
|--------|------------------------------------------------------|------|
230
| Base16 | 0123456789ABCDEF | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html)
231
| Base26 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 
232
| Base32 | ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 or 0123456789ABCDEFGHJKMNPQRSTVWXYZ | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html)
233
| Base36 | ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 |
234
| Base52 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz | 
235
| Base58 | 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz | Bitcoinに利用
236
| Base62 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 | JavaScriptの難読化等
237
| Base64 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ | [RFC4648](http://www5d.biglobe.ne.jp/stssk/rfc/rfc4648j.html)
238
| Base85(ASCII85) | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [85種類の文字記号](http://welovy.hatenablog.com/entry/2012/11/22/162959)  | AdobeのPostScriptやPDFファイルで利用
239
| Base91 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [91種類の文字記号](http://base91.sourceforge.net/) | SECCON CTF 2013 オンライン予選で出題
240
| Base92 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [92種類の文字記号](https://github.com/thenoviceoof/base92) | 
241
| Base94 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [94種類の文字記号](https://gist.github.com/iso2022jp/4054241) | 
242
| Base95 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+.... [95種類の文字記号](http://www.icerealm.org/FTR/?s=docs&p=base95) | 
243
| Base122 | UTF-8のテキスト変換方式 | [エンコード方式 base-122](http://postd.cc/base122/)
244
| base65536 | Unicodeの中から65536文字 | [github ferno/base65536](https://github.com/ferno/base65536)
245
246
## ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール
247
248
自作ツール。python2系。CentOSで動作確認済み。
249
250
attachment:base64_extraction.py
251
252
~~~python
253
#!/usr/bin/env python
254
# -*- coding: utf-8 -*-
255
256
# base64_extraction.sh ver 0.2
257
# 引数のファイルに含まれるbase64部分を抽出・デコードしてファイルに保存する
258
# 第一引数… 入力フィル名
259
# 第二引数… 指定した数値より短い文字列はBase64の変換対象にしない(default 16)
260
# 2016.08.06 kanata
261
262
import os
263
import sys
264
import base64
265
import commands
266
import traceback
267
268
def write_decorded_base64(decodeed_base64,out_file_base,file_offset):
269
    try :
270
        file_content=base64.b64decode(decodeed_base64)
271
    except :
272
        #print "Base64 error"
273
        return(1)
274
    file_name=out_file_base[0] + "_" +str(file_offset)
275
    out_fd = open(file_name, 'w+')
276
    out_fd.write(file_content)
277
    out_fd.close()
278
    analysis_file_type(file_name)
279
280
def analysis_file_type(file_name):
281
    # detect filename extension & rename
282
    if os.name == "posix":
283
        file_extention=commands.getoutput("file -i "+file_name+"|awk -F'/' '{print $NF}'|awk '{print $1}'|awk -F'-' '{print $NF}'|tr -d ';'")
284
    else:
285
        file_extention="dat"
286
    #print "Debug:"+file_extention
287
    new_file_name = file_name+"."+file_extention
288
    if os.path.exists(new_file_name):
289
        os.remove(new_file_name)
290
    os.rename(file_name, new_file_name)
291
    print "\t"+new_file_name
292
    return(0)
293
294
if __name__ == '__main__':
295
    allow_decord_length=16  # The strings length shoter than this number. The strings not base64 target.
296
    file_offset=0
297
    file_content=""
298
    state_base64=False   # True:in False:out
299
    i=0                  # counter
300
    base64_length=0      # for chek allow_decord_length
301
302
    if os.name != "posix":
303
        print "[WARNING] I wonder this is not work encode for base64 by my windows7 enviroment. Please compare encoded file content by other ways."
304
305
    if len(sys.argv) >= 2:
306
        in_file=sys.argv[1]
307
        out_file_base=os.path.splitext(os.path.basename(in_file))
308
        file_size=os.path.getsize(in_file)
309
    else:
310
        print "ex)"+sys.argv[0]+" [filename] [minimum base64 length]"
311
        sys.exit(1)
312
313
    if len(sys.argv) == 3 and sys.argv[2].isdigit():
314
        allow_decord_length=int(sys.argv[2])
315
316
    try :
317
        in_fd = open(in_file,'rb')
318
    except :
319
        print "file error"
320
321
    while 1 :
322
        b = in_fd.read(1)
323
324
        if b in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" : # base64対象文字列
325
            state_base64=True
326
            file_content = file_content + b
327
            base64_length=base64_length + 1
328
        elif b in "=":
329
            file_content = file_content + b
330
        elif b in "\n\r":
331
            pass
332
        elif b in "\\":
333
            b = in_fd.read(1)
334
            if b in "n":
335
                pass
336
                # TODO:2count \n are not pass
337
            else:
338
                if state_base64 and base64_length > allow_decord_length:
339
                    #print "Debug:"+file_content+" "+str(i)
340
                    # ファイル出力処理,ファイル命名処理 #
341
                    write_decorded_base64(file_content,out_file_base,i)
342
                state_base64=False
343
                file_content=""
344
                base64_length=0
345
        else:
346
            if state_base64 and base64_length > allow_decord_length:
347
                #print "Debug:"+file_content+" "+str(i)
348
                # ファイル出力処理,ファイル命名処理 #
349
                write_decorded_base64(file_content,out_file_base,i)
350
            state_base64=False
351
            file_content=""
352
            base64_length=0
353
        sys.stdout.write("\rchecking..."+str(i)+"/"+str(file_size))
354
        sys.stdout.flush()
355
        i = i + 1
356
357
        if i > file_size:
358
            break
359
    in_fd.close()
360
    sys.stdout.write("\r")
361
    sys.stdout.flush()
362
363
~~~
364
365
366
# 目Crypto
367
368
| 暗号         | 特徴                                                                       |
369
|--------------|----------------------------------------------------------------------------|
370
| 圧縮ファイル | 頻度解析を行うと0x00~0xffの値はほぼ均一に 0.4%程度 
371
| シーザー暗号 | 意味不明な文字列かつ英数字以外の文字がそれなりに英語の文章っぽい
372
| ADFGV暗号    | ADFGVの文字が目立つ。ADFGVX?暗号は必ずマトリックスが必要
373
| ADFGVX暗号   | ADFGV以外にXを含んでいるかどうか。ADFGVX?暗号は必ずマトリックスが必要
374
| Vigenere暗号 | 大文字だけor小文字だけかつ特定のパターンを繰り返しているように見える
375
| ポリュビオスの暗号表 | 111523...のように2つの数値がペアになっているように見える数列(偶数長) 隣り合う数値で一意に変換可能なため、アルファベットに変換して換字式ソルバに流す
376
| ピッグペン暗号 | L,>,<,コ,ロみたいな記号が読み取れる [これ](http://www.yoshikoquilt.com/pigpen.html)
377
| ガラケーのキーパッド | 改行で区切られていてそれぞれの行に0-9の数値
378
| Base64       | 大文字,小文字のアルファベットに加え,"_"と"/"の全部で64種類
379
| Base32       | 大文字と数字と=しか存在しない
380
381
CTF的 覚えておくべき暗号・攻撃とその見分け方 @elliptic_shiho先生
382
http://elliptic-shiho.xyz/slide/ctf-crypto-matome.pdf
383
384
385
386
# 古典暗号
387
388
## Portal
389
390
換字式暗号の解読
391
http://www.quipqiup.com/index.php http://www.blisstonia.com/software/WebDecrypto/index.php
392
http://rumkin.com/tools/cipher/cryptogram-solver.php
393
394
いろんな暗号デコーダのリンク一覧
395
http://rumkin.com/tools/cipher/
396
397
## シーザー暗号
398
399
シーザー暗号解読機
400
http://virtualseries.web.fc2.com/decode/caesar.html
401
402
Geocaching Toolbox - Caesar cipher (ROT13)
403
http://www.geocachingtoolbox.com/index.php?lang=en&page=caesarCipher
404
405
多言語シーザー暗号(Universal Caesar cipher)
406
http://anti.rosx.net/etc/tools/enc_caesar.php
407
408
## ROT13
409
410
ROT13
411
https://www.kazamiya.net/rot13
412
413
ワンラナーでも可能
414
415
```
416
$ python -c "print \"ABC\".encode('rot13')"
417
$ echo ABC | tr A-Za-z N-ZA-Mn-za-m
418
$ echo ABC | nkf -r
419
$ nkf -r text.txt
420
```
421
422
## ROT47
423
424
[Wikipedia ROT47](https://ja.wikipedia.org/wiki/ROT13#ROT47)
425
426
>ROT47 はROT13の変種で、基本的なアルファベットだけではなく、数字や他の多くの記号も変換する。ROT47はローテートするのにA-Zの範囲だけではなく、ASCIIで定義された文字コードのうちより広い範囲を用いる。
427
428
```
429
echo ABC | tr '!-~' 'P-~!-O'
430
```
431
432
Caesar cipher(ROT47を選択可能)
433
https://www.geocachingtoolbox.com/index.php?lang=en&page=caesarCipher
434
435
## Vigenere暗号(ヴィジュネル暗号)
436
437
Vigenere Solver
438
http://www.guballa.de/vigenere-solver
439
440
Vigenere Ciphers
441
http://rumkin.com/tools/cipher/vigenere.php
442
443
The Black Chamber - Vigenère Cracking Tool
444
http://www.simonsingh.net/The_Black_Chamber/vigenere_cracking_tool.html
445
446
ヴィジュネル暗号解読(鍵数を5ずつ増やして試していくこと)
447
http://smurfoncrack.com/pygenere/pygenere.php 
448
http://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx
449
450
>大文字だけor小文字だけかつ特定のパターンを繰り返しているように見える?
451
452
CrypTool
453
https://www.cryptool.org/en/
454
455
### Autokey暗号
456
457
Vigenere暗号の派生
458
459
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 古典暗号 - Beaufort暗号とAutokey暗号
460
http://elliptic-shiho.hatenablog.com/
461
462
### Beaufort暗号
463
464
Vigenere暗号の派生
465
466
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 古典暗号 - Beaufort暗号とAutokey暗号
467
http://elliptic-shiho.hatenablog.com/
468
469
## スキュタレー暗号
470
471
Scytale Cipher
472
http://www.dcode.fr/scytale-cipher
473
474
## アフィン暗号
475
476
アフィン暗号解読(ただ、文字数が十分にあれば、統計的推論が可能なので、 http://www.quipqiup.com で解ける)
477
http://rumkin.com/tools/cipher/affine.php http://www.dcode.fr/affine-cipher http://www.richkni.co.uk/php/crypta/affine.php
478
479
## ADFGVX暗号
480
481
ADFGVX encoder/decoder 
482
http://www.grasoft.be/geotools/ADFGVX.htm
483
484
>ADFGVの文字が目立つならADFGV or ADFGVX暗号
485
486
## エニグマ暗号
487
488
エニグマシミュレータ
489
http://enigmaco.de/enigma/enigma.html
490
491
## アナグラム
492
493
英語のアナグラムを作ってくれるWEBサービス
494
http://wordsmith.org/anagram/
495
496
## ポリュビオスの暗号表
497
498
ポリュビオスの暗号表
499
隣り合う数値で一意に変換可能なため、アルファベットに変換して換字式ソルバに流す
500
501
>111523...のように2つの数値がペアになっているように見える数列(偶数長)
502
503
## Merkle-Hellmanナップサック暗号
504
505
Wikipedia - Merkle-Hellmanナップサック暗号
506
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
507
508
509
510
511
512
# 最近の暗号
513
514
## 楕円暗号
515
516
## Paillier暗号
517
518
519
520
521
522
523
# DES暗号
524
525
詳解 DES暗号化アルゴリズム
526
http://07c00.com/hj/des.txt
527
528
# AES暗号
529
530
security etc... - Padding Oracle AttackによるCBC modeの暗号文解読と改ざん 
531
http://rintaro.hateblo.jp/entry/2017/12/31/174327
532
533
534
535
536
537
538
# RSA暗号
539
540
## 基礎的なこと
541
542
| openssl       | 要素 | 説明                     |
543
|---------------|------|--------------------------|
544
|               | m    | 平文(元のメッセージ)     |
545
|prime1,prime2  | p,q  | :十分大きい素数(p≠q)    |
546
| modulus       | n    | = pq                     |
547
|               | ϕ(n)| = euler(n) = (p−1)(q−1)  |
548
|publicExponent | e    | ϕ(n) 未満かつ e と ϕ(n) は互いに素(最大公約数が1)となるような自然数 |
549
|privateExponent| d    | 1 mod ϕ(n) となるような自然数 |
550
551
**暗号化**
552
553
>元をe乗して、nで割った余り(mod n)が暗号文となる。つまりaが元ならば a^e mod n 。
554
555
**復号**
556
557
>暗号文をd乗して、nで割った余り(mod n)がもとの値となる。つまりbが暗号文ならば b^d mod n 。
558
559
---
560
561
アリスがボブにメッセージ m を安全に送りたいとき
562
563
1. ボブは素数 p,q と, (p−1)(q−1) と互いに素な自然数 e を用意して, n=pq,d を計算する.
564
2. ボブは e,n を公開する.
565
3. アリスは m に対して memodn を計算してボブに送信する.
566
4. ここで第三者キャロルにアリスが送信した暗号文を盗み見られたとしても, d がわからないキャロルには暗号文を解読できない.
567
5. 暗号文を受け取った ボブは秘密鍵 d を用いて m を復元してメッセージを読む.
568
569
n=pqだけど、nからpとqを求めるのは現実的に無理(巨大な素数の素因数分解)という仕組み。
570
(鍵長が短ければ、pとqの算出が可能、40bitくらいだと解けちゃう。最近は2048bitの鍵長が一般的。)
571
572
## opensslでの諸操作
573
574
2048bitの秘密鍵の作例
575
576
```
577
$ openssl genrsa 2048 > private-key.pem
578
```
579
580
秘密鍵の参照
581
582
```
583
$ openssl rsa -text < private-key.pem
584
```
585
586
公開鍵の作成
587
588
```
589
$ openssl rsa -pubout < private-key.pem > public-key.pem
590
```
591
592
公開鍵の参照
593
594
```
595
$ openssl rsa -text -pubin < public-key.pem
596
```
597
598
暗号化
599
600
```
601
$ echo "HELLO" | openssl rsautl -encrypt -pubin -inkey public-key.pem > message
602
```
603
604
復号化
605
606
```
607
$ cat message | openssl rsautl -decrypt -inkey private-key.pem
608
```
609
610
## RSA暗号運用でやってはいけない n のこと 
611
612
{{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>)}}
613
614
## Wiener's Attack / Boneh-Durfee's low private exponent Attack
615
616
細かい数学の世界の説明は、苦手なので省略する。
617
要は、RSA公開鍵は
618
619
* n(2つの素数の積:Modulus)
620
* e(publicExponent)
621
622
という2つの要素があって、このeがやたらと大きいと(通常は、60000とかそんなオーダー)なぜかRSA暗号は破られる。
623
これを解説している日本語サイトってたぶん無いんだよね。。
624
625
opensslで、nからeが求められる(nはPEM形式である必要がある)
626
627
```
628
$ cat warmup-c6aa398e4f3e72bc2ea2742ae528ed79.pub
629
-----BEGIN PUBLIC KEY-----
630
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAQEDZxmNa1YU6VgTrdjyKkcX
631
vHK+HqvZM9G4aUT9t1uO0jC+YtfRtp0iIJXBKMhvggEuyxFhkf2dAYptAvhNsnvF
632
GiEwfchvS/dxxpHBQ+Wr5Um1vS1usaIf1icOfhtI/gYR+7LhsLNSTm9N6LTko0Xa
633
RKE96CW3JgjbbHxKQLeCZubIe7/e9rSDgdScRQeli81Ht21ktFkIsVi9frxNrLCx
634
z9bCwZV09A6y79Dp4Q3HAFytObyvUrnqw4czaNaQMcXnJGhKRPBo79HT3Altm11k
635
EeWL3uQ+RrmaDQSUudsoGVr5Aa/xMNSm4gPa0I2lf6fkAmKlutsqMj7aKLRGlqsw
636
XQKCAQEA85Wdl44C658G3vPzNdj4r9dgmVHdrGC3FLbCKvD6kS8hCzQga9JKlgHH
637
jfSgJ18Qf9OrVS2VBX65NOcb3c1wRcJLGFh7jI/PWt1MXYPwx3yU3JxQy+Q44rZ7
638
r9MWM7aq8XgdkMOtbwPQN7MyGAGyNUbUg+Z+JgZ/eyI0fdvAwtWSzoFMv138zBQU
639
N/FOCzmQ+IBh5fC65fAeP6cNsOlgXnz9V16cge/uxSnDP9kDeiD9is1ROsljd2gx
640
PmP5g4rjURzdCporUW8hSMjUdaNgoGNZRJc57s0lGrtCsBRXPkOfL6RXNVeyVpn/
641
wR5jHOjul1qG5+JyvPX3apNFA0j+Pw==
642
-----END PUBLIC KEY-----
643
$ cat warmup-c6aa398e4f3e72bc2ea2742ae528ed79.pub
644
Public-Key: (2050 bit)
645
Modulus:
646
    03:67:19:8d:6b:56:14:e9:58:13:ad:d8:f2:2a:47:
647
    17:bc:72:be:1e:ab:d9:33:d1:b8:69:44:fd:b7:5b:
648
    8e:d2:30:be:62:d7:d1:b6:9d:22:20:95:c1:28:c8:
649
    6f:82:01:2e:cb:11:61:91:fd:9d:01:8a:6d:02:f8:
650
    4d:b2:7b:c5:1a:21:30:7d:c8:6f:4b:f7:71:c6:91:
651
    c1:43:e5:ab:e5:49:b5:bd:2d:6e:b1:a2:1f:d6:27:
652
    0e:7e:1b:48:fe:06:11:fb:b2:e1:b0:b3:52:4e:6f:
653
    4d:e8:b4:e4:a3:45:da:44:a1:3d:e8:25:b7:26:08:
654
    db:6c:7c:4a:40:b7:82:66:e6:c8:7b:bf:de:f6:b4:
655
    83:81:d4:9c:45:07:a5:8b:cd:47:b7:6d:64:b4:59:
656
    08:b1:58:bd:7e:bc:4d:ac:b0:b1:cf:d6:c2:c1:95:
657
    74:f4:0e:b2:ef:d0:e9:e1:0d:c7:00:5c:ad:39:bc:
658
    af:52:b9:ea:c3:87:33:68:d6:90:31:c5:e7:24:68:
659
    4a:44:f0:68:ef:d1:d3:dc:09:6d:9b:5d:64:11:e5:
660
    8b:de:e4:3e:46:b9:9a:0d:04:94:b9:db:28:19:5a:
661
    f9:01:af:f1:30:d4:a6:e2:03:da:d0:8d:a5:7f:a7:
662
    e4:02:62:a5:ba:db:2a:32:3e:da:28:b4:46:96:ab:
663
    30:5d
664
Exponent:
665
    00:f3:95:9d:97:8e:02:eb:9f:06:de:f3:f3:35:d8:
666
    f8:af:d7:60:99:51:dd:ac:60:b7:14:b6:c2:2a:f0:
667
    fa:91:2f:21:0b:34:20:6b:d2:4a:96:01:c7:8d:f4:
668
    a0:27:5f:10:7f:d3:ab:55:2d:95:05:7e:b9:34:e7:
669
    1b:dd:cd:70:45:c2:4b:18:58:7b:8c:8f:cf:5a:dd:
670
    4c:5d:83:f0:c7:7c:94:dc:9c:50:cb:e4:38:e2:b6:
671
    7b:af:d3:16:33:b6:aa:f1:78:1d:90:c3:ad:6f:03:
672
    d0:37:b3:32:18:01:b2:35:46:d4:83:e6:7e:26:06:
673
    7f:7b:22:34:7d:db:c0:c2:d5:92:ce:81:4c:bf:5d:
674
    fc:cc:14:14:37:f1:4e:0b:39:90:f8:80:61:e5:f0:
675
    ba:e5:f0:1e:3f:a7:0d:b0:e9:60:5e:7c:fd:57:5e:
676
    9c:81:ef:ee:c5:29:c3:3f:d9:03:7a:20:fd:8a:cd:
677
    51:3a:c9:63:77:68:31:3e:63:f9:83:8a:e3:51:1c:
678
    dd:0a:9a:2b:51:6f:21:48:c8:d4:75:a3:60:a0:63:
679
    59:44:97:39:ee:cd:25:1a:bb:42:b0:14:57:3e:43:
680
    9f:2f:a4:57:35:57:b2:56:99:ff:c1:1e:63:1c:e8:
681
    ee:97:5a:86:e7:e2:72:bc:f5:f7:6a:93:45:03:48:
682
    fe:3f
683
$ 
684
```
685
686
eが異様に大きかったら、nとeからd(秘密鍵?)が求められる。
687
これを解くpythonスクリプトが公開されてる(参考を参照)
688
689
c,d,nが判れば、cから平文を複合できる。
690
pythonだと
691
692
```python
693
pow(c, d, n)
694
print("%0512x" %m).decode("hex")  
695
```
696
697
でいける。
698
699
----
700
参考 ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - Wiener's Attack
701
http://elliptic-shiho.hatenablog.com/entry/2015/12/18/205804
702
703
## weak rsa
704
705
768bitであればweak rsaと呼ばれている素因数分解に成功しているものなので適当に探すだけで解けたりする
706
707
320bitだったりするとゴリ押しできる
708
> msieveを使って、1.5h程度(corei7+32Gとかリソースを使えば)
709
710
## Common Modulus Attack
711
712
前提
713
714
* 複数のデータセットが与えられている
715
* 中でもeがそれぞれ違うけどもnが全部同じ時
716
717
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 RSA - Common Modulus Attack, 秘密鍵からの素因数分解
718
http://elliptic-shiho.hatenablog.com/entry/2015/12/14/043745
719
720
## Common Private Exponent Attack
721
722
dが共通で、n, eが異なる際に使用できる攻撃。
723
724
## Hastad's Broadcast Attack
725
726
前提
727
728
* 複数のデータセットが与えられている
729
* データセットの中でも全てのeが同じ、かつデータセットの数 = e
730
731
## Franklin-Reiter Related Message Attack
732
733
前提
734
735
* enc(m)とenc(m+1)が与えられる
736
* e, nが同じかつenc(m)とenc(am+b)が与えられている時
737
738
## Coppersmith's short pad Attack
739
740
そもそも、数式をここに表現できないww
741
742
Wikipedia - Coppersmith's Attack
743
https://en.wikipedia.org/wiki/Coppersmith's_Attack
744
745
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - 基礎 -> Coppersmith's short pad Attack
746
http://elliptic-shiho.hatenablog.com/entry/2015/11/12/182219
747
748
ムズ(><)
749
750
## Partial-key exposure Attack / High-bit known Attack
751
752
pの上位ビットの一部が判明している時、その一部のpを p˜ と書く。この時、|p˜−p|<N^1/4 が成立するならば、元のpを復元することができる。 Coppersmithの定理、Howgrave-Grahamの定理を使用する。
753
754
ムズ(><)
755
756
## factordb.com
757
758
素数のデータベース(素因数分解してくれる!)
759
http://www.factordb.com/
760
761
762
## 参考
763
764
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです - 公開鍵暗号 - RSA - 基礎
765
http://elliptic-shiho.hatenablog.com/entry/2015/11/12/182219
766
767
ろば電子が詰まっている - opensslでRSA暗号と遊ぶ
768
http://d.hatena.ne.jp/ozuma/20130510/1368114329
769
770
sekai013's blog - RSA暗号について雑にまとめた
771
http://sekai013.hatenablog.com/entry/2015/04/04/193447
772
773
A Python implementation of the Wiener attack on RSA public-key encryption scheme. 
774
https://github.com/pablocelayes/rsa-wiener-attack
775
776
Capture the Swag - BCTF 2015 - warmup - Crypto Challenge 
777
http://capturetheswag.blogspot.jp/2015/04/bctf-2015-warmup-crypto-challenge.html
778
779
詳解 RSA暗号化アルゴリズム
780
http://ruffnex.oc.to/kenji/xrea/rsa.txt
781
782
ius/rsatool
783
https://github.com/ius/rsatool
784
785
ももいろテクノロジー - PythonでPEM形式のRSA鍵を生成する方法のメモ
786
http://inaz2.hatenablog.com/entry/2016/02/11/162837
787
788
sonickun.log - BKPCTFのRSA暗号問題を解く
789
http://sonickun.hatenablog.com/entry/2016/03/23/220652
790
791
第0回 RSAへのAttack ~RSAってなに~
792
https://falconctf.hatenablog.com/entry/2019/09/30/212910
793
794
795
796
797
798
799
800
# Hash
801
802
## ハッシュ逆変換
803
804
CrackStation
805
https://crackstation.net/
806
807
MD5 decryption
808
http://md5decryption.com/
809
810
MD5逆変換
811
http://www.kiyori.co.jp/md5reverse/
812
813
MD5,SHA1逆変換
814
http://md5.rednoize.com/
815
816
MD5 SHA1 NTLM オンラインデータベース
817
http://www.hashkiller.co.uk/
818
819
Reverse MD5/SHA1 hash
820
https://isc.sans.edu/tools/reversehash.html
821
822
AES  DES  RC4  Rabbit TripleDes の複合(鍵が必要)
823
http://icloud.sakura.ne.jp/encrypt.html
824
825
Online Hash Crack(メルアド要るので注意)
826
http://www.onlinehashcrack.com/
827
828
sakurity(ハッシュの伸張攻撃 length-extension attack)
829
http://sakurity.com/lengthextension
830
831
## ハッシュ衝突 - Hash collision
832
833
ここらへん、まだ実践したことない
834
835
Single-block collision for MD5
836
https://marc-stevens.nl/research/md5-1block-collision/
837
838
hashcat & oclHashcat
839
https://hashcat.net/hashcat/ [利用例1](https://github.com/praetorian-inc/Hob0Rules) [利用例2](http://inaz2.hatenablog.com/entry/2016/05/20/011353)
840
841
HashClash - MD5やSHA-1ハッシュ値を衝突させるツール
842
https://github.com/cr-marcstevens/hashclash
843
844
GitHub - Simple hash-mining c library and its python binding. - md5とsha1を高速(標準ライブラリの少なくとも100倍速)に探索するpythonライブラリ
845
https://github.com/kmyk/libproofofwork
846
847
848
849
850
# デコード
851
852
データ変換ツール(BASE64, URLエンコード, HEX(16進ダンプ)
853
http://hogehoge.tk/tool/
854
855
文字列ジェネレーター(Base64,ROT13,CRC32,MIME,HTML,URL,Unicode)
856
http://lazesoftware.com/tool/strgen/
857
858
base64 Decoder
859
https://isc.sans.edu/tools/base64.html
860
861
URLエンコード、デコードのワンライナー
862
863
```
864
echo "http://hogeoge.com/encode?lang=ja&u=" | perl -MURI::Escape -lne 'print uri_escape($_)' 
865
echo "http%3A%2F%2Fhogeoge.com%2Fencode%3Flang%3Dja%26u%3D" | perl -MURI::Escape -lne 'print uri_unescape($_)'
866
```
867
868
日本語JPドメイン名のPunycode変換・逆変換
869
http://punycode.jp/
870
871
# バーコード
872
873
zbar
874
http://zbar.sourceforge.net/ [参考](https://qiita.com/labocho/items/11985fa376b867b8e9ff)
875
876
# QRコード
877
878
{{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>)}}
879
880
QRazyBox
881
https://merricx.github.io/qrazybox/
882
883
QRコード・バーコードデコーダー
884
http://zxing.org/w/decode.jspx
885
886
01のやつを貼り付けてボタン押すと QR コードを描くようにしたJavaScript
887
https://github.com/sekai013/ksnctf/tree/master/square_cipher
888
889
>参考:http://sekai013.hatenablog.com/entry/2015/04/06/220827
890
891
strong-qr-decoder - 強力なQRコード解析ツール(ただし、テキスト化が必要)
892
https://github.com/waidotto/strong-qr-decoder
893
894
こんな感じでテキスト化 参考:[ksnctf C92 write-up](https://qiita.com/arushiro/items/b063c9a7d82028ff9b49)
895
896
仕組みが分かれば、スマホなどいらぬ……ッ! 肉眼のみで解読するQRコード講座
897
http://nlab.itmedia.co.jp/nl/articles/1801/31/news008.html
898
899
Qiita - QRコードを人力で読み取る
900
https://qiita.com/amanao/items/b7c54a3c73a8301b2412
901
902
903
904
905
906
907
## 動画等で見え隠れするQRコード対策
908
909
### PhotoShopを使う方法
910
911
動画をPhotoshopで読み込んで,全レイヤーのモードを「比較(明)」で、できるらしい。
912
(自分は使った事ない)
913
914
### ffmpegとImageMagicを使う方法
915
916
フレームごとに切り出す
917
918
```
919
$ ffmpeg -i video.mp4k -f image2 %06d.jpg
920
$ ffmpeg -i video.mp4  -f image2 -vf fps=fps=1 out\video_%05d.jpg
921
```
922
923
合成
924
925
```
926
$ convert *.jpg -background none -compose lighten -flatten export.png
927
```
928
929
ImageMagicは、オプションが膨大にあるので、単に合成と言っても、多数のやり方があるっぽい。
930
931
```
932
$ convert *.png -evaluate-sequence max ../export.png
933
```
934
935
maxのほかにmeanとかminとかある。
936
937
### 動画差分
938
939
動画のフレームごとの差を求めて変化してた場合に保存するプログラム
940
https://github.com/teatime13/search_movie_diff
941
942
### 比較明合成
943
944
[SiriusComp](http://phaku.net/siriuscomp/)を使う
945
946
947
948
# 難解プログラミング言語
949
950
## Brainfuck
951
952
Brainfuck
953
http://ja.wikipedia.org/wiki/Brainfuck
954
955
Brainfuck言語オンラインツール 
956
https://sange.fi/esoteric/brainfuck/impl/interp/i.html
957
958
## Whitespace
959
960
Whitespace
961
http://ja.wikipedia.org/wiki/Whitespace
962
963
WS2JS convert Whitespace to JavaScript
964
http://ws2js.luilak.net/interpreter.html
965
966
## Malbolge
967
968
Malbolge
969
http://malbolge.doleczek.pl/
970
971
972
# zip crack
973
974
## brute force attacks
975
976
FCrackZip
977
http://oldhome.schmorp.de/marc/fcrackzip.html
978
979
Qiita - GPUでZIPパスワードを解析する
980
https://qiita.com/lumin/items/cf1e10cccfe5727f8180
981
982
macOSの暗号化zipファイルはパスワード無しで解凍できる
983
https://blog.nflabs.jp/entry/2021/10/06/095121
984
985
macOSの暗号化zipの話の続き
986
https://blog.nflabs.jp/entry/2021/12/22/094845
987
988
989
## zipファイルの既知平文攻撃
990
991
暗号化zipに含まれているファイルの一部が入手できるなら、既知平文攻撃が可能。
992
pkcrackを使う。
993
994
https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html
995
996
```
997
$ pkcrack -C [解読対象のzip] -c [平文1のファイル] -c [平文2のファイル] -P [平文をzipにしたもの] -p [平文1のファイル] -p [平文2のファイル] -d [出力先zipファイル名]
998
```
999
1000
オプションの意味は、以下
1001
1002
```
1003
-C [暗号化されたzipファイル]
1004
-c [暗号化されたzipファイルの中で平文がわかるファイル]
1005
-P [平文のファイルが入っている暗号化されていないzip]
1006
-p [平文のファイル]
1007
-d [出力先(復号したzipファイルの名前)]
1008
```
1009
1010
# ステガノグラフィ
1011
1012
Steghide
1013
http://steghide.sourceforge.net/
1014
1015
>jpegに仕込むやつ
1016
1017
spamに見せたステガノグラフィツール
1018
http://www.spammimic.com/decode.cgi
1019
1020
1021
1022
# その他の変換・逆変換
1023
1024
1025
みかか変換ツール
1026
http://tools.m-bsys.com/original_tooles/mikaka.php
1027
1028
>漢字混じりの入力は、 選択 + [変化] で平仮名に戻せる
1029
1030
1031
# Memo
1032
1033
CRYPTO TOOL PORTAL
1034
https://www.cryptool.org/en/
1035
1036
QR code generator for text terminals
1037
https://github.com/fumiyas/qrc
1038
1039
>指定されたテキストをQRコードにしてアスキーアートまたは Sixel で出力する qrc できた。qrcode-aa、qrcode-sixel(Ruby) を golangに移植したもの。Windows は AA 出力のみ対応。
1040
1041
プリンストン大学 CITP - MEMORY RESEARCH PROJECT SOURCE CODE
1042
https://citp.princeton.edu/research/memory/code/
1043
1044
>Memory imaging
1045
>>USB / PXE Imaging Tools	 	bios_memimage-1.2.tar.gz	  (sig)
1046
>>EFI Netboot Imaging Tools	 	efi_memimage-1.0.tar.gz	  (sig)
1047
1048
>Automatic key-finding
1049
>>AESKeyFinder	 	aeskeyfind-1.0.tar.gz	  (sig)
1050
>>RSAKeyFinder	 	rsakeyfind-1.0.tar.gz	  (sig)
1051
1052
>Error-correction for AES key schedules
1053
>>AESFix	 	aesfix-1.0.1.tar.gz	  (sig)
1054
1055
sonickun/ctf-crypto-writeups
1056
https://github.com/sonickun/ctf-crypto-writeups
1057
1058
>sonickunさんのCTFの暗号問題のWriteupをまとめた場所
1059
1060
GitLab - Keita Xagawa - Beyond-CTF-crypto
1061
https://gitlab.com/xagawa/Beyond-CTF-crypto
1062
1063
暗号の歴史と現代暗号の基礎理論(RSA, 楕円曲線)-前半-
1064
https://tech-blog.abeja.asia/entry/cryptographic-fundamental-theory-202304-1