Skip to content

Commit b4e1eb6

Browse files
committed
Added codec: kbshift
1 parent 4792a99 commit b4e1eb6

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

codext/others/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: UTF-8 -*-
22
from .dna import *
3+
from .kbshift import *
34
from .letters import *
45
from .markdown import *
56
from .uuencode import *

codext/others/kbshift.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# -*- coding: UTF-8 -*-
2+
"""Keyboard-Shift Codec - keyboard line shifting content encoding.
3+
4+
This codec:
5+
- en/decodes strings from str to str
6+
- en/decodes strings from bytes to bytes
7+
- decodes file content to str (read)
8+
- encodes file content from str to bytes (write)
9+
"""
10+
from ..__common__ import *
11+
12+
13+
LAYOUTS = {
14+
'ansi': "~!@#$%^&*()_+\n`1234567890-=\nqwertyuiop{}|\n[]\\\nasdfghjkl:\"\n;'\nzxcvbnm<>\n,./",
15+
'azerty': "azertyuiop\nqsdfghjklm\nwxcvbn",
16+
'azerty-be': "³1234567890°_\n²&é\"'(§è!çà)-\n|@#^{}\nazertyuiop$\n€[]\n¨*\nqsdfghjklm%£\nùµ\n´`\n>wxcvbn?./+\n<,;:=\n\\~",
17+
'azerty-fr': "1234567890°+\n²&é\"'(-è_çà)=\n~#{[|`\\^@]}\nazertyuiop¨£\nqsdfghjklm%µ\nù*\n>wxcvbn?./§\n<,;:!",
18+
'dvorak': "~!@#$%^&*(){}\n`1234567890[]\n\"<>pyfgcrl?+|\n',./=\\\naoeuidhtns_\n-\n:qjkxbmwvz\n;",
19+
'qwerty': "qwertyuiop\nasdfghjkl\nzxcvbnm",
20+
'qwerty-us': "~!@#$%^&*()_+\n`1234567890-=\nqwertyuiop{}|\n[]\\\nasdfghjkl:\"\n;,\nzxcvbnm<>?\n./",
21+
}
22+
__per_len = {}
23+
for k, s in LAYOUTS.items():
24+
i = max(map(len, s.split("\n")))
25+
__per_len.setdefault(i, [])
26+
__per_len[i].append(k)
27+
28+
29+
__examples__ = {"enc-dec(kbshift_%s_%d)" % (kb, n): ["@irandom{256,512}"] for n in range(10) for kb in LAYOUTS.keys()}
30+
__guess__ = []
31+
for mlen, kbs in __per_len.items():
32+
for k in kbs:
33+
__guess__.extend(["kbshift-%s-%d" % (k, i+1) for i in range(mlen)])
34+
35+
36+
def _kbshift(text, keyboard="azerty", n=1, decode=False):
37+
r = ""
38+
for c in text:
39+
nc = None
40+
for l in LAYOUTS[keyboard].splitlines():
41+
if c.lower() in l:
42+
nc = l[(l.index(c.lower()) + [-1, 1][decode] * n) % len(l)]
43+
break
44+
r += c if nc is None else nc
45+
return r
46+
47+
48+
def kbshift_encode(scheme):
49+
kb, shift = re.match(r"^(.*?)[-_]?(\d+)$", scheme or "azerty-1").groups()
50+
def encode(text, errors="strict"):
51+
r = _kbshift(ensure_str(text), kb, int(shift))
52+
return r, len(r)
53+
return encode
54+
55+
56+
def kbshift_decode(scheme):
57+
kb, shift = re.match(r"^(.*?)[-_]?(\d+)$", scheme or "azerty-1").groups()
58+
def decode(text, errors="strict"):
59+
r = _kbshift(ensure_str(text), kb, int(shift), True)
60+
return r, len(r)
61+
return decode
62+
63+
64+
add("kbshift", kbshift_encode, kbshift_decode, entropy=lambda e: e,printables_rate=lambda pr: pr, transitive=True,
65+
pattern=r"^kbshift(?:|[-_]((?:az|qw)erty[-_]?[1-9]|(?:ansi|azerty-(?:be|fr)|dvorak|qwerty-us)[-_]?(?:[1-9]|1[0-2])))$")
66+

0 commit comments

Comments
 (0)