first commit
This commit is contained in:
3
MANIFEST.in
Normal file
3
MANIFEST.in
Normal file
@@ -0,0 +1,3 @@
|
||||
include bin/endrilo
|
||||
recursive-include endrilo *.py
|
||||
include README.md
|
||||
47
README.md
Normal file
47
README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
Endrilo: This script encodes and decodes text, files or piping, by counting bits in succession.
|
||||
===============================================================================================
|
||||
|
||||
Contact
|
||||
-------
|
||||
* Author: z0noxz
|
||||
* Source: https://github.com/z0noxz/endrilo
|
||||
* Email: z0noxz@mail.com
|
||||
|
||||
Description
|
||||
-----------
|
||||
This script encodes and decodes text, files or piping, by counting bits in succession. More features include password encryption and compression.
|
||||
|
||||
By itself counting bits in succession isn't a particularly safe way of ciphering data, so besides that the data will also get XORed with a password based seed randomizer.
|
||||
|
||||
How to use
|
||||
----------
|
||||
|
||||
Install it:
|
||||
|
||||
git clone https://github.com/z0noxz/endrilo
|
||||
cd endrilo
|
||||
sudo ./setup.py install
|
||||
|
||||
Encode your message with any of the following ways:
|
||||
|
||||
endrilo --encode "my secret message"
|
||||
echo -n "my secret message" | endrilo --encode-pipe
|
||||
endrilo --encode-file my-secret-file
|
||||
cat my-secret-file | endrilo --encode-pipe
|
||||
|
||||
Decode your message with any if the following ways:
|
||||
|
||||
endrilo --decode "SBQloiNpSSJFk6IlibRkjhJFSSJFWqQlVCYliRQ="
|
||||
echo -n "SBQloiNpSSJFk6IlibRkjhJFSSJFWqQlVCYliRQ=" | endrilo --decode-pipe
|
||||
endrilo --decode-file my-encoded-file
|
||||
cat my-encoded-file | endrilo --decode-pipe
|
||||
|
||||
A password can be specified to enhance security:
|
||||
|
||||
endrilo --encode "my secret message" --password "lamepassword"
|
||||
endrilo --decode "MDiXIdE17GRFxehlGVd0A4BIOvk5BqwLOJA1rig=" --password "lamepassword"
|
||||
|
||||
Compression can be used for smaller storage:
|
||||
|
||||
endrilo --encode "my secret message" --password "lamepassword" --gzip
|
||||
endrilo --decode "H4sIABxvglgC/zOwmK540fRNiuvRF6mS4SXMDR5WPy3Z1nBbTDBdpwEACDQlwB0AAAA=" --password "lamepassword" --gzip
|
||||
2
bin/endrilo
Executable file
2
bin/endrilo
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env sh
|
||||
python3 -m endrilo.endrilo "$@"
|
||||
1
endrilo/__init__.py
Executable file
1
endrilo/__init__.py
Executable file
@@ -0,0 +1 @@
|
||||
import endrilo
|
||||
242
endrilo/endrilo.py
Executable file
242
endrilo/endrilo.py
Executable file
@@ -0,0 +1,242 @@
|
||||
#!/usr/bin/env python3
|
||||
import array, base64, getopt, gzip, hashlib, random, sys, traceback, os
|
||||
|
||||
help_notes = """
|
||||
Endrilo 0.2
|
||||
-----------------------------
|
||||
Created by: z0noxz
|
||||
https://github.com/z0noxz/endrilo
|
||||
|
||||
Description:
|
||||
This script encodes and decodes text, files or piping, by counting bits in succession.
|
||||
More features included password encryption and compression.
|
||||
|
||||
Usage: (python) endrilo.py [options]
|
||||
|
||||
Options:
|
||||
--help Show this help message and exit
|
||||
|
||||
Mandatory:
|
||||
Pick one of the options below
|
||||
|
||||
--encode=TEXT Specify the text to be encoded
|
||||
--encode-file=PATH Encode a file instead of a string
|
||||
--encode-pipe Reads the pipe for data to encode
|
||||
--decode=TEXT Specify the text to be decoded
|
||||
--decode-file=PATH Decode a file instead of a string
|
||||
--decode-pipe Reads the pipe for data to decode
|
||||
|
||||
Optional:
|
||||
--password=PASSWD Specify a password for encryption
|
||||
--gzip zip or unzip data
|
||||
"""
|
||||
bin_oct = [ [False, False, False], [True, False, False], [False, True, False], [True, True, False], [False, False, True], [True, False, True], [False, True, True], [True, True, True] ]
|
||||
|
||||
class Print(object):
|
||||
|
||||
@staticmethod
|
||||
def text(text = "", continuous = False):
|
||||
if continuous:
|
||||
sys.stdout.write(" " + text)
|
||||
sys.stdout.flush()
|
||||
else:
|
||||
print(" " + text)
|
||||
return len(text)
|
||||
|
||||
@staticmethod
|
||||
def info(text = "", continuous = False): return Print.text("\033[94m[i]\033[0m " + text, continuous)
|
||||
|
||||
@staticmethod
|
||||
def warning(text = "", continuous = False): return Print.text("\033[96m[!]\033[0m " + text, continuous)
|
||||
|
||||
@staticmethod
|
||||
def status(text = "", continuous = False): return Print.text("\033[94m[*]\033[0m " + text, continuous)
|
||||
|
||||
@staticmethod
|
||||
def error(text = "", continuous = False): return Print.text("\033[91m[-]\033[0m " + text, continuous)
|
||||
|
||||
@staticmethod
|
||||
def success(text = "", continuous = False): return Print.text("\033[92m[+]\033[0m " + text, continuous)
|
||||
|
||||
@staticmethod
|
||||
def color(text = "", color = 91, continuous = False): return Print.text("\033[" + str(color) + "m" + text + "\033[0m", continuous)
|
||||
|
||||
|
||||
def boolarray(data):
|
||||
holder = []
|
||||
|
||||
for x in data:
|
||||
for i in range(8):
|
||||
holder.append(True if ((x >> i) & 1) else False)
|
||||
return holder
|
||||
|
||||
def passxor(data, passwd):
|
||||
_passwd = bytearray()
|
||||
_passwd.extend(hashlib.sha512(passwd.encode("utf-8")).digest())
|
||||
|
||||
random.seed(str(_passwd))
|
||||
|
||||
if len(_passwd) > len(data):
|
||||
for i in range(len(_passwd)):
|
||||
data[(i % len(data))] = data[(i % len(data))] ^ random.getrandbits(8)
|
||||
else:
|
||||
for i in range(len(data)):
|
||||
data[i] = data[i] ^ random.getrandbits(8)
|
||||
|
||||
return data
|
||||
|
||||
def encode(data, passwd = ""):
|
||||
global bin_oct
|
||||
|
||||
data = bytearray(data)
|
||||
holder = bytearray()
|
||||
bits = []
|
||||
count = 0
|
||||
|
||||
for i in range(0, (8 * len(data))):
|
||||
if (((data[int(i / 8)] & (1 << (i % 8))) != 0) != ((len(bits) / 3) % 2 != 0)):
|
||||
while count > 7:
|
||||
bits.extend(bin_oct[7])
|
||||
bits.extend(bin_oct[0])
|
||||
count -= 7
|
||||
bits.extend(bin_oct[count])
|
||||
count = 0
|
||||
|
||||
if (i + 1 == (8 * len(data))):
|
||||
bits.extend(bin_oct[count + 1])
|
||||
bits.extend([False for x in range(0, (8 - len(bits) % 8))])
|
||||
|
||||
count += 1
|
||||
|
||||
for i in range(0, len(bits), 8):
|
||||
holder.extend([ord(chr(sum(v<<x for x, v in enumerate(bits[i:][:8]))))])
|
||||
|
||||
return (passxor(holder, passwd) if len(passwd) > 0 else holder)
|
||||
|
||||
def decode(data, passwd = ""):
|
||||
global bin_oct
|
||||
|
||||
data = bytearray(data)
|
||||
holder = bytearray()
|
||||
bits = []
|
||||
array = boolarray(passxor(data, passwd) if len(passwd) > 0 else data)
|
||||
array.extend([False for x in range(0, (3 - len(array) % 3))])
|
||||
|
||||
for i in range(0, int(len(array) / 3)):
|
||||
bits.extend([(True if i % 2 != 0 else False) for x in range(0, bin_oct.index(array[(i * 3):][:3]))])
|
||||
|
||||
for i in range(0, len(bits), 8):
|
||||
holder.extend([ord(chr(sum(v<<x for x, v in enumerate(bits[i:][:8]))))])
|
||||
|
||||
return holder
|
||||
|
||||
def main(argv):
|
||||
global help_notes
|
||||
|
||||
_ag = {
|
||||
"password" : "",
|
||||
"gzip" : False
|
||||
}
|
||||
_ag_c = 0
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, "",
|
||||
[
|
||||
"help",
|
||||
|
||||
# Mandatory
|
||||
"encode=",
|
||||
"encode-file=",
|
||||
"encode-pipe",
|
||||
"decode=",
|
||||
"decode-file=",
|
||||
"decode-pipe",
|
||||
|
||||
# Optional
|
||||
"password=",
|
||||
"gzip",
|
||||
])
|
||||
except getopt.GetoptError as e:
|
||||
Print.error(str(e))
|
||||
sys.exit(2)
|
||||
for opt, arg in opts:
|
||||
if opt in ("--help"):
|
||||
print(help_notes)
|
||||
sys.exit()
|
||||
elif opt in ("--encode"):
|
||||
_ag["encode"] = arg
|
||||
_ag_c += 1
|
||||
elif opt in ("--encode-file"):
|
||||
_ag["encode-file"] = arg
|
||||
_ag_c += 1
|
||||
elif opt in ("--encode-pipe"):
|
||||
if not os.isatty(sys.stdin.fileno()):
|
||||
_ag["encode"] = sys.stdin.read()
|
||||
_ag_c += 1
|
||||
elif opt in ("--decode"):
|
||||
_ag["decode"] = arg
|
||||
_ag_c += 1
|
||||
elif opt in ("--decode-file"):
|
||||
_ag["decode-file"] = arg
|
||||
_ag_c += 1
|
||||
elif opt in ("--decode-pipe"):
|
||||
if not os.isatty(sys.stdin.fileno()):
|
||||
_ag["decode"] = sys.stdin.read()
|
||||
_ag_c += 1
|
||||
elif opt in ("--password"):
|
||||
_ag["password"] = arg
|
||||
elif opt in ("--gzip"):
|
||||
_ag["gzip"] = True
|
||||
|
||||
if (_ag_c > 1):
|
||||
Print.error("Only one command is allowed")
|
||||
sys.exit(2)
|
||||
|
||||
elif (_ag_c == 0):
|
||||
Print.error("No command was given")
|
||||
sys.exit(2)
|
||||
|
||||
try:
|
||||
data = bytearray()
|
||||
|
||||
if ("encode" in _ag) or ("encode-file" in _ag):
|
||||
|
||||
# Read input data
|
||||
if ("encode-file" in _ag): data.extend(open(_ag["encode-file"]).read().encode("utf-8"))
|
||||
else: data.extend(_ag["encode"].encode("utf-8"))
|
||||
|
||||
# Encode data
|
||||
data = encode(data, _ag["password"])
|
||||
|
||||
# Zip data
|
||||
if (_ag["gzip"]):
|
||||
data = gzip.compress(data)
|
||||
|
||||
# Base64 encode
|
||||
data = base64.b64encode(data)
|
||||
|
||||
elif ("decode" in _ag) or ("decode-file" in _ag):
|
||||
|
||||
# Read input data
|
||||
if ("decode-file" in _ag): data.extend(open(_ag["decode-file"]).read().encode("utf-8"))
|
||||
else: data.extend(_ag["decode"].encode("utf-8"))
|
||||
|
||||
# Base64 decode
|
||||
data = base64.b64decode(data)
|
||||
|
||||
# Unzip data
|
||||
if (_ag["gzip"]):
|
||||
data = gzip.decompress(data)
|
||||
|
||||
# Decode data
|
||||
data = decode(data, _ag["password"])
|
||||
|
||||
# Print output
|
||||
print(data.decode("utf-8"))
|
||||
|
||||
except Exception as e:
|
||||
Print.error("Rethink what you just did...")
|
||||
for line in str(traceback.format_exc()).split("\n"):
|
||||
Print.color(line)
|
||||
|
||||
if __name__ == "__main__": main(sys.argv[1:])
|
||||
34
setup.py
Executable file
34
setup.py
Executable file
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python3
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name="Endrilo",
|
||||
version="0.2",
|
||||
description="This script encodes and decodes text, files or piping, by counting bits in succession.",
|
||||
author="z0noxz",
|
||||
author_email="z0noxz@mail.com",
|
||||
url="https://github.com/z0noxz/endrilo",
|
||||
classifiers=[
|
||||
"Development Status :: 2 - Beta",
|
||||
"Intended Audience :: Developers",
|
||||
"Intended Audience :: End Users/Desktop",
|
||||
"Natural Language :: English",
|
||||
"Programming Language :: Python",
|
||||
"Topic :: Security :: Cryptography",
|
||||
"Topic :: Text Processing :: Filters",
|
||||
"Topic :: Text Processing :: Linguistic",
|
||||
],
|
||||
requires=[
|
||||
"array",
|
||||
"base64",
|
||||
"getopt",
|
||||
"gzip",
|
||||
"hashlib",
|
||||
"random",
|
||||
"sys",
|
||||
"traceback",
|
||||
"os"
|
||||
],
|
||||
scripts=["bin/endrilo"],
|
||||
packages=["endrilo"]
|
||||
)
|
||||
Reference in New Issue
Block a user