まず例として、abcdefghijklの12文字を3文字ずつ取り出す(すなわち3文字ずつ区切って表示する)方法をpythonコードと共に解説。
3文字ずつ取り出すpythonコード
>>> s = 'abcdefghijkl'
>>> i = 0
>>> j = 3
>>> for _ in range(len(s) // 3):
... print(s[i:j])
... i += 3
... j += 3
...
abc
def
ghi
jkl
j
の初期値、range
の中の割る数、i
とj
のインクリメントに現れる3という数字は、3文字ずつ区切るというところから来てる。
32文字ずつ区切って表示する
『詳解セキュリティコンテスト CTFで学ぶ脆弱性攻略の技術』の16章。
16.5の「ECBモードに対する攻撃」で暗号文と平文の対応を調べるときに、その出力を32文字ずつ区切って考える場面がある。
暗号文を32文字ずつ区切るためのpythonスクリプトがこちら:
cutter.py
s = input('enter your strings> \n')
def main():
i, j = 0, 32
for _ in range(len(s) // 32):
print(s[i:j])
i += 32
j += 32
if __name__ == '__main__':
main()
このcutter.pyを以下のように使用する。
まず本書(p.278)に従ってecb_service.pyを実行して暗号文を得る:
$ python3 ecb_service.py
username> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
27fba2e9f5236c0fd21beac1e80cf5f23bfd04cc0d7ed55358e2cbe19de213833bfd04cc0d7ed55358e2cbe19de21383558a980bd73b36d0dda5ec6a496cff097ecb8c8420359d54f0d7699a1cfa4f8d
そして上で作成したcutter.pyスクリプトを実行し、得られた暗号文を標準入力として渡す:
$ python3 cutter.py
enter your strings>
27fba2e9f5236c0fd21beac1e80cf5f23bfd04cc0d7ed55358e2cbe19de213833bfd04cc0d7ed55358e2cbe19de21383558a980bd73b36d0dda5ec6a496cff097ecb8c8420359d54f0d7699a1cfa4f8d
27fba2e9f5236c0fd21beac1e80cf5f2
3bfd04cc0d7ed55358e2cbe19de21383
3bfd04cc0d7ed55358e2cbe19de21383
558a980bd73b36d0dda5ec6a496cff09
7ecb8c8420359d54f0d7699a1cfa4f8d
こうして32文字ずつ区切って表示することができた。
(同じ文字列”3bfd04cc0d7ed55358e2cbe19de21383”が現れていることも確認できる。)
※一次的に必要になりササっと書いたものなので改善の余地が大いにあります。
ちなみに文字数が偶数である文字列をの2文字ずつ区切るなら
In [1]: x = 'abcdef'
In [2]: for n in range(0, len(x) + 2, 2):
...: print(x[n-2:n])
...:
ab
cd
ef
# range関数の第三引数が肝
In [3]: for n in range(0, len(x), 2):
...: print(n)
...:
0
2
4