Initial Commit
This commit is contained in:
commit
04b358021a
|
@ -0,0 +1,205 @@
|
|||
import os
|
||||
import secrets
|
||||
from collections import deque
|
||||
from typing import IO
|
||||
|
||||
|
||||
class CaesarCipher:
|
||||
def __init__(self, shift: int, pad: deque = None, file_name: str = None, use_pad: bool = False,
|
||||
file: IO[str] = None):
|
||||
"""
|
||||
Constructor for CaesarCipher class
|
||||
:param shift: value to shift the alphabet by
|
||||
:type shift: int
|
||||
:param pad: pad to use for encryption/decryption
|
||||
:type pad: deque
|
||||
:param file_name: path to file containing pad
|
||||
:type file_name: str
|
||||
:param use_pad: True: use pad, False: generate pad
|
||||
:type use_pad: bool
|
||||
"""
|
||||
|
||||
self.shift = shift
|
||||
self.default_pad_length = 100
|
||||
self.file_type_dict = {
|
||||
'.txt': {
|
||||
'function': self.convert_txt_to_list,
|
||||
'default_file_name': 'pad.txt'
|
||||
},
|
||||
'.csv': {
|
||||
'function': self.convert_csv_to_list,
|
||||
'default_file_name': 'pad.csv'
|
||||
}
|
||||
}
|
||||
|
||||
if use_pad is False:
|
||||
self.pad = deque([0] * self.default_pad_length)
|
||||
else:
|
||||
if file_name:
|
||||
file_name, file_extension = os.path.splitext(file_name)
|
||||
print(f'{file_name}, {file_extension}')
|
||||
if file_extension in self.file_type_dict:
|
||||
self.file_type_dict[file_extension]["function"](file_name + file_extension)
|
||||
if file:
|
||||
self.read_file(file)
|
||||
else:
|
||||
self.pad = pad if pad else self.gen_pad(self.default_pad_length)
|
||||
|
||||
def read_file(self, file: IO[str]) -> None:
|
||||
"""
|
||||
Read file object into deque, space delimited or comma delimited
|
||||
:param file: file object to read
|
||||
:type file: IO[str]
|
||||
"""
|
||||
# Try space delimited, then comma delimited
|
||||
try:
|
||||
self.pad = deque([int(num) for num in filter(str.isdigit, file.read().split(' '))])
|
||||
print(f'Space Pad: {self.pad}')
|
||||
except ValueError:
|
||||
self.pad = deque([int(num) for num in filter(str.isdigit, file.read().split(','))])
|
||||
print(f'comma Pad: {self.pad}')
|
||||
except Exception as e:
|
||||
print(f'Error reading file: {e}')
|
||||
|
||||
def get_pad(self) -> int:
|
||||
"""
|
||||
Get the next value from the pad
|
||||
:return: next value from the pad
|
||||
:rtype: int
|
||||
"""
|
||||
|
||||
try:
|
||||
pad_val = self.pad.popleft()
|
||||
except (IndexError, AttributeError):
|
||||
print(f'Error! Please pass the pad/pad file as an argument!')
|
||||
self.gen_pad()
|
||||
pad_val = self.pad.popleft()
|
||||
|
||||
return pad_val
|
||||
|
||||
def encrypt(self, plain_text: str) -> str:
|
||||
"""
|
||||
Encrypt plain_text using the Caesar Cipher
|
||||
:param plain_text: text to encrypt
|
||||
:type plain_text: str
|
||||
:return: cipher text
|
||||
:rtype: str
|
||||
"""
|
||||
|
||||
result = ""
|
||||
for char in plain_text:
|
||||
if not char.isalpha():
|
||||
result += char
|
||||
else:
|
||||
pad_val = self.get_pad()
|
||||
result += chr((ord(char) + self.shift - 65 + pad_val) % 26 + 65) if char.isupper() else chr(
|
||||
(ord(char) + self.shift - 97 + pad_val) % 26 + 97)
|
||||
print(f'Result: {result}')
|
||||
return result
|
||||
|
||||
def decrypt(self, cipher_text: str) -> str:
|
||||
"""
|
||||
Decrypt cipher_text using the Caesar Cipher
|
||||
:param cipher_text: text to decrypt
|
||||
:type cipher_text: str
|
||||
:return: plain text
|
||||
:rtype: str
|
||||
"""
|
||||
|
||||
result = ""
|
||||
for char in cipher_text:
|
||||
if not char.isalpha():
|
||||
result += char
|
||||
else:
|
||||
pad_val = self.get_pad()
|
||||
result += chr((ord(char) - self.shift - 65 - pad_val) % 26 + 65) if char.isupper() else chr(
|
||||
(ord(char) - self.shift - 97 - pad_val) % 26 + 97)
|
||||
return result
|
||||
|
||||
def gen_pad(self, length: int = None) -> None:
|
||||
"""
|
||||
Generates a pad of random numbers, stores it in self.pad, and writes it to all default files (pad.txt, pad.csv)
|
||||
:param length: length of pad to generate, defaults to 100
|
||||
:type length: int
|
||||
:return: None
|
||||
"""
|
||||
|
||||
length = length if length else self.default_pad_length
|
||||
pad = deque()
|
||||
for i in range(length):
|
||||
pad.append(secrets.randbelow(length))
|
||||
|
||||
self.pad = pad
|
||||
# write to all default files
|
||||
for key, value in self.file_type_dict.items():
|
||||
self.write_pad_to_file(value['default_file_name'])
|
||||
|
||||
def write_pad_to_file(self, file_name: str = None) -> None:
|
||||
"""
|
||||
Writes the pad to a file. If no file name is provided, the default file name is used.
|
||||
:param file_name: name of file to write pad to
|
||||
:type file_name: str
|
||||
:return: None
|
||||
"""
|
||||
|
||||
file_name = file_name if file_name else self.file_type_dict[os.path.splitext(file_name)[1]]['default_file_name']
|
||||
with open(file_name, 'w') as f:
|
||||
if file_name.endswith('.csv'):
|
||||
for i in self.pad:
|
||||
f.write(f'{i},')
|
||||
else:
|
||||
for i in self.pad:
|
||||
f.write(f'{i} ')
|
||||
|
||||
def convert_txt_to_list(self, file_name: str = None) -> None:
|
||||
"""
|
||||
Parses a text file containing a pad and stores it in object
|
||||
:param file_name: name of text file to read pad from
|
||||
:type file_name: str
|
||||
:return: None
|
||||
"""
|
||||
|
||||
file_name = file_name if file_name else self.file_type_dict[os.path.splitext(file_name)[1]]['default_file_name']
|
||||
try:
|
||||
with open(file_name, 'r') as f:
|
||||
pad = f.readline()
|
||||
pad = [int(i) for i in pad.split(' ') if i.strip()]
|
||||
self.pad = deque(pad)
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f'File {file_name} not found. Please check the file name and try again.')
|
||||
exit(1)
|
||||
|
||||
def convert_csv_to_list(self, file_name: str = None) -> None:
|
||||
"""
|
||||
Parses a csv file containing a pad and stores it in object
|
||||
:param file_name: name of csv file to read pad from
|
||||
:return: None
|
||||
"""
|
||||
|
||||
file_name = file_name if file_name else self.file_type_dict[os.path.splitext(file_name)[1]]['default_file_name']
|
||||
try:
|
||||
with open(file_name, 'r') as f:
|
||||
pad = f.readline()
|
||||
pad = [int(x) for x in pad.split(',') for x in x.split(' ') if x.strip()]
|
||||
self.pad = deque(pad)
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f'File {file_name} not found. Please check the file name and try again.')
|
||||
exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
text = "Hello World, this is a test!"
|
||||
|
||||
cipher = CaesarCipher(40, use_pad=False)
|
||||
enc = cipher.encrypt(text)
|
||||
|
||||
decipher = CaesarCipher(40, use_pad=False)
|
||||
dec = decipher.decrypt(enc)
|
||||
|
||||
print(f'Original: {text}')
|
||||
print(f'Encrypted: {enc}')
|
||||
print(f'Decrypted: {dec}')
|
||||
|
||||
assert text == dec, "Decrypted text does not match original text."
|
|
@ -0,0 +1,98 @@
|
|||
import io
|
||||
import base64
|
||||
|
||||
from flask import Flask, render_template, request, jsonify
|
||||
|
||||
from Ciphers.CaesarCipher.CaesarCipher import CaesarCipher
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('base.html')
|
||||
|
||||
|
||||
@app.route('/b64', methods=['POST'])
|
||||
def b64():
|
||||
if 'b64_plaintext_input' in request.form:
|
||||
text = request.form['b64_plaintext_input']
|
||||
ciphertext_input = False
|
||||
elif 'b64_ciphertext_input' in request.form:
|
||||
text = request.form['b64_ciphertext_input']
|
||||
ciphertext_input = True
|
||||
else:
|
||||
return jsonify({'error': 'No input provided'})
|
||||
|
||||
result = {}
|
||||
if ciphertext_input:
|
||||
base64_bytes = text.encode("ascii")
|
||||
sample_string_bytes = base64.b64decode(base64_bytes)
|
||||
result['cleartext'] = str(sample_string_bytes, "ascii")
|
||||
else:
|
||||
sample_string_bytes = text.encode("ascii")
|
||||
base64_bytes = base64.b64encode(sample_string_bytes)
|
||||
# print(f'Encoded string: {base64_bytes.decode("ascii")}')
|
||||
result['ciphertext'] = str(base64_bytes.decode("ascii"))
|
||||
|
||||
return jsonify(result)
|
||||
|
||||
|
||||
@app.route('/encrypt_decrypt', methods=['POST'])
|
||||
def encrypt_decrypt():
|
||||
if 'plaintext_input' in request.form:
|
||||
text = request.form['plaintext_input']
|
||||
ciphertext_input = False
|
||||
elif 'ciphertext_input' in request.form:
|
||||
text = request.form['ciphertext_input']
|
||||
ciphertext_input = True
|
||||
else:
|
||||
return jsonify({'error': 'No input provided'})
|
||||
|
||||
key = int(request.form['key'])
|
||||
|
||||
result = {}
|
||||
if ciphertext_input:
|
||||
pad_file = request.files.get('pad_file')
|
||||
if pad_file:
|
||||
pad = io.StringIO(pad_file.stream.read().decode('utf-8'))
|
||||
cipher = CaesarCipher(shift=key, use_pad=True, file=pad)
|
||||
else:
|
||||
cipher = CaesarCipher(shift=key, use_pad=False)
|
||||
|
||||
result['cleartext'] = cipher.decrypt(text)
|
||||
|
||||
if pad_file:
|
||||
pad.seek(0)
|
||||
new_cipher = CaesarCipher(shift=key, use_pad=True, file=pad)
|
||||
encrypted_text = new_cipher.encrypt(result['cleartext'])
|
||||
else:
|
||||
new_cipher = CaesarCipher(shift=key, use_pad=False)
|
||||
encrypted_text = new_cipher.encrypt(result['cleartext'])
|
||||
|
||||
result['ciphertext'] = encrypted_text
|
||||
else:
|
||||
pad_file = request.files.get('pad_file')
|
||||
if pad_file:
|
||||
pad = io.StringIO(pad_file.stream.read().decode('utf-8'))
|
||||
cipher = CaesarCipher(shift=key, use_pad=True, file=pad)
|
||||
else:
|
||||
cipher = CaesarCipher(shift=key, use_pad=False)
|
||||
|
||||
result['ciphertext'] = cipher.encrypt(text)
|
||||
|
||||
if pad_file:
|
||||
pad.seek(0)
|
||||
new_cipher = CaesarCipher(shift=key, use_pad=True, file=pad)
|
||||
decrypted_text = new_cipher.decrypt(result['ciphertext'])
|
||||
else:
|
||||
new_cipher = CaesarCipher(shift=key, use_pad=False)
|
||||
decrypted_text = new_cipher.decrypt(result['ciphertext'])
|
||||
|
||||
result['cleartext'] = decrypted_text
|
||||
|
||||
return jsonify(result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=3000, debug=True)
|
|
@ -0,0 +1,142 @@
|
|||
<div class="form-group">
|
||||
<form method="POST" action="{{ url_for('encrypt_decrypt') }}">
|
||||
<label for="ciphertext_input">
|
||||
Enter Cipher text here:
|
||||
</label>
|
||||
<input type="text" id="ciphertext_input" name="ciphertext_input"
|
||||
placeholder="Enter your text here" class="form-control">
|
||||
<div class="form-group">
|
||||
<label for="key-input-decrypt">Shift Value:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-prepend">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="decrementKeyDecrypt()">-</button>
|
||||
</span>
|
||||
<label for="key-input-decrypt"></label><input type="text" id="key-input-decrypt"
|
||||
name="key-input-decrypt" class="form-control" min="1"
|
||||
max="1000000000000000" value="3"
|
||||
oninput="updateSliderValue()">
|
||||
<span class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="incrementKeyDecrypt()">+</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="key-slider-decrypt">
|
||||
Enter Shift Value
|
||||
</label>
|
||||
<input type="range" id="key-slider-decrypt" name="key" min="1"
|
||||
max="1000000000000000" value="3" class="form-control"
|
||||
oninput="updateKeyInput()">
|
||||
</div>
|
||||
<div class="custom-file">
|
||||
<span class="string">Upload pad file:</span>
|
||||
<input type="file" id="file-input-decrypt" onchange="updateLabelDecrypt()">
|
||||
<label for="file-input-decrypt" id="file-label-decrypt">Choose file</label>
|
||||
<button id="remove-file-btn-decrypt" onclick="removeFileDecrypt()" style="display: none;">Remove
|
||||
</button>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="form-group">
|
||||
<label for="ciphertext-decrypt">Cipher Text:</label><input type="text" id="ciphertext-decrypt"
|
||||
name="ciphertext-decrypt"
|
||||
placeholder="Cipher Text"
|
||||
class="form-control" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="form-group alert alert-success">
|
||||
<label for="cleartext-decrypt">Clear Text:</label>
|
||||
<input type="text" id="cleartext-decrypt" name="cleartext-decrypt" placeholder="Clear Text"
|
||||
class="form-control" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function update_decrypt() {
|
||||
let ciphertext = document.getElementById('ciphertext_input').value;
|
||||
let key = document.getElementById('key-slider-decrypt').value;
|
||||
{#let xhrEncrypt = new XMLHttpRequest();#}
|
||||
let pad_file = document.getElementById('file-input').files[0];
|
||||
|
||||
let formData = new FormData();
|
||||
formData.append('ciphertext_input', ciphertext);
|
||||
formData.append('key', key);
|
||||
formData.append('pad_file', pad_file);
|
||||
|
||||
let xhrEncrypt = new XMLHttpRequest();
|
||||
xhrEncrypt.open('POST', '{{ url_for("encrypt_decrypt") }}');
|
||||
xhrEncrypt.onload = function () {
|
||||
let ciphertext = JSON.parse(xhrEncrypt.responseText)['ciphertext'];
|
||||
let cleartext = JSON.parse(xhrEncrypt.responseText)['cleartext'];
|
||||
document.getElementById('ciphertext-decrypt').value = ciphertext;
|
||||
document.getElementById('cleartext-decrypt').value = cleartext;
|
||||
};
|
||||
xhrEncrypt.send(formData);
|
||||
}
|
||||
|
||||
function updateSliderValueDecrypt() {
|
||||
document.getElementById('key-slider-decrypt').value = document.getElementById('key-input-decrypt').value;
|
||||
update_decrypt();
|
||||
}
|
||||
|
||||
function updateKeyInputDecrypt() {
|
||||
document.getElementById('key-input-decrypt').value = document.getElementById('key-slider-decrypt').value;
|
||||
update_decrypt();
|
||||
}
|
||||
|
||||
function incrementKeyDecrypt() {
|
||||
let keyInput = document.getElementById('key-input-decrypt');
|
||||
let currentValue = parseInt(keyInput.value);
|
||||
if (currentValue < parseInt(keyInput.max)) {
|
||||
keyInput.value = currentValue + 1;
|
||||
updateSliderValueDecrypt();
|
||||
}
|
||||
}
|
||||
|
||||
function decrementKeyDecrypt() {
|
||||
let keyInput = document.getElementById('key-input-decrypt');
|
||||
let currentValue = parseInt(keyInput.value);
|
||||
if (currentValue > parseInt(keyInput.min)) {
|
||||
keyInput.value = currentValue - 1;
|
||||
updateSliderValueDecrypt();
|
||||
}
|
||||
}
|
||||
|
||||
function updateLabelDecrypt() {
|
||||
let fileInput = document.getElementById('file-input-decrypt');
|
||||
let fileLabel = document.getElementById('file-label-decrypt');
|
||||
let removeBtn = document.getElementById('remove-file-btn-decrypt');
|
||||
|
||||
if (fileInput.value) {
|
||||
fileLabel.innerHTML = fileInput.value.match(/[\/\\]([\w\d\s\.\-\(\)]+)$/)[1];
|
||||
removeBtn.style.display = 'inline-block';
|
||||
} else {
|
||||
fileLabel.innerHTML = 'Choose file';
|
||||
removeBtn.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function removeFileDecrypt() {
|
||||
let fileInput = document.getElementById('file-input-decrypt');
|
||||
let fileLabel = document.getElementById('file-label-decrypt');
|
||||
let removeBtn = document.getElementById('remove-file-btn-decrypt');
|
||||
|
||||
fileInput.value = '';
|
||||
fileLabel.innerHTML = 'Choose file';
|
||||
removeBtn.style.display = 'none';
|
||||
}
|
||||
|
||||
document.getElementById('ciphertext_input').addEventListener('input', update_decrypt);
|
||||
document.getElementById('key-slider-decrypt').addEventListener('input', updateKeyInputDecrypt);
|
||||
document.getElementById('key-input-decrypt').addEventListener('input', updateSliderValueDecrypt);
|
||||
</script>
|
|
@ -0,0 +1,138 @@
|
|||
<div class="form-group">
|
||||
<form method="POST" action="{{ url_for('encrypt_decrypt') }}">
|
||||
<label for="plaintext_input">
|
||||
Enter Plaintext Here:
|
||||
</label>
|
||||
<input type="text" id="plaintext_input" name="plaintext_input"
|
||||
placeholder="Enter your text here" class="form-control">
|
||||
<div class="form-group">
|
||||
<label for="key-input">Shift Value:</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-prepend">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="decrementKey()">-</button>
|
||||
</span>
|
||||
<input type="text" id="key-input" name="key" class="form-control" min="1" max="1000000000000000"
|
||||
value="3" oninput="updateSliderValue()">
|
||||
<span class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="incrementKey()">+</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="key-slider">
|
||||
Enter shift value:
|
||||
</label>
|
||||
<input type="range" id="key-slider" name="key" min="1" max="1000000000000000"
|
||||
value="3"
|
||||
class="form-control" oninput="updateKeyInput()">
|
||||
</div>
|
||||
<div class="custom-file">
|
||||
<input type="file" id="file-input" onchange="updateLabel()">
|
||||
<label for="file-input" id="file-label">Choose file</label>
|
||||
<button id="remove-file-btn" onclick="removeFile()" style="display: none;">Remove</button>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="form-group alert alert-success">
|
||||
<label for="ciphertext">Cipher Text:</label>
|
||||
<input type="text" id="ciphertext" name="ciphertext" placeholder="Cipher Text"
|
||||
class="form-control" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="form-group">
|
||||
<label for="cleartext">Clear Text:</label>
|
||||
<input type="text" id="cleartext" name="cleartext" placeholder="Clear Text"
|
||||
class="form-control" readonly >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function update() {
|
||||
let plaintext = document.getElementById('plaintext_input').value;
|
||||
let key = document.getElementById('key-slider').value;
|
||||
let pad_file = document.getElementById('file-input').files[0];
|
||||
|
||||
let formData = new FormData();
|
||||
formData.append('plaintext_input', plaintext);
|
||||
formData.append('key', key);
|
||||
formData.append('pad_file', pad_file);
|
||||
|
||||
let xhrEncrypt = new XMLHttpRequest();
|
||||
xhrEncrypt.open('POST', '{{ url_for("encrypt_decrypt") }}');
|
||||
xhrEncrypt.onload = function () {
|
||||
let ciphertext = JSON.parse(xhrEncrypt.responseText)['ciphertext'];
|
||||
let cleartext = JSON.parse(xhrEncrypt.responseText)['cleartext'];
|
||||
document.getElementById('ciphertext').value = ciphertext;
|
||||
document.getElementById('cleartext').value = cleartext;
|
||||
};
|
||||
xhrEncrypt.send(formData);
|
||||
}
|
||||
|
||||
function updateSliderValue() {
|
||||
document.getElementById('key-slider').value = document.getElementById('key-input').value;
|
||||
update();
|
||||
}
|
||||
|
||||
function updateKeyInput() {
|
||||
document.getElementById('key-input').value = document.getElementById('key-slider').value;
|
||||
update();
|
||||
}
|
||||
|
||||
function incrementKey() {
|
||||
let keyInput = document.getElementById('key-input');
|
||||
let currentValue = parseInt(keyInput.value);
|
||||
if (currentValue < parseInt(keyInput.max)) {
|
||||
keyInput.value = currentValue + 1;
|
||||
updateSliderValue();
|
||||
}
|
||||
}
|
||||
|
||||
function decrementKey() {
|
||||
let keyInput = document.getElementById('key-input');
|
||||
let currentValue = parseInt(keyInput.value);
|
||||
if (currentValue > parseInt(keyInput.min)) {
|
||||
keyInput.value = currentValue - 1;
|
||||
updateSliderValue();
|
||||
}
|
||||
}
|
||||
|
||||
function updateLabel() {
|
||||
let fileInput = document.getElementById('file-input');
|
||||
let fileLabel = document.getElementById('file-label');
|
||||
let removeBtn = document.getElementById('remove-file-btn');
|
||||
|
||||
if (fileInput.value) {
|
||||
fileLabel.innerHTML = fileInput.value.match(/[\/\\]([\w\d\s\.\-\(\)]+)$/)[1];
|
||||
removeBtn.style.display = 'inline-block';
|
||||
} else {
|
||||
fileLabel.innerHTML = 'Choose file';
|
||||
removeBtn.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function removeFile() {
|
||||
let fileInput = document.getElementById('file-input');
|
||||
let fileLabel = document.getElementById('file-label');
|
||||
let removeBtn = document.getElementById('remove-file-btn');
|
||||
|
||||
fileInput.value = '';
|
||||
fileLabel.innerHTML = 'Choose file';
|
||||
removeBtn.style.display = 'none';
|
||||
}
|
||||
|
||||
document.getElementById('plaintext_input').addEventListener('input', update);
|
||||
document.getElementById('key-slider').addEventListener('input', updateKeyInput);
|
||||
document.getElementById('key-input').addEventListener('input', updateSliderValue);
|
||||
</script>
|
||||
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
|
||||
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||||
|
||||
<title>Cipher App</title>
|
||||
</head>
|
||||
<body class="container-fluid bg-light">
|
||||
<div class="mt-4 p-5 bg-info text-white rounded">
|
||||
<h1>Cipher App</h1>
|
||||
<p>Made with Flask</p>
|
||||
<p>By: <a href="https://devblog.periodicc.com/about/" class="text-white">Devoalda</a></p>
|
||||
</div>
|
||||
<div class="container-fluid">
|
||||
<h1 class="mt-3">Caesar Cipher</h1>
|
||||
<ul class="nav nav-tabs mx-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" data-toggle="tab" href="#plaintext-tab">Encrypt</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="tab" href="#ciphertext-tab">Decrypt</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content container-fluid">
|
||||
<div id="plaintext-tab" class="tab-pane fade show active">
|
||||
<!-- Your plaintext input form here -->
|
||||
<!-- URL for /encrypt -->
|
||||
<div class="container-fluid mt-3">
|
||||
{% include "CaesarEncrypt.html" %}
|
||||
</div>
|
||||
</div>
|
||||
<div id="ciphertext-tab" class="tab-pane fade">
|
||||
<!-- Your ciphertext input form here -->
|
||||
<div class="container-fluid mt-3">
|
||||
{% include "CaesarDecrypt.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid">
|
||||
<h1 class="mt-3">Base 64 Encoding</h1>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid">
|
||||
<ul class="nav nav-tabs mx-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" data-toggle="tab" href="#b64-plaintext-tab">Encrypt</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="tab" href="#b64-ciphertext-tab">Decrypt</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div id="b64-plaintext-tab" class="tab-pane fade show active">
|
||||
<!-- Your plaintext input form here -->
|
||||
<div class="container-fluid mt-3">
|
||||
{% include "base64Encode.html" %}
|
||||
</div>
|
||||
</div>
|
||||
<div id="b64-ciphertext-tab" class="tab-pane fade">
|
||||
<!-- Your ciphertext input form here -->
|
||||
<div class="container-fluid mt-3">
|
||||
{% include "base64Decode.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Optional JavaScript -->
|
||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
|
||||
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
|
||||
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
|
||||
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
|
||||
crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,30 @@
|
|||
<div class="form-group">
|
||||
<form method="POST" action="{{ url_for('b64') }}">
|
||||
<label for="b64_plaintext_input_decrypt">Enter Cipher Text Here:</label>
|
||||
<input type="text" id="b64_plaintext_input_decrypt" name="b64_plaintext_input_decrypt"
|
||||
placeholder="Enter your text here" class="form-control">
|
||||
<div class="alert alert-success">
|
||||
<label for="b64_ciphertext_decrypt">
|
||||
Clear Text:
|
||||
</label>
|
||||
<input type="text" id="b64_ciphertext_decrypt" name="b64_ciphertext_decrypt"
|
||||
placeholder="Cipher Text" class="form-control" readonly>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function b64DecryptUpdate(){
|
||||
let plaintext = document.getElementById("b64_plaintext_input_decrypt").value;
|
||||
let formData = new FormData();
|
||||
formData.append('b64_ciphertext_input', plaintext);
|
||||
|
||||
let xhrRequest = new XMLHttpRequest();
|
||||
xhrRequest.open('POST', '/b64');
|
||||
xhrRequest.onload = function(){
|
||||
document.getElementById("b64_ciphertext_decrypt").value = JSON.parse(xhrRequest.responseText)['cleartext'];
|
||||
};
|
||||
xhrRequest.send(formData);
|
||||
}
|
||||
document.getElementById('b64_plaintext_input_decrypt').addEventListener('input', b64DecryptUpdate);
|
||||
</script>
|
|
@ -0,0 +1,31 @@
|
|||
<div class="form-group">
|
||||
<form method="POST" action="{{ url_for('b64') }}">
|
||||
<label for="b64_plaintext_input">Enter Plaintext Here:</label>
|
||||
<input type="text" id="b64_plaintext_input" name="b64_plaintext_input"
|
||||
placeholder="Enter your text here" class="form-control">
|
||||
<div class="alert alert-success">
|
||||
<label for="b64_ciphertext">
|
||||
Cipher Text:
|
||||
</label>
|
||||
<input type="text" id="b64_ciphertext" name="b64_ciphertext"
|
||||
placeholder="Cipher Text" class="form-control" readonly>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function b64Update() {
|
||||
let plaintext = document.getElementById("b64_plaintext_input").value;
|
||||
let formData = new FormData();
|
||||
formData.append('b64_plaintext_input', plaintext);
|
||||
|
||||
let xhrRequest = new XMLHttpRequest();
|
||||
xhrRequest.open('POST', '/b64');
|
||||
xhrRequest.onload = function () {
|
||||
document.getElementById("b64_ciphertext").value = JSON.parse(xhrRequest.responseText)['ciphertext'];
|
||||
};
|
||||
xhrRequest.send(formData);
|
||||
}
|
||||
|
||||
document.getElementById('b64_plaintext_input').addEventListener('input', b64Update);
|
||||
</script>
|
Loading…
Reference in New Issue