tools.utils
4:c4bc2d77d4be Browse Files
+ Утилита трансляции паролей
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/pw/aw_pw_tool Thu May 01 13:41:43 2025 +0300 1.3 @@ -0,0 +1,146 @@ 1.4 +#!/usr/bin/env python3 1.5 +# devel.a0fs.ru -- TOOLS:SEC:aw_pw_tool -- v0.r202505.1 1.6 +# devel.a0fs.ru -- TOOLS:SEC:safe_pw -- v0.r202409.2 1.7 +# devel.a0fs.ru -- pwtrns.py -- v0.r202402.8 1.8 + 1.9 +from sys import stdin, stdout, stderr 1.10 +from random import seed as rnd_seed, choice as rnd_choice 1.11 +from argparse import ArgumentParser 1.12 +from string import ascii_letters, digits 1.13 +from typing import List, Iterable, Optional 1.14 + 1.15 + 1.16 +### VAR 1.17 +SAFECH= { 1.18 + 'def': '%-=_;:+/,.@', 1.19 + 'url': '-._', 1.20 +} 1.21 + 1.22 +TRDICT = { 1.23 + 'f': 'а', ',': 'б', 'd': 'в', 'u': 'г', 'l': 'д', 't': 'е', '`': 'ё', 1.24 + ';': 'ж', 'p': 'з', 'b': 'и', 'q': 'й', 'r': 'к', 'k': 'л', 'v': 'м', 1.25 + 'y': 'н', 'j': 'о', 'g': 'п', 'h': 'р', 'c': 'с', 'n': 'т', 'e': 'у', 1.26 + 'a': 'ф', '[': 'х', 'w': 'ц', 'x': 'ч', 'i': 'ш', 'o': 'щ', 'm': 'ь', 1.27 + 's': 'ы', ']': 'ъ', "'": 'э', '.': 'ю', 'z': 'я', 'F': 'А', '<': 'Б', 1.28 + 'D': 'В', 'U': 'Г', 'L': 'Д', 'T': 'Е', '~': 'Ё', ':': 'Ж', 'P': 'З', 1.29 + 'B': 'И', 'Q': 'Й', 'R': 'К', 'K': 'Л', 'V': 'М', 'Y': 'Н', 'J': 'О', 1.30 + 'G': 'П', 'H': 'Р', 'C': 'С', 'N': 'Т', 'E': 'У', 'A': 'Ф', '{': 'Х', 1.31 + 'W': 'Ц', 'X': 'Ч', 'I': 'Ш', 'O': 'Щ', 'M': 'Ь', 'S': 'Ы', '}': 'Ъ', 1.32 + '"': 'Э', '>': 'Ю', 'Z': 'Я', 1.33 +} 1.34 + 1.35 +GOODPWCH=ascii_letters + digits + ' ' 1.36 + 1.37 + 1.38 +### FUNC 1.39 +def err(msg: str): 1.40 + for l in msg.splitlines(): 1.41 + stderr.write(f'ERR: {l}\n') 1.42 + 1.43 + 1.44 +def out(s: str): 1.45 + stdout.write(f'{s}\n') 1.46 + 1.47 + 1.48 +def panic(code, msg): 1.49 + err(msg) 1.50 + exit(code) 1.51 + 1.52 + 1.53 +def ptr_reverse(d: dict) -> dict: 1.54 + return dict([(v, k) for k, v in d.items()]) 1.55 + 1.56 + 1.57 +def get_args(words: Optional[List[str]]) -> Iterable[str]: 1.58 + if words and isinstance(words, (tuple, list)): 1.59 + for i in words: 1.60 + yield i.strip() 1.61 + 1.62 + else: 1.63 + for i in stdin: 1.64 + yield i.strip() 1.65 + 1.66 +def out_res(flag: bool, word: str, tr_word: str): 1.67 + if flag: 1.68 + out(f'"{word}" -> "{tr_word}"') 1.69 + 1.70 + else: 1.71 + out(f'{tr_word}') 1.72 + 1.73 + 1.74 +# ARGS 1.75 +ap = ArgumentParser( 1.76 + prog='aw_pw_tool', 1.77 + description='Инструмент для работы с паролями, их преобразованием и трансляцией' 1.78 +) 1.79 + 1.80 +ap.add_argument('-u', '--url', action='store_true', default=False, 1.81 + help='Режим фильтрации пароля от опасных для url символов' 1.82 + ) 1.83 + 1.84 +ap.add_argument('-S', '--show-passwd', action='store_true', default=False, 1.85 + help='Показывать пароли до преобразования' 1.86 + ) 1.87 + 1.88 +ap.add_argument('-t', '--pwtrans', action='store_true', default=False, 1.89 + help='Режим трансляции паролей из английской в русскую раскладку') 1.90 + 1.91 +ap.add_argument('-r', '--reverse', action='store_true', default=False, 1.92 + help='Для трансляции паролей: переводим из русской в английскую раскладку') 1.93 + 1.94 + 1.95 +ap.add_argument('word', nargs='*', help='Слово для перевода') 1.96 + 1.97 + 1.98 +### DO 1.99 +try: 1.100 + args = ap.parse_args() 1.101 + 1.102 + if args.pwtrans: 1.103 + if args.reverse: 1.104 + d = ptr_reverse(TRDICT) 1.105 + 1.106 + else: 1.107 + d = TRDICT 1.108 + 1.109 + for w in get_args(args.word): 1.110 + out_res( 1.111 + args.show_passwd, 1.112 + w, 1.113 + ''.join(map(lambda x: d[x] if x in d else x, w)) 1.114 + ) 1.115 + 1.116 + else: 1.117 + # Init random generator 1.118 + rnd_seed() 1.119 + 1.120 + if args.url: 1.121 + cur_safe_ch = SAFECH['url'] 1.122 + 1.123 + else: 1.124 + cur_safe_ch = SAFECH['def'] 1.125 + 1.126 + GOODPWCH += cur_safe_ch 1.127 + 1.128 + for w in get_args(args.word): 1.129 + if len(w) == 0: 1.130 + break 1.131 + 1.132 + buf = '' 1.133 + for c in w: 1.134 + if c not in GOODPWCH: 1.135 + c = rnd_choice(cur_safe_ch) 1.136 + 1.137 + buf += c 1.138 + 1.139 + out_res( 1.140 + args.show_passwd, 1.141 + w, 1.142 + buf 1.143 + ) 1.144 + 1.145 +except Exception as e: 1.146 + err(f'{type(e).__name__}: {e}') 1.147 + 1.148 +except KeyboardInterrupt: 1.149 + exit()