From 001abe16682d08a01a907cc6a5fc6213650e2ff7 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:51:44 +0300 Subject: [PATCH 01/22] Update rsa.py --- homework01/rsa.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index a3578ab..1422b26 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -18,7 +18,6 @@ def is_prime(n: int) -> bool: k = 1 if k > 0: return False - return True From d28cdefb9dc9dc63644cd25678bd72cb6bf786c2 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:53:52 +0300 Subject: [PATCH 02/22] Update rsa.py --- homework01/rsa.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 1422b26..1b4983d 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,4 +1,3 @@ -import random import typing as tp def is_prime(n: int) -> bool: @@ -21,7 +20,7 @@ def is_prime(n: int) -> bool: return True -def gcd(a: int, b: int) -> int: +def gcd(a: int, b: int) -> int:ra """ Euclid's algorithm for determining the greatest common divisor. From abb43d910ea5642015b2f6116b1c9ca2f749e304 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:55:27 +0300 Subject: [PATCH 03/22] Update rsa.py --- homework01/rsa.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 1b4983d..bbc9737 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,5 +1,4 @@ import typing as tp - def is_prime(n: int) -> bool: """ Tests to see if a number is prime. From 1af5622baee0b6e73c1d431c32fa8d1688b5b3bd Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:56:43 +0300 Subject: [PATCH 04/22] Update rsa.py --- homework01/rsa.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homework01/rsa.py b/homework01/rsa.py index bbc9737..fc6da76 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,4 +1,6 @@ import typing as tp + + def is_prime(n: int) -> bool: """ Tests to see if a number is prime. From 64c8edcc5fda58f1237e701762f442076f06ac2a Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:57:06 +0300 Subject: [PATCH 05/22] Update caesar.py --- homework01/caesar.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homework01/caesar.py b/homework01/caesar.py index 3d77953..a861b7f 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -1,5 +1,6 @@ import typing as tp + def encrypt_caesar(plaintext: str, shift: int = 3) -> str: """ Encrypts plaintext using a Caesar cipher. From f4e9030aeea90fb177dd1e8d057e76c7e80be912 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:58:33 +0300 Subject: [PATCH 06/22] Update caesar.py --- homework01/caesar.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homework01/caesar.py b/homework01/caesar.py index a861b7f..8acbc0c 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -33,6 +33,7 @@ def encrypt_caesar(plaintext: str, shift: int = 3) -> str: return ciphertext + def decrypt_caesar(ciphertext: str, shift: int = 3) -> str: """ Decrypts a ciphertext using a Caesar cipher. From 91bb1a93f516a9032bbcd4574e5e8933da379487 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:01:52 +0300 Subject: [PATCH 07/22] Update rsa.py --- homework01/rsa.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index fc6da76..9b96fdd 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -2,16 +2,6 @@ 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 - """ k = 0 for i in range(2, n): if n % i == 0: @@ -22,14 +12,6 @@ def is_prime(n: int) -> bool: def gcd(a: int, b: int) -> int:ra - """ - Euclid's algorithm for determining the greatest common divisor. - - >>> gcd(12, 15) - 3 - >>> gcd(3, 7) - 1 - """ while a != 0 and b != 0: if a >= b: a %= b @@ -39,13 +21,6 @@ def gcd(a: int, b: int) -> int:ra 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 - """ return pow(e, -1, phi) @@ -56,44 +31,30 @@ 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 = p * q - # PUT YOUR CODE HERE phi = (p-1) * (q-1) - # PUT YOUR CODE HERE - # Choose an integer e such that e and phi(n) are coprime e = random.randrange(1, phi) - # Use Euclid's Algorithm to verify that e and phi(n) are coprime g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) - # Use Extended Euclid's Algorithm to generate the private key d = multiplicative_inverse(e, phi) - # Return public and private keypair - # Public key is (e, n) and private key is (d, n) return ((e, n), (d, n)) def encrypt(pk: tp.Tuple[int, int], plaintext: str) -> tp.List[int]: - # Unpack the key into it's components 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] - # Return the array of bytes return cipher 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] - # Return the array of bytes as a string return "".join(plain) From 9f9ee606e0483b66cbc09fb3b6c8a053a062b327 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:03:26 +0300 Subject: [PATCH 08/22] Update rsa.py --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 9b96fdd..2f84df9 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -11,7 +11,7 @@ def is_prime(n: int) -> bool: return True -def gcd(a: int, b: int) -> int:ra +def gcd(a: int, b: int) -> int: while a != 0 and b != 0: if a >= b: a %= b From 0403f16804003412b8ba506f6af2d9fb7c2e1f2b Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:05:27 +0300 Subject: [PATCH 09/22] Update rsa.py --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 2f84df9..b15b079 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -32,7 +32,7 @@ def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[in n = p * q - phi = (p-1) * (q-1) + phi = (p - 1) * (q - 1) e = random.randrange(1, phi) From 54d318e8bb494ae829319d520ecff4192c9e51fa Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:07:57 +0300 Subject: [PATCH 10/22] Update rsa.py --- homework01/rsa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index b15b079..1740a81 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -48,13 +48,13 @@ def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[in def encrypt(pk: tp.Tuple[int, int], plaintext: str) -> tp.List[int]: key, n = pk - cipher = [(ord(char) ** key) % n for char in plaintext] + cipher = [(ord(char)**key) % n for char in plaintext] return cipher def decrypt(pk: tp.Tuple[int, int], ciphertext: tp.List[int]) -> str: key, n = pk - plain = [chr((char ** key) % n) for char in ciphertext] + plain = [chr((char**key) % n) for char in ciphertext] return "".join(plain) From 4b5223e0e2a93d342e53b04e94608543c1f7e7ee Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:09:26 +0300 Subject: [PATCH 11/22] Update rsa.py --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 1740a81..24ac755 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -48,7 +48,7 @@ def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[in def encrypt(pk: tp.Tuple[int, int], plaintext: str) -> tp.List[int]: key, n = pk - cipher = [(ord(char)**key) % n for char in plaintext] + cipher = [(ord(char) ** key) % n for char in plaintext] return cipher From 4e41d29bb5e5b6d3675c90e63209c5364824e790 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:11:33 +0300 Subject: [PATCH 12/22] Update rsa.py --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 24ac755..ac5aeb9 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,5 +1,5 @@ import typing as tp - +import random def is_prime(n: int) -> bool: k = 0 From 07157f8e8f794e212f29bda03b1875799a502063 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:14:26 +0300 Subject: [PATCH 13/22] Update rsa.py --- homework01/rsa.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index ac5aeb9..ada8ba8 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,5 +1,5 @@ import typing as tp -import random + def is_prime(n: int) -> bool: k = 0 @@ -25,6 +25,7 @@ def multiplicative_inverse(e: int, phi: int) -> int: def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[int, int]]: + import random if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") elif p == q: From 190310237404c1f9c0ac9de32bea178796910660 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:16:49 +0300 Subject: [PATCH 14/22] Update rsa.py --- homework01/rsa.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homework01/rsa.py b/homework01/rsa.py index ada8ba8..00b4829 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -26,6 +26,7 @@ def multiplicative_inverse(e: int, phi: int) -> int: def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[int, int]]: import random + if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") elif p == q: From e746942fc61af36f5662e8e620a7db4e8ba8ba31 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:21:11 +0300 Subject: [PATCH 15/22] Update rsa.py --- homework01/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 00b4829..6f8f776 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -1,3 +1,4 @@ +import random import typing as tp @@ -25,7 +26,6 @@ def multiplicative_inverse(e: int, phi: int) -> int: def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[int, int]]: - import random if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") From f66e1a63827fb1639dfefe6eb4a68a72b5efc525 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:23:25 +0300 Subject: [PATCH 16/22] Update rsa.py --- homework01/rsa.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 6f8f776..12f61da 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -26,7 +26,6 @@ def multiplicative_inverse(e: int, phi: int) -> int: def generate_keypair(p: int, q: int) -> tp.Tuple[tp.Tuple[int, int], tp.Tuple[int, int]]: - if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") elif p == q: From 77aa151f5c71377e784c6877c45a45bf1649786e Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:33:51 +0300 Subject: [PATCH 17/22] Update caesar.py --- homework01/caesar.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/homework01/caesar.py b/homework01/caesar.py index 8acbc0c..f6b9c6a 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -15,22 +15,14 @@ def encrypt_caesar(plaintext: str, shift: int = 3) -> str: '' """ ciphertext = "" - for i in plaintext: - if 65 <= ord(i) <= 122: + if i.isalpha(): if i.isupper(): - if ord(i) >= 87: - ciphertext += chr(65 + (ord(i) + shift) % 91) - else: - ciphertext += chr(ord(i) + shift) + ciphertext += chr(((ord(i) - ord("A")) + shift) % 26 + ord("A")) else: - if ord(i) >= 119: - ciphertext += chr(97 + (ord(i) + shift) % 123) - else: - ciphertext += chr(ord(i) + shift) + ciphertext += chr(((ord(i) - ord("a")) + shift) % 26 + ord("a")) else: ciphertext += i - return ciphertext From 78f696e6bf794228837f52b41b48de201db0626e Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:35:58 +0300 Subject: [PATCH 18/22] Update caesar.py --- homework01/caesar.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/homework01/caesar.py b/homework01/caesar.py index f6b9c6a..bd7cc6c 100644 --- a/homework01/caesar.py +++ b/homework01/caesar.py @@ -40,22 +40,14 @@ def decrypt_caesar(ciphertext: str, shift: int = 3) -> str: '' """ plaintext = "" - for i in ciphertext: - if 65 <= ord(i) <= 122: + if i.isalpha(): if i.isupper(): - if ord(i) <= 68: - plaintext += chr(90 - (2 - (ord(i) % 65))) - else: - plaintext += chr(ord(i) - shift) + plaintext += chr(((ord(i) - ord("A")) - shift) % 26 + ord("A")) else: - if ord(i) <= 99: - plaintext += chr(122 - (2 - (ord(i) % 97))) - else: - plaintext += chr(ord(i) - shift) + plaintext += chr(((ord(i) - ord("a")) - shift) % 26 + ord("a")) else: plaintext += i - return plaintext From ceb00573e6c45372a7786755373377e991809c34 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:39:45 +0300 Subject: [PATCH 19/22] Update vigenere.py --- homework01/vigenere.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index 933911b..45b8f4b 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -18,6 +18,7 @@ def encrypt_vigenere(plaintext: str, keyword: str) -> str: for i in range(len(plaintext_int)): if plaintext_int[i] == 32: plaintext += " " + continue elif plaintext[i].isupper(): value = (plaintext_int[i] + key_int[i % key_length]) % 26 ciphertext += chr(value + 65) @@ -47,6 +48,7 @@ def decrypt_vigenere(ciphertext: str, keyword: str) -> str: for i in range(len(ciphertext_int)): if ciphertext_int[i] == 32: plaintext += " " + continue elif chr(ciphertext_int[i]).isupper(): value = (ciphertext_int[i] - key_int[i % key_length]) % 26 plaintext += chr(value + 65) From 0c966c6acd762867817bffd67f1488a9dbe0e872 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:54:59 +0300 Subject: [PATCH 20/22] Update vigenere.py --- homework01/vigenere.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index 45b8f4b..b35668c 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -17,7 +17,7 @@ def encrypt_vigenere(plaintext: str, keyword: str) -> str: for i in range(len(plaintext_int)): if plaintext_int[i] == 32: - plaintext += " " + ciphertext += " " continue elif plaintext[i].isupper(): value = (plaintext_int[i] + key_int[i % key_length]) % 26 From eaa9a13a27e17279680ca0be921ede031fdc94a3 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:17:03 +0300 Subject: [PATCH 21/22] Update vigenere.py --- homework01/vigenere.py | 57 +++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/homework01/vigenere.py b/homework01/vigenere.py index b35668c..1f27a2e 100644 --- a/homework01/vigenere.py +++ b/homework01/vigenere.py @@ -10,22 +10,24 @@ def encrypt_vigenere(plaintext: str, keyword: str) -> str: 'LXFOPVEFRNHR' """ ciphertext = "" - - key_length = len(keyword) - key_int = [ord(i) for i in keyword] - plaintext_int = [ord(i) for i in plaintext] - - for i in range(len(plaintext_int)): - if plaintext_int[i] == 32: - ciphertext += " " - continue - elif plaintext[i].isupper(): - value = (plaintext_int[i] + key_int[i % key_length]) % 26 - ciphertext += chr(value + 65) + for i in range(len(plaintext)): + if plaintext[i].isalpha(): + if plaintext[i].isupper(): + ciphertext += chr( + (ord(plaintext[i]) - 2 * ord("A") + ord(keyword[i % len(keyword)].upper())) + % 26 + % 26 + + ord("A") + ) + else: + ciphertext += chr( + (ord(plaintext[i]) - 2 * ord("a") + ord(keyword[i % len(keyword)].lower())) + % 26 + % 26 + + ord("a") + ) else: - value = (plaintext_int[i] + key_int[i % key_length] - 64) % 26 - ciphertext += chr(value + 97) - + ciphertext += plaintext[i] return ciphertext @@ -41,19 +43,16 @@ def decrypt_vigenere(ciphertext: str, keyword: str) -> str: 'ATTACKATDAWN' """ plaintext = "" - key_length = len(keyword) - key_int = [ord(i) for i in keyword] - ciphertext_int = [ord(i) for i in ciphertext] - - for i in range(len(ciphertext_int)): - if ciphertext_int[i] == 32: - plaintext += " " - continue - elif chr(ciphertext_int[i]).isupper(): - value = (ciphertext_int[i] - key_int[i % key_length]) % 26 - plaintext += chr(value + 65) + for i in range(len(ciphertext)): + if ciphertext[i].isalpha(): + if ciphertext[i].isupper(): + plaintext += chr( + (ord(ciphertext[i]) - ord(keyword[i % len(keyword)].upper())) % 26 + ord("A") + ) + else: + plaintext += chr( + (ord(ciphertext[i]) - ord(keyword[i % len(keyword)].lower())) % 26 + ord("a") + ) else: - value = (ciphertext_int[i] - key_int[i % key_length]) % 26 - plaintext += chr(value + 97) - + plaintext += ciphertext[i] return plaintext From 69a719af2b8677ccd6708959eb4f02b350aad299 Mon Sep 17 00:00:00 2001 From: 857l <61349357+857l@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:19:20 +0300 Subject: [PATCH 22/22] Update rsa.py --- homework01/rsa.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/homework01/rsa.py b/homework01/rsa.py index 12f61da..2903f2b 100644 --- a/homework01/rsa.py +++ b/homework01/rsa.py @@ -3,13 +3,14 @@ def is_prime(n: int) -> bool: - k = 0 - for i in range(2, n): + if n <= 1: + return False + flag = True + for i in range(2, n // 2 + 1): if n % i == 0: - k = 1 - if k > 0: - return False - return True + flag = False + break + return flag def gcd(a: int, b: int) -> int: