diff --git a/cryptography_s_des_exploring/sdes/blocks.py b/cryptography_s_des_exploring/sdes/blocks.py new file mode 100644 index 0000000..7931b23 --- /dev/null +++ b/cryptography_s_des_exploring/sdes/blocks.py @@ -0,0 +1,46 @@ +""" +Encoding a message to the 8-bits blocks. +Decoding a message from the 8-bits blocks. +""" + +import base64 + + +def encode(message: str): + """ + Encode the UTF-8 string into base64 and converts bytes to a list which element represent a byte in a binary. + """ + + encoded = base64.b64encode(message.encode('utf-8')) + return map(lambda c: format(c, '08b'), encoded) + + +def decode(message: list): + """ + Decode the list of binary string into bytes to decode this with base64 to get the UTF-8 string. + """ + + decoded_bytes = bytes(map(lambda c: int(c, 2), message)) + + return base64.b64decode(decoded_bytes).decode('utf-8') + + +def encode_bytes(byte_list: list): + """ + Encode the UTF-8 string into base64 and converts bytes to a list which element represent a byte in a binary. + """ + + byte_list = [int(b, 2) for b in byte_list] + byte_data = bytes(byte_list) + return base64.b64encode(byte_data) + + +def decode_bytes(message: str): + """ + Decode the list of binary string into bytes to decode this with base64 to get the UTF-8 string. + """ + + decoded = base64.b64decode(message) + byte_list = list(decoded) + return map(lambda b: format(b, '08b'), byte_list) + diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/sdes/__init__.py b/tests/sdes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/sdes/test_blocks.py b/tests/sdes/test_blocks.py new file mode 100644 index 0000000..ca0f441 --- /dev/null +++ b/tests/sdes/test_blocks.py @@ -0,0 +1,67 @@ +import pytest +from cryptography_s_des_exploring.sdes.blocks import encode, decode, encode_bytes, decode_bytes + + +@pytest.mark.parametrize("message, expected_message", [ + # ab -> b'YWI=' + ('ab', ['01011001', '01010111', '01001001', '00111101']), + + # bc -> b'YmM=' + ('bc', ['01011001', '01101101', '01001101', '00111101']), + + # абвґд -> b'0LDQsdCy0pHQtA==' + ('абвґд', ['00110000', '01001100', '01000100', '01010001', '01110011', + '01100100', '01000011', '01111001', '00110000', '01110000', + '01001000', '01010001', '01110100', '01000001', '00111101', + '00111101']), + + # їґєі -> b'0ZfSkdGU0ZY=' + ('їґєі', ['00110000', '01011010', '01100110', '01010011', '01101011', + '01100100', '01000111', '01010101', '00110000', '01011010', + '01011001', '00111101']), +]) +def test_encode(message, expected_message): + result = list(encode(message)) + assert expected_message == result + + +@pytest.mark.parametrize("expected_message, encoded_message", [ + # ab -> b'YWI=' + ('ab', ['01011001', '01010111', '01001001', '00111101']), + + # bc -> b'YmM=' + ('bc', ['01011001', '01101101', '01001101', '00111101']), + + # абвґд -> b'0LDQsdCy0pHQtA==' + ('абвґд', ['00110000', '01001100', '01000100', '01010001', '01110011', + '01100100', '01000011', '01111001', '00110000', '01110000', + '01001000', '01010001', '01110100', '01000001', '00111101', + '00111101']), + + # їґєі -> b'0ZfSkdGU0ZY=' + ('їґєі', ['00110000', '01011010', '01100110', '01010011', '01101011', + '01100100', '01000111', '01010101', '00110000', '01011010', + '01011001', '00111101']), +]) +def test_decode(expected_message, encoded_message): + result = decode(encoded_message) + assert expected_message == result + + +@pytest.mark.parametrize("bytes, expected_message", [ + (['01011001', '01010111', '01001001', '00111101'], b'WVdJPQ=='), + (['01011001', '01010111', '00000000', '00111101'], b'WVcAPQ==') +]) +def test_encode_bytes(bytes, expected_message): + result = encode_bytes(bytes) + assert expected_message == result + + +@pytest.mark.parametrize("expected_bytes, message", [ + (['01011001', '01010111', '01001001', '00111101'], 'WVdJPQ=='), + (['01011001', '01010111', '00000000', '00111101'], 'WVcAPQ==') +]) +def test_encode_bytes(expected_bytes, message): + result = list(decode_bytes(message)) + assert expected_bytes == result +