import cv2
import numpy as np
import matplotlib.pyplot as plt
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# تشفير الصورة باستخدام XOR
def encrypt_image(image):
    # توليف مفتاح تشفير عشوائي بطول أكبر
    key1 = np.random.randint(0, 256, size=image.shape, dtype=np.uint8)
    key2 = np.random.randint(0, 256, size=image.shape, dtype=np.uint8)

    # التشفير بواسطة XOR متعدد المراحل
    encrypted_image = cv2.bitwise_xor(image, key1)
    encrypted_image = cv2.bitwise_xor(encrypted_image, key2)

    return encrypted_image, key1, key2

# فك تشفير الصورة المشفرة بواسطة XOR
def decrypt_image(encrypted_image, key1, key2):
    # فك التشفير بواسطة XOR متعدد المراحل
    decrypted_image = cv2.bitwise_xor(encrypted_image, key2)
    decrypted_image = cv2.bitwise_xor(decrypted_image, key1)

    return decrypted_image

# خوارزمية التشفير الفوضوية باستخدام خريطة لوجيستية
def chaotic_encrypt_image(image):
    # المتغيرات التحكمية للخريطة اللوجستية
    r = 3.8
    x0 = 0.5

    # إعداد الخريطة اللوجستية
    def logistic_map(x, r):
        return r * x * (1 - x)

    # إعداد الصورة المشفرة
    encrypted_image = np.zeros_like(image, dtype=np.uint8)

    # بدء التشفير
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            pixel_value = image[i, j]

            # حساب القيمة الفوضوية
            x0 = logistic_map(x0, r)

            # تطبيق التشفير باستخدام XOR
            encrypted_pixel = pixel_value ^ int(x0 * 255)

            # تخزين القيمة المشفرة في الصورة المشفرة
            encrypted_image[i, j] = encrypted_pixel

    return encrypted_image

# فك تشفير الصورة المشفرة بواسطة الخوارزمية الفوضوية
def chaotic_decrypt_image(encrypted_image):
    # المتغيرات التحكمية للخريطة اللوجستية
    r = 3.8
    x0 = 0.5

    # إعداد الخريطة اللوجستية
    def logistic_map(x, r):
        return r * x * (1 - x)

    # إعداد الصورة المفككة
    decrypted_image = np.zeros_like(encrypted_image, dtype=np.uint8)

    # بدء فك التشفير
    for i in range(encrypted_image.shape[0]):
        for j in range(encrypted_image.shape[1]):
            encrypted_pixel = encrypted_image[i, j]

            # حساب القيمة الفوضوية
            x0 = logistic_map(x0, r)

            # تطبيق فك التشفير باستخدام XOR
            decrypted_pixel = encrypted_pixel ^ int(x0 * 255)

            # تخزين القيمة المفككة في الصورة المفككة
            decrypted_image[i, j] = decrypted_pixel

    return decrypted_image

# خوارزمية التشفير الخلوية
def cellular_encrypt_image(image):
    # قيم التحكم
    rule = 110
    rows, cols = image.shape

    # إعداد الصورة المشفرة
    encrypted_image = np.zeros_like(image, dtype=np.uint8)

    # بدء التشفير
    for i in range(1, rows):
        for j in range(cols):
            # حساب القيمة الفوضوية باستخدام الخوارزمية الخلوية
            encrypted_image[i, j] = image[i - 1, (j - 1) % cols] ^ image[i - 1, j] ^ image[i - 1, (j + 1) % cols]
            encrypted_image[i, j] ^= (rule >> ((image[i - 1, (j - 1) % cols] << 2) + (image[i - 1, j] << 1) + image[i - 1, (j + 1) % cols])) & 1

    return encrypted_image

# قراءة الصورة
x = cv2.imread(r'C:\Users\abdulwahed\Documents\photo enc\Kirigiri.Kyouko.full.3364419.jpg')
# تحويل الصورة إلى الرمادي
I = cv2.cvtColor(x, cv2.COLOR_BGR2GRAY)

# تشفير الصورة باستخدام XOR
encrypted_image_xor, key1, key2 = encrypt_image(I)

# فك تشفير الصورة المشفرة بواسطة XOR
decrypted_image_xor = decrypt_image(encrypted_image_xor, key1, key2)

# تشفير الصورة بخوارزمية التشفير الفوضوية
encrypted_image_chaotic = chaotic_encrypt_image(I)

# فك تشفير الصورة المشفرة بواسطة الخوارزمية الفوضوية
decrypted_image_chaotic = chaotic_decrypt_image(encrypted_image_chaotic)

# تشفير الصورة بخوارزمية التشفير الخلوية
encrypted_image_cellular = cellular_encrypt_image(I)

# عرض الصور
plt.figure(figsize=(15, 10))

plt.subplot(3, 3, 1)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(3, 3, 2)
plt.imshow(encrypted_image_xor, cmap='gray')
plt.title('Encrypted Image (XOR)')
plt.axis('off')

plt.subplot(3, 3, 3)
plt.imshow(decrypted_image_xor, cmap='gray')
plt.title('Decrypted Image (XOR)')
plt.axis('off')

plt.subplot(3, 3, 4)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(3, 3, 5)
plt.imshow(encrypted_image_chaotic, cmap='gray')
plt.title('Encrypted Image (Chaotic)')
plt.axis('off')

plt.subplot(3, 3, 6)
plt.imshow(decrypted_image_chaotic, cmap='gray')
plt.title('Decrypted Image (Chaotic)')
plt.axis('off')

plt.subplot(3, 3, 7)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(3, 3, 8)
plt.imshow(encrypted_image_cellular, cmap='gray')
plt.title('Encrypted Image (Cellular)')
plt.axis('off')

plt.subplot(3, 3, 9)
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.tight_layout()
plt.show()
this code use 3 type of encryption and 3 tpye of decrypte can you group all 3 togther (user enter photo the program apply all 3 encryption on it then decrypte with all decryption method) please edit and give me full working code