Skip to content

Commit

Permalink
πŸ—“ Jun 25, 2023 8:10:57 PM
Browse files Browse the repository at this point in the history
πŸ”₯ renaming of various from from encode/decode to to/from
✨ bruteforce_base_xx method
🚧 version 6.0.0
πŸ“” docs added/updated
πŸ§ͺ tests added/updated
πŸš€ update dict_get_items to return all items if keys are not specified
πŸš€ added more special chars to morse
  • Loading branch information
securisec committed Jun 26, 2023
1 parent f9ae929 commit b5d01a6
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 86 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
[![](https://img.shields.io/pypi/v/chepy.svg?logo=pypi&label=pypi)](https://pypi.python.org/pypi/chepy)

[![](https://codecov.io/gh/securisec/chepy/branch/master/graph/badge.svg?token=q3pRktSVBu)](https://codecov.io/gh/securisec/chepy)
![](https://img.shields.io/sonar/coverage/securisec_chepy?color=limegreen&logo=sonarcloud&label=SonarCloud&server=https%3A%2F%2Fsonarcloud.io)

[![](https://img.shields.io/badge/code%20style-black-000000.svg?label=Style)](https://github.com/securisec/chepy)
![](https://img.shields.io/github/license/securisec/chepy?label=License)
Expand Down Expand Up @@ -52,8 +51,8 @@ print(
.load_file()
.reverse()
.rot_13()
.base64_decode()
.base32_decode()
.from_base64()
.from_base32()
.hexdump_to_str()
.o
)
Expand Down
2 changes: 2 additions & 0 deletions TODO
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ Misc:
☐ cyberchef recipe to chepy recipe converter

Archive:
βœ” base decode all bases
βœ” rename base64 function to from_basexx
βœ” ✨ cha cha encode, decode
βœ” ✨ monoalphabetic substitution
βœ” ✨ from nato
Expand Down
2 changes: 1 addition & 1 deletion chepy/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
__version__ = "5.2.0" # pragma: no cover
__version__ = "6.0.0" # pragma: no cover
__author__ = "Hapsida @securisec" # pragma: no cover
75 changes: 51 additions & 24 deletions chepy/modules/dataformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ def dict_to_json(self) -> DataFormatT:

@ChepyDecorators.call_stack
def dict_get_items(self, *keys) -> DataFormatT:
"""Get items from a dict
"""Get items from a dict. If no keys are specified, it will return all items.
Returns:
Chepy: The Chepy object.
Expand All @@ -162,7 +162,9 @@ def dict_get_items(self, *keys) -> DataFormatT:
[1, 2]
"""
assert isinstance(self.state, dict), "Not a dict object"
assert len(keys) > 0, "No keys provided"
if len(keys) == 0:
self.state = list(self.state.values())
return self
o = list()
for k in keys:
if self.state.get(k):
Expand Down Expand Up @@ -202,7 +204,7 @@ def increase_indent(self, flow=False, indentless=False):
return self

@ChepyDecorators.call_stack
def base58_encode(self) -> DataFormatT:
def to_base58(self) -> DataFormatT:
"""Encode as Base58
Base58 is a notation for encoding arbitrary byte data using a
Expand All @@ -214,14 +216,14 @@ def base58_encode(self) -> DataFormatT:
Chepy: The Chepy object.
Examples:
>>> Chepy("some data").base58_encode().out.decode()
>>> Chepy("some data").to_base58().out.decode()
"2UDrs31qcWSPi"
"""
self.state = base58.b58encode(self._convert_to_bytes())
return self

@ChepyDecorators.call_stack
def base58_decode(self) -> DataFormatT:
def from_base58(self) -> DataFormatT:
"""Decode as Base58
Base58 is a notation for encoding arbitrary byte data using a
Expand All @@ -233,14 +235,14 @@ def base58_decode(self) -> DataFormatT:
Chepy: The Chepy object.
Examples:
>>> Chepy("2UDrs31qcWSPi").base58_decode().out.decode()
>>> Chepy("2UDrs31qcWSPi").from_base58().out.decode()
"some data"
"""
self.state = base58.b58decode(self.state)
return self

@ChepyDecorators.call_stack
def base85_encode(self) -> DataFormatT:
def to_base85(self) -> DataFormatT:
"""Encode as Base58
Base85 is a notation for encoding arbitrary byte data using a
Expand All @@ -252,14 +254,14 @@ def base85_encode(self) -> DataFormatT:
Chepy: The Chepy object.
Examples:
>>> Chepy("some data").base85_encode().out.decode()
>>> Chepy("some data").to_base85().out.decode()
"F)Po,+Cno&@/"
"""
self.state = base64.a85encode(self._convert_to_bytes())
return self

@ChepyDecorators.call_stack
def base85_decode(self) -> DataFormatT:
def from_base85(self) -> DataFormatT:
"""Decode as Base85
Base85 is a notation for encoding arbitrary byte data using a
Expand All @@ -271,14 +273,14 @@ def base85_decode(self) -> DataFormatT:
Chepy: The Chepy object.
Examples:
>>> Chepy("F)Po,+Cno&@/").base85_decode().out.decode()
>>> Chepy("F)Po,+Cno&@/").from_base85().out.decode()
"some data"
"""
self.state = base64.a85decode(self._convert_to_bytes())
return self

@ChepyDecorators.call_stack
def base16_encode(self) -> DataFormatT:
def to_base16(self) -> DataFormatT:
"""Encode state in base16
Returns:
Expand All @@ -288,7 +290,7 @@ def base16_encode(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def base16_decode(self) -> DataFormatT:
def from_base16(self) -> DataFormatT:
"""Decode state in base16
Returns:
Expand All @@ -298,7 +300,7 @@ def base16_decode(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def base32_encode(self) -> DataFormatT:
def to_base32(self) -> DataFormatT:
"""Encode as Base32
Base32 is a notation for encoding arbitrary byte data using a
Expand All @@ -317,7 +319,7 @@ def base32_encode(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def base32_decode(self) -> DataFormatT:
def from_base32(self) -> DataFormatT:
"""Decode as Base32
Base32 is a notation for encoding arbitrary byte data using a
Expand All @@ -332,7 +334,7 @@ def base32_decode(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def base91_encode(self) -> DataFormatT: # pragma: no cover
def to_base91(self) -> DataFormatT: # pragma: no cover
"""Base91 encode
Reference: https://github.com/aberaud/base91-python/blob/master/base91.py#L69
Expand Down Expand Up @@ -367,7 +369,7 @@ def base91_encode(self) -> DataFormatT: # pragma: no cover
return self

@ChepyDecorators.call_stack
def base91_decode(self) -> DataFormatT: # pragma: no cover
def from_base91(self) -> DataFormatT: # pragma: no cover
"""Decode as Base91
Reference: https://github.com/aberaud/base91-python/blob/master/base91.py#L42
Expand Down Expand Up @@ -441,7 +443,7 @@ def from_bytes(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def base64_encode(self, custom: str = None, url_safe: bool = False) -> DataFormatT:
def to_base64(self, custom: str = None, url_safe: bool = False) -> DataFormatT:
"""Encode as Base64
Base64 is a notation for encoding arbitrary byte data using a
Expand All @@ -459,7 +461,7 @@ def base64_encode(self, custom: str = None, url_safe: bool = False) -> DataForma
Examples:
>>> # To use a custom character set, use:
>>> custom = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
>>> Chepy("Some data").base64_encode(custom=custom).o
>>> Chepy("Some data").to_base64(custom=custom).o
b'IqxhNG/YMLFV'
"""
if url_safe:
Expand All @@ -481,7 +483,7 @@ def base64_encode(self, custom: str = None, url_safe: bool = False) -> DataForma
return self

@ChepyDecorators.call_stack
def base64_decode(self, custom: str = None, url_safe: bool = False) -> DataFormatT:
def from_base64(self, custom: str = None, url_safe: bool = False) -> DataFormatT:
"""Decode as Base64
Base64 is a notation for encoding arbitrary byte data using a
Expand All @@ -499,7 +501,7 @@ def base64_decode(self, custom: str = None, url_safe: bool = False) -> DataForma
Examples:
Base64 decode using a custom string
>>> c = Chepy("QqxhNG/mMKtYPqoz64FVR42=")
>>> c.base64_decode(custom="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
>>> c.from_base64(custom="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
>>> c.out
b"some random? data"
"""
Expand Down Expand Up @@ -743,7 +745,7 @@ def from_hexdump(self) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def url_encode(self, safe: str = "") -> DataFormatT:
def to_url_encoding(self, safe: str = "") -> DataFormatT:
"""URL encode
Encodes problematic characters into percent-encoding,
Expand All @@ -758,21 +760,21 @@ def url_encode(self, safe: str = "") -> DataFormatT:
Examples:
Url encode while specifying save characters
>>> Chepy("https://google.com/?lol=some data&a=1").url_encode(safe="/:").o
>>> Chepy("https://google.com/?lol=some data&a=1").to_url_encoding(safe="/:").o
"https://google.com/%3Flol%3Dsome+data%26a%3D1"
"""
self.state = _urllib_quote_plus(self._convert_to_str(), safe=safe)
return self

@ChepyDecorators.call_stack
def url_decode(self) -> DataFormatT:
def from_url_encoding(self) -> DataFormatT:
"""Converts URI/URL percent-encoded characters back to their raw values.
Returns:
Chepy: The Chepy object.
Examples:
>>> Chepy("https://google.com/%3Flol%3Dsome+data%26a%3D1").url_decode().o
>>> Chepy("https://google.com/%3Flol%3Dsome+data%26a%3D1").from_url_encoding().o
"https://google.com/?lol=some data&a=1"
"""
self.state = _urllib_unquote_plus(self._convert_to_str())
Expand Down Expand Up @@ -1351,3 +1353,28 @@ def swap_endianness(self) -> DataFormatT:
raise ValueError("Data is not hex")
self.state = hex(struct.unpack("<I", struct.pack(">I", int(data, 16)))[0])[2:]
return self

@ChepyDecorators.call_stack
def bruteforce_from_base_xx(self):
"""Bruteforce various base encodings. Current supports base85, base16, base32, base64, base85, base58
Returns:
Chepy: The Chepy object.
"""
hold = {}
ops = {
"base85": base64.a85decode,
"base16": base64.b16decode,
"base32": base64.b32decode,
"base64": base64.b64decode,
"base85": base64.b85decode,
"base58": base58.b58decode,
}
data = self._convert_to_bytes()
for do in ops.items():
try:
hold[do[0]] = do[1](data)
except:
hold[do[0]] = None
self.state = hold
return self
29 changes: 15 additions & 14 deletions chepy/modules/dataformat.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,19 @@ class DataFormat(ChepyCore):
def dict_get_items(self: DataFormatT, *keys: str) -> DataFormatT: ...
def yaml_to_json(self: DataFormatT) -> DataFormatT: ...
def json_to_yaml(self: DataFormatT) -> DataFormatT: ...
def base58_encode(self: DataFormatT) -> DataFormatT: ...
def base58_decode(self: DataFormatT) -> DataFormatT: ...
def base85_encode(self: DataFormatT) -> DataFormatT: ...
def base85_decode(self: DataFormatT) -> DataFormatT: ...
def base16_encode(self: DataFormatT) -> DataFormatT: ...
def base16_decode(self: DataFormatT) -> DataFormatT: ...
def base32_encode(self: DataFormatT) -> DataFormatT: ...
def base32_decode(self: DataFormatT) -> DataFormatT: ...
def to_base58(self: DataFormatT) -> DataFormatT: ...
def from_base58(self: DataFormatT) -> DataFormatT: ...
def to_base85(self: DataFormatT) -> DataFormatT: ...
def from_base85(self: DataFormatT) -> DataFormatT: ...
def to_base16(self: DataFormatT) -> DataFormatT: ...
def from_base16(self: DataFormatT) -> DataFormatT: ...
def to_base32(self: DataFormatT) -> DataFormatT: ...
def from_base32(self: DataFormatT) -> DataFormatT: ...
def to_int(self: DataFormatT) -> DataFormatT: ...
def to_bytes(self: DataFormatT) -> DataFormatT: ...
def from_bytes(self: DataFormatT) -> DataFormatT: ...
def base64_encode(self: DataFormatT, custom: str=...) -> DataFormatT: ...
def base64_decode(self: DataFormatT, custom: str=..., url_safe: bool=...) -> DataFormatT: ...
def to_base64(self: DataFormatT, custom: str=...) -> DataFormatT: ...
def from_base64(self: DataFormatT, custom: str=..., url_safe: bool=...) -> DataFormatT: ...
def decode_bytes(self: DataFormatT, errors: Literal['ignore', 'backslashreplace', 'replace']=...) -> DataFormatT: ...
def to_hex(self: DataFormatT, delimiter: str=..., join_by: str=...) -> DataFormatT: ...
def from_hex(self: DataFormatT, delimiter: str=...) -> DataFormatT: ...
Expand All @@ -45,8 +45,8 @@ class DataFormat(ChepyCore):
def str_from_hexdump(self: DataFormatT) -> DataFormatT: ...
def to_hexdump(self: DataFormatT) -> DataFormatT: ...
def from_hexdump(self: DataFormatT) -> DataFormatT: ...
def url_encode(self: DataFormatT, safe: str=...) -> DataFormatT: ...
def url_decode(self: DataFormatT) -> DataFormatT: ...
def from_url_encoding(self: DataFormatT, safe: str=...) -> DataFormatT: ...
def to_url_encoding(self: DataFormatT) -> DataFormatT: ...
def bytearray_to_str(self: DataFormatT, encoding: str=..., errors: str=...) -> DataFormatT: ...
def str_to_list(self: DataFormatT) -> DataFormatT: ...
def str_to_dict(self: DataFormatT) -> DataFormatT: ...
Expand Down Expand Up @@ -76,6 +76,7 @@ class DataFormat(ChepyCore):
def to_leetcode(self: DataFormatT, replace_space: str=...) -> DataFormatT: ...
def substitute(self: DataFormatT, x: str=..., y: str=...) -> DataFormatT: ...
def remove_nonprintable(self: DataFormatT, replace_with: bytes = ...): ...
def base91_encode(self: DataFormatT) -> DataFormatT: ...
def base91_decode(self: DataFormatT) -> DataFormatT: ...
def to_base91(self: DataFormatT) -> DataFormatT: ...
def from_base91(self: DataFormatT) -> DataFormatT: ...
def swap_endianness(self: DataFormatT) -> DataFormatT: ...
def bruteforce_from_base_xx(self: DataFormatT) -> DataFormatT: ...
4 changes: 2 additions & 2 deletions chepy/modules/encryptionencoding.py
Original file line number Diff line number Diff line change
Expand Up @@ -1048,11 +1048,11 @@ def from_morse_code(
if word_delim in chars:
chars = re.sub(word_delim, "", chars, re.I)
if morse_code_dict.get(chars) is not None:
decode += " " + morse_code_dict.get(chars)
decode += " " + morse_code_dict.get(chars, '')
else: # pragma: no cover
decode += " " + chars
else:
decode += morse_code_dict.get(chars)
decode += morse_code_dict.get(chars, '')
self.state = decode
return self

Expand Down
6 changes: 6 additions & 0 deletions chepy/modules/internal/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,12 @@ class EncryptionConsts(object):
"-": "-....-",
"(": "-.--.",
")": "-.--.-",
"=": "-...-",
"@": ".-...",
"_": "..--.-",
"$": "...-..-",
"@": ".--.-.",
"!": "-.-.--",
}


Expand Down
Loading

0 comments on commit b5d01a6

Please sign in to comment.