ソースを参照

2016/5v2

master
Roderic Day 4年前
コミット
bb543d5f71
3個のファイルの変更16行の追加17行の削除
  1. +1
    -0
      .gitignore
  2. +7
    -4
      toolkit.py
  3. +8
    -13
      y2016/p05.py

+ 1
- 0
.gitignore ファイルの表示

@@ -1,4 +1,5 @@
*.dat
*.cache
__pycache__/
.DS_Store
venv/

+ 7
- 4
toolkit.py ファイルの表示

@@ -1,4 +1,5 @@
import collections
import itertools
import os
import re
import subprocess
@@ -64,7 +65,9 @@ def get_dat():
Path(path).write_bytes(response.content)


def md5(strings):
cmd = ['md5'] + [c for s in strings for c in ['-s', s]]
out = subprocess.check_output(cmd).decode()
return re.findall(r'"(.+)"\) = (.+)', out)
def md5gen(template, pattern=r'.+', batch=6000):
for i in itertools.count():
strings = (template.format(i=i * batch + k) for k in range(batch))
args = [c for s in strings for c in ['-s', s]]
out = subprocess.check_output(['md5'] + args).decode()
yield from re.findall(rf'"(.+)"\) = ({pattern})', out)

+ 8
- 13
y2016/p05.py ファイルの表示

@@ -1,21 +1,16 @@
import itertools
import sys

import toolkit


text = sys.stdin.read().strip()
password1 = []
password1 = ['_' for _ in range(8)]
password2 = ['_' for _ in range(8)]
for i in itertools.count():
strings = [f'{text}{1000 * i + k}' for k in range(1000)]
for string, digest in toolkit.md5(strings):
if digest.startswith('00000'):
print(string, digest)
password1.append(digest[5])
if digest[5] in '01234567' and password2[int(digest[5])] == '_':
password2[int(digest[5])] = digest[6]
if len(password1) >= 8 and '_' not in password2:
for string, digest in toolkit.md5gen(f'{text}{{i}}', pattern=r'00000.+'):
if '_' in password1:
password1[password1.index('_')] = digest[5]
if digest[5] in '01234567' and password2[int(digest[5])] == '_':
password2[int(digest[5])] = digest[6]
print(digest, string, ''.join(password1), ''.join(password2))
if '_' not in password1 + password2:
break
print(''.join(password1[:8]))
print(''.join(password2[:8]))

読み込み中…
キャンセル
保存