Nie no bez żartów? Przecież ten "projekt" to jest pół godziny roboty i można by się zamknąć w 30 linijkach pythona jeśli olejemy GUI. Na wyższej szkole gotowania na gazie może przejdzie...
Popatrz sobie może np. na https://www.ki.agh.edu.pl/theses-both-5/all
edit:
import gmpy2
from Crypto.Random import random
from Crypto.Util.number import bytes_to_long, long_to_bytes
from PIL import Image
def encrypt(data, modulus, picture_path, output_path):
enc = pow(bytes_to_long(data), 65537, modulus)
bits = bin(enc)[2:]
im = Image.open(picture_path)
pixels = im.load()
width = im.size[0]
height = im.size[1]
new = Image.new("RGB", (width, height))
start_index = width * height - len(bits)
data_index = 0
for i in range(width):
for j in range(height):
color = pixels[i, j]
if i * height + j >= start_index:
new_color = (color[2] & 0b11111110) | int(bits[data_index])
data_index += 1
else:
new_color = color[2] & 0b11111110
new.putpixel((i, j), (color[0], color[1], new_color))
new.save(output_path)
def decrypt(p, q, picture_path):
im = Image.open(picture_path)
pixels = im.load()
width = im.size[0]
height = im.size[1]
bits = []
for i in range(width):
for j in range(height):
color = pixels[i, j]
bit = color[2] & 1
bits.append(bit)
payload = int("".join(map(str, bits)), 2)
decrypted = pow(payload, gmpy2.invert(65537, (p - 1) * (q - 1)), p * q)
return long_to_bytes(decrypted)
def gen_prime():
return gmpy2.next_prime(random.randint(2 ** 511, 2 ** 512))
def main():
p, q = gen_prime(), gen_prime()
data = 'ala ma kota a sierotka ma rysia'
out_path = "encrypted.png"
encrypt(data, p * q, "input.png", out_path)
print(decrypt(p, q, out_path))
main()
GUI nie ma, ale robi dokładnie to co opisałeś ->
- Szyfruje RSA podane dane przy użyciu podanego klucza i umieszcza jako LSB jednego z kolorów
- Deszyfruje dane z podanego pliku przy użyciu podanego klucza
Wyszły 33 linijki, nie licząc importów i funkcji które pokazują jak to działa.