From 8e5143deefe9a51e2a150b36028a735ee9bc172c Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Mon, 19 Sep 2022 20:47:00 +0300 Subject: [PATCH 1/8] Completed lab-00 --- homework00/hello.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework00/hello.py b/homework00/hello.py index efe8767..5802c29 100644 --- a/homework00/hello.py +++ b/homework00/hello.py @@ -1,5 +1,5 @@ def get_greeting(name: str) -> str: - pass + return f"Hello, {name}!" if __name__ == "__main__": From a94006e0f811127259ad1dd2d37adb9c8486166e Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Sun, 2 Oct 2022 13:01:55 +0300 Subject: [PATCH 2/8] Completed lab1 --- homework01/caesar.py | 45 +++++++++++------------------------ homework01/rsa.py | 53 +++++++++++++++++------------------------- homework01/vigenere.py | 47 +++++++++++++++++-------------------- 3 files changed, 55 insertions(+), 90 deletions(-) diff --git a/homework01/caesar.py b/homework01/caesar.py index 09c3681..38bc9c9 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -1,46 +1,27 @@ import typing as tp +from string import ascii_lowercase as lower, ascii_uppercase as upper def encrypt_caesar(plaintext: str, shift: int = 3) -> str: - """ - Encrypts plaintext using a Caesar cipher. - - >>> encrypt_caesar("PYTHON") - 'SBWKRQ' - >>> encrypt_caesar("python") - 'sbwkrq' - >>> encrypt_caesar("Python3.6") - 'Sbwkrq3.6' - >>> encrypt_caesar("") - '' - """ ciphertext = "" - # PUT YOUR CODE HERE + for char in plaintext: + if char.isalpha(): + if char.islower(): + char = lower[(lower.index(char) + shift) % 26] + else: + char = upper[(upper.index(char) + shift) % 26] + ciphertext += char return ciphertext def decrypt_caesar(ciphertext: str, shift: int = 3) -> str: - """ - Decrypts a ciphertext using a Caesar cipher. - - >>> decrypt_caesar("SBWKRQ") - 'PYTHON' - >>> decrypt_caesar("sbwkrq") - 'python' - >>> decrypt_caesar("Sbwkrq3.6") - 'Python3.6' - >>> decrypt_caesar("") - '' - """ - plaintext = "" - # PUT YOUR CODE HERE - return plaintext + return encrypt_caesar(ciphertext, -shift) def caesar_breaker_brute_force(ciphertext: str, dictionary: tp.Set[str]) -> int: - """ - Brute force breaking a Caesar cipher. - """ best_shift = 0 - # PUT YOUR CODE HERE + for shift in range(26): + decrypted_msg = decrypt_caesar(ciphertext, shift) + if decrypted_msg in dictionary: + best_shift = shift return best_shift diff --git a/homework01/rsa.py b/homework01/rsa.py index b777be5..75a3a88 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -3,43 +3,32 @@ def is_prime(n: int) -> bool: - """ - Tests to see if a number is prime. - - >>> is_prime(2) - True - >>> is_prime(11) - True - >>> is_prime(8) - False - """ - # PUT YOUR CODE HERE - pass + for div in range(2, int(n**0.5) + 1): + if n % div == 0: + return False + return n != 1 def gcd(a: int, b: int) -> int: - """ - Euclid's algorithm for determining the greatest common divisor. + if b == 0: + return a + return gcd(b, a % b) - >>> gcd(12, 15) - 3 - >>> gcd(3, 7) - 1 - """ - # PUT YOUR CODE HERE - pass +def gcdex(a, b): + if b == 0: + return a, 1, 0 + else: + d, x, y = gcdex(b, a % b) + return d, y, x - y * (a // b) -def multiplicative_inverse(e: int, phi: int) -> int: - """ - Euclid's extended algorithm for finding the multiplicative - inverse of two numbers. - >>> multiplicative_inverse(7, 40) - 23 - """ - # PUT YOUR CODE HERE - pass +def multiplicative_inverse(a: int, n: int) -> int: + d, x, y = gcdex(a, n) + if d == 1: + return (x % n + n) % n + else: + return 0 def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[int, int]]: @@ -49,10 +38,10 @@ def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[in raise ValueError("p and q cannot be equal") # n = pq - # PUT YOUR CODE HERE + n = p * q # phi = (p-1)(q-1) - # PUT YOUR CODE HERE + phi = (p - 1) * (q - 1) # Choose an integer e such that e and phi(n) are coprime e = random.randrange(1, phi) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index e51742e..e0d8da3 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,30 +1,25 @@ -def encrypt_vigenere(plaintext: str, keyword: str) -> str: - """ - Encrypts plaintext using a Vigenere cipher. +from string import ascii_lowercase as lower - >>> encrypt_vigenere("PYTHON", "A") - 'PYTHON' - >>> encrypt_vigenere("python", "a") - 'python' - >>> encrypt_vigenere("ATTACKATDAWN", "LEMON") - 'LXFOPVEFRNHR' - """ - ciphertext = "" - # PUT YOUR CODE HERE - return ciphertext +table = [[lower[(lower.index(char) + shift) % 26] for char in lower] for shift in range(26)] -def decrypt_vigenere(ciphertext: str, keyword: str) -> str: - """ - Decrypts a ciphertext using a Vigenere cipher. - >>> decrypt_vigenere("PYTHON", "A") - 'PYTHON' - >>> decrypt_vigenere("python", "a") - 'python' - >>> decrypt_vigenere("LXFOPVEFRNHR", "LEMON") - 'ATTACKATDAWN' - """ - plaintext = "" - # PUT YOUR CODE HERE - return plaintext +def encrypt_vigenere(plaintext: str, keyword: str, encode: bool = True) -> str: + ciphertext = [] + for index, char in enumerate(plaintext.lower()): + if char.isalpha(): + keyword_char = keyword[index % len(keyword)].lower() + keyword_char_index = lower.index(keyword_char) + if encode: + char = table[keyword_char_index][lower.index(char)] + else: + table_char_index = table[keyword_char_index].index(char) + char = lower[table_char_index] + if plaintext[index].isupper(): + char = char.upper() + ciphertext.append(char) + return "".join(ciphertext) + + +def decrypt_vigenere(ciphertext: str, keyword: str) -> str: + return encrypt_vigenere(ciphertext, keyword, encode=False) From eb692496ee3de42c9885b39a245179589e1c8479 Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Sun, 2 Oct 2022 13:06:40 +0300 Subject: [PATCH 3/8] Completed lab-01 --- homework01/caesar.py | 3 ++- homework01/vigenere.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/homework01/caesar.py b/homework01/caesar.py index 38bc9c9..381e7ba 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -1,5 +1,6 @@ +from string import ascii_lowercase as lower +from string import ascii_uppercase as upper import typing as tp -from string import ascii_lowercase as lower, ascii_uppercase as upper def encrypt_caesar(plaintext: str, shift: int = 3) -> str: diff --git a/homework01/vigenere.py b/homework01/vigenere.py index e0d8da3..5251dcf 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,7 +1,8 @@ from string import ascii_lowercase as lower -table = [[lower[(lower.index(char) + shift) % 26] for char in lower] for shift in range(26)] +table = [[lower[(lower.index(char) + shift) % 26] + for char in lower] for shift in range(26)] def encrypt_vigenere(plaintext: str, keyword: str, encode: bool = True) -> str: From 2a5dc50874c8d73ab76058fd53f2288b61a8a455 Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Sun, 2 Oct 2022 13:09:32 +0300 Subject: [PATCH 4/8] Completed lab-01 --- homework01/caesar.py | 2 +- homework01/vigenere.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/homework01/caesar.py b/homework01/caesar.py index 381e7ba..7b05368 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -1,6 +1,6 @@ +import typing as tp from string import ascii_lowercase as lower from string import ascii_uppercase as upper -import typing as tp def encrypt_caesar(plaintext: str, shift: int = 3) -> str: diff --git a/homework01/vigenere.py b/homework01/vigenere.py index 5251dcf..3ffb062 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,6 +1,5 @@ from string import ascii_lowercase as lower - table = [[lower[(lower.index(char) + shift) % 26] for char in lower] for shift in range(26)] From 3c2ac2e3def284bbee6049e3ebfad72dc11844a3 Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Sun, 2 Oct 2022 13:11:57 +0300 Subject: [PATCH 5/8] Completed lab-01 --- homework01/rsa.py | 4 ++-- homework01/vigenere.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 75a3a88..2378b58 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -65,7 +65,7 @@ def encrypt(pk: tp.Tuple[int, int], plaintext: str) -> tp.List[int]: key, n = pk # Convert each letter in the plaintext to numbers based on # the character using a^b mod m - cipher = [(ord(char) ** key) % n for char in plaintext] + cipher = [(ord(char)**key) % n for char in plaintext] # Return the array of bytes return cipher @@ -74,7 +74,7 @@ def decrypt(pk: tp.Tuple[int, int], ciphertext: tp.List[int]) -> str: # Unpack the key into its components key, n = pk # Generate the plaintext based on the ciphertext and key using a^b mod m - plain = [chr((char ** key) % n) for char in ciphertext] + plain = [chr((char**key) % n) for char in ciphertext] # Return the array of bytes as a string return "".join(plain) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index 3ffb062..4502160 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,7 +1,6 @@ from string import ascii_lowercase as lower -table = [[lower[(lower.index(char) + shift) % 26] - for char in lower] for shift in range(26)] +table = [[lower[(lower.index(char) + shift) % 26] for char in lower] for shift in range(26)] def encrypt_vigenere(plaintext: str, keyword: str, encode: bool = True) -> str: From b768a8055ea7367ba5b8eac46a0270a13cc68eaa Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Sun, 2 Oct 2022 13:14:35 +0300 Subject: [PATCH 6/8] Completed lab-01 --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 2378b58..1d56554 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -65,7 +65,7 @@ def encrypt(pk: tp.Tuple[int, int], plaintext: str) -> tp.List[int]: key, n = pk # Convert each letter in the plaintext to numbers based on # the character using a^b mod m - cipher = [(ord(char)**key) % n for char in plaintext] + cipher = [(ord(char) ** key) % n for char in plaintext] # Return the array of bytes return cipher From a4dc7ad74807824cc82aaee152d4f833ff099a0a Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Wed, 5 Oct 2022 16:12:31 +0300 Subject: [PATCH 7/8] Completed lab-01 --- homework01/vigenere.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index 4502160..d0086b3 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,22 +1,16 @@ -from string import ascii_lowercase as lower - -table = [[lower[(lower.index(char) + shift) % 26] for char in lower] for shift in range(26)] +from caesar import encrypt_caesar, decrypt_caesar def encrypt_vigenere(plaintext: str, keyword: str, encode: bool = True) -> str: ciphertext = [] for index, char in enumerate(plaintext.lower()): - if char.isalpha(): - keyword_char = keyword[index % len(keyword)].lower() - keyword_char_index = lower.index(keyword_char) - if encode: - char = table[keyword_char_index][lower.index(char)] - else: - table_char_index = table[keyword_char_index].index(char) - char = lower[table_char_index] - if plaintext[index].isupper(): - char = char.upper() - ciphertext.append(char) + shift = ord(keyword[index % len(keyword)].lower()) - 97 + if encode: + ciphertext.append(encrypt_caesar(char, shift)) + else: + ciphertext.append(decrypt_caesar(char, shift)) + if plaintext[index].isupper(): + ciphertext[-1] = ciphertext[-1].upper() return "".join(ciphertext) From ccc77a8c0ac82ed4c6b14a6664ca33a42988cccf Mon Sep 17 00:00:00 2001 From: Alexander Zakharchuk Date: Wed, 5 Oct 2022 16:14:17 +0300 Subject: [PATCH 8/8] Completed lab-01 --- homework01/vigenere.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index d0086b3..1cbb09d 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -1,4 +1,4 @@ -from caesar import encrypt_caesar, decrypt_caesar +from caesar import decrypt_caesar, encrypt_caesar def encrypt_vigenere(plaintext: str, keyword: str, encode: bool = True) -> str: