Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RSA Cipher with blocks
#1
Hi, I really need help. I need to create encryption using block access after 10 characters and with lower_limit = 10 ** 11 and upper_limit = 10 ** 12, but I don't know how to do it. I created two codes, each of which only works from scratch and I don't know how to make it work well. The first code works fine for any character length, but it doesn't work for more than 8 bits and n must be lower_limit = 10 ** 12 and upper_limit = 10 ** 13. Code 2 only works for a maximum of 8 characters, but it also works for 9 bit and for n lower_limit = 10 ** 11 and upper_limit = 10 ** 12.


Code 1
import random
from math import gcd
from sympy import mod_inverse, isprime

class SimpleRSA:
    def __init__(self):
        self.public_key = None
        self.private_key = None

    def generate_keypair(self):
        if self.public_key is not None and self.private_key is not None:
            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)

        return self.public_key, self.private_key

    def generate_large_prime(self):
        lower_limit = 10 ** 12
        upper_limit = 10 ** 13
        potential_prime = random.randint(lower_limit, upper_limit)
        while not 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):
        binary_blocks = [
            ''.join(format(ord(char), '08b') for char in text[i:i + block_size]).rjust(block_size * 8, '0')
            for i in range(0, len(text), block_size)
        ]
        return binary_blocks

    def numeric_to_text_binary_blocks(self, binary_blocks):
        bytes_list = [int(block, 2).to_bytes((len(block) + 7) // 8, 'big') for block in binary_blocks]
        text = b''.join(bytes_list).decode(errors='replace')
        return text


def test_encryption_decryption(message):
    rsa = SimpleRSA()
    public_key, private_key = rsa.generate_keypair()

    print(f"Public key (n): {public_key[0]}")

    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("hello")
Code 2
import random
from sympy import isprime, gcd, mod_inverse


def text_to_numeric_binary_blocks(text):
    block_size = 10  # Set block size to 10 bits
    numeric_decimal_blocks = []

    for i in range(0, len(text), block_size):
        block = text[i:i + block_size]
        numeric_decimal_block = int(''.join(format(ord(char), '010b') for char in block), 2)
        numeric_decimal_blocks.append(numeric_decimal_block)

    numeric_binary_blocks = [format(block, '010b') for block in numeric_decimal_blocks]

    return numeric_decimal_blocks, numeric_binary_blocks


def numeric_to_text_binary_blocks(numeric_decimal_blocks):
    # Convert each numeric block to a string and then concatenate them
    numeric_representation = ''.join(map(str, numeric_decimal_blocks))
    # Convert the combined string to an integer
    numeric_representation = int(numeric_representation)
    # Convert the integer to binary representation
    binary_representation = format(numeric_representation, 'b')

    # Pad the binary representation to ensure a multiple of 10 for ASCII conversion
    binary_representation = binary_representation.rjust(((len(binary_representation) + 9) // 10) * 10, '0')

    # Convert each 10-bit chunk back to an integer and then to its ASCII character
    text = ''.join(chr(int(binary_representation[i:i + 10], 2)) for i in range(0, len(binary_representation), 10))

    return text, numeric_decimal_blocks


def generate_keypair():
    p = generate_large_prime()
    q = 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)

    global public_key, private_key
    public_key = (n, e)
    private_key = (n, d)

    private_key_str = f"{private_key[0]} {private_key[1]}"
    public_key_str = f"{public_key[0]} {public_key[1]}"


def generate_large_prime():
    lower_limit = 10 ** 11
    upper_limit = 10 ** 12
    potential_prime = random.randint(lower_limit, upper_limit)
    while not isprime(potential_prime):
        potential_prime = random.randint(lower_limit, upper_limit)
    return potential_prime


def encrypt(message, public_key):
    n, e = public_key
    numeric_decimal_blocks, _ = text_to_numeric_binary_blocks(message)

    # Encrypt each block using the public key
    encrypted_blocks = [pow(block, e, n) for block in numeric_decimal_blocks]

    return encrypted_blocks


def decrypt(encrypted_blocks, private_key):
    n, d = private_key

    # Decrypt each block using the private key
    decrypted_blocks = [pow(block, d, n) for block in encrypted_blocks]

    # Convert the numeric blocks back to text
    decrypted_message, _ = numeric_to_text_binary_blocks(decrypted_blocks)

    return decrypted_message

generate_keypair()

# Example usage:
message_to_encrypt = "hello"
encrypted_blocks = encrypt(message_to_encrypt, public_key)
decrypted_message = decrypt(encrypted_blocks, private_key)

print("Original Message:", message_to_encrypt)
print("Encrypted Blocks:", encrypted_blocks)
print("Decrypted Message:", decrypted_message)
Larz60+ write Nov-24-2023, 10:34 PM:
Please post all code, output and errors (it it's entirety) between their respective tags. Refer to BBCode help topic on how to post. Use the "Preview Post" button to make sure the code is presented as you expect before hitting the "Post Reply/Thread" button.
plaese refrain from using attachments. I for one will not open them.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Cesar Cipher ForsakenDusk 5 480 Apr-07-2024, 04:30 PM
Last Post: Pedroski55
Question Rsa Cipher Paragoon2 3 650 Nov-27-2023, 12:30 PM
Last Post: snippsat
  How to properly format rows and columns in excel data from parsed .txt blocks jh67 7 1,890 Dec-12-2022, 08:22 PM
Last Post: jh67
  Caesar Cipher Help pbrowne 2 2,187 Jun-30-2021, 02:36 PM
Last Post: deanhystad
  Am I a retard - else and finally blocks in a try statement RubenF85 6 2,606 Jan-12-2021, 05:56 PM
Last Post: bowlofred
  How to tabulate correctly repeated blocks? Xiesxes 4 2,961 Mar-21-2020, 04:57 PM
Last Post: Xiesxes
  try/except blocks newbieAuggie2019 11 4,858 Oct-05-2019, 05:55 PM
Last Post: newbieAuggie2019
  Understanding program blocks newbieAuggie2019 2 1,975 Oct-02-2019, 06:22 PM
Last Post: newbieAuggie2019
  The Empty List Blocks Recursion leoahum 6 5,341 Mar-05-2019, 06:55 PM
Last Post: leoahum

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020