Potřeboval bych pomoct upravit kod aby fungoval pro velikost 10,
block_size=10. Pro velikost 8, block_size=8 funguje spravně, pokud mám
block_size=8
import random
from math import gcd
from sympy import mod_inverse, isprime
class SimpleRSA:
def__init__(self):
self.public_key = None
self.private_key = Nonedef generate_keypair(self):
if self.public_key isnotNoneand self.private_key isnotNone:
return
p = self.generate_large_prime()
q = self.generate_large_prime()
n = p * q
phi = (p - 1) * (q - 1)
e = random.randint(2, phi - 1)
while gcd(e, phi) != 1:
e = random.randint(2, phi - 1)
d = mod_inverse(e, phi)
self.public_key = (n, e)
self.private_key = (n, d)
print(f"p: {p}")
print(f"q: {q}")
print(f"n: {n}")
return self.public_key, self.private_key
def generate_large_prime(self):
lower_limit = 10 ** 11
upper_limit = 10 ** 12
potential_prime = random.randint(lower_limit, upper_limit)
whilenot isprime(potential_prime):
potential_prime = random.randint(lower_limit, upper_limit)
return potential_prime
def encrypt(self, message):
n, e = self.public_key
binary_blocks = self.text_to_numeric_binary_blocks(message)
print(f"binary_blocks: {binary_blocks}")
encrypted_blocks = [pow(int(block, 2), e, n) for block in binary_blocks]
print(f"encrypted_blocks: {encrypted_blocks}")
return encrypted_blocks
def decrypt(self, encrypted_blocks):
n, d = self.private_key
decrypted_blocks = [format(pow(block, d, n), '0b') for block in encrypted_blocks]
print(f"decrypted_blocks: {decrypted_blocks}")
decrypted_message = self.numeric_to_text_binary_blocks(decrypted_blocks)
print(f"decrypted_message: {decrypted_message}")
return decrypted_message
def text_to_numeric_binary_blocks(self, text, block_size=10):
text = text.encode()
binary_blocks = [
''.join(format(byte, '08b') for byte in text[i:i + block_size]).ljust(block_size * 8, '0')
for i inrange(0, len(text), block_size)
]
return binary_blocks
def numeric_to_text_binary_blocks(self, binary_blocks, block_size=10):
bytes_list = [int(block, 2).to_bytes(block_size, 'big') for block in binary_blocks]
text = b''.join(bytes_list).decode(errors='replace').rstrip("\x00")
return text
def test_encryption_decryption(message):
rsa = SimpleRSA()
public_key, private_key = rsa.generate_keypair()
print(f"Original message: {message}")
# Encryption
encrypted_blocks = rsa.encrypt(message)
print(f"Encrypted blocks: {encrypted_blocks}")
# Decryption
decrypted_message = rsa.decrypt(encrypted_blocks)
print(f"Decrypted message: {decrypted_message}")
if__name__ == "__main__":
test_encryption_decryption("kolotoč")
Zkusil jsem: Zkoušel jsem změnit velikost na 10, ale problém je že v
časti:lower_limit = 10 ** 11,upper_limit = 10 ** 12, velikost někdy nesedí a
kod se vygeneruje špatně.
Chci docílit: Chtěl bych, aby kod fungoval pro block_size=10, ale délka
musí být lower_limit = 10 ** 11,upper_limit = 10 ** 12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.