Побитовое исключающее ИЛИ
Чтобы реализовать шифрование и дешифрование изображений, нам сначала нужно освоить побитовый метод вычисления XOR в математике.
Операция XOR также называется половинным сложением, и ее алгоритм аналогичен двоичному сложению без переноса. В python вычисление XOR выполняется через символ «^». Ниже блогер специально приводит таблицу, в которой подробно объясняется операция побитового исключающего ИЛИ:
арифметика 1 | арифметика 2 | результат | код питона |
---|---|---|---|
0 | 0 | 0 | 0^0 |
0 | 1 | 1 | 0^1 |
1 | 0 | 1 | 1^0 |
1 | 1 | 0 | 1^1 |
Простое обобщение правила побитовой операции XOR: операция двух одинаковых чисел равна 0, а операция двух разных чисел равна 1. Побитовое исключающее ИЛИ используется не только для шифрования и расшифровки изображений, но также может подсчитывать через него разные числа.
Что такое шифрование и дешифрование изображений
Определение шифрования изображения: путем выполнения побитовой операции XOR над исходным изображением и изображением ключа.
Определение расшифровки изображения: выполнить побитовую операцию XOR над зашифрованным изображением и изображением ключа.
Из шифрования и дешифрования изображения видно, что все они представляют собой одну и ту же операцию.
Теперь мы указываем, что буквальное обозначение для XOR — это xor, и в соответствии с приведенной выше побитовой операцией XOR мы предполагаем:
xor(a,b)=c
то вы можете получить:
xor(c,b)=a
или:
xor(c,a)=b
Подводя итог, мы предполагаем, что a — это исходные данные изображения, а b — ключ, тогда c, вычисленное с помощью xor(a, c), является зашифрованным зашифрованным текстом. Простой обзор шифрования и дешифрования.
Процесс шифрования: выполните побитовую операцию XOR над изображением a и ключом b, чтобы завершить шифрование и получить зашифрованный текст c.
Процесс расшифровки: выполните побитовую операцию XOR над зашифрованным текстом c и ключом b, чтобы завершить расшифровку и получить изображение a.
зашифровать изображение
Теперь, когда мы полностью усвоили принцип шифрования и дешифрования изображения, давайте реализуем шифрование изображения с помощью кода. Точно так же здесь мы сначала получаем изображение в градациях серого.
import cv2
import numpy as np
img = cv2.imread("4.jpg", 0)
r, c = img.shape
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
encryption = cv2.bitwise_xor(img, key)
cv2.imshow("111", encryption)
cv2.waitKey()
cv2.destroyAllWindows()
После запуска получаем искаженное изображение:
расшифровать изображение
Расшифровка изображения с помощью побитовой операции XOR, здесь нам нужно использовать только зашифрованное изображение и ключ для выполнения побитового XOR, полный код выглядит следующим образом:
import cv2
import numpy as np
img = cv2.imread("4.jpg", 0)
r, c = img.shape
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
encryption = cv2.bitwise_xor(img, key)
decryption = cv2.bitwise_xor(encryption, key)
cv2.imshow("111", encryption)
cv2.imshow("222", decryption )
cv2.waitKey()
cv2.destroyAllWindows()
После запуска мы можем получить исходное изображение и зашифрованное изображение: