- [ ] XOR * 假設有一張黑白的相片是由很多個0 ~255 的 pixel 組成 (0 是黑色,255 是白色),這時候可以用任意的 KEY (00000000~2~ - 11111111~2~) 跟原本的每個 pixel 做運算,如果使用 AND (每個 bit 有 75% 機率會變成 `0`),所以圖會變暗。如果使用 OR (每個 bit 有 75% 機率會變 `1`),圖就會變亮。這兩種幾乎都還是看的出原本的圖片,但若是用 XOR 的話,每個 bit 變成 0 或 1 的機率都是 50%,所以圖片就會變成看不出東西的雜訊。 ![](https://hackpad-attachments.s3.amazonaws.com/embedded2016.hackpad.com_Sc7AmIvN7EN_p.578574_1463033229650_13199369_1147773728576962_1986608170_o.jpg) 上圖左 1 是原圖,左 2 是用 AND 做運算之後,右 2 是用 OR 做運算之後,右 1 是用 XOR,可見使用 XOR 的加密效果最好。 上面敘述出自:[你所不知道的 C 語言:數值系統](https://hackmd.io/@sysprog/c-numerics) ### 在這裡做些個人的紀錄 由於上面敘述會令人誤會,該KEY並非單一固定數值,而是以mask的方法運算,需注意及附上程式碼,其結果正如上圖。 ```python= import cv2 import numpy as np import matplotlib.pyplot as plt def apply_operation(image, operation): # Generate a random mask based on probabilities if operation == "and": mask = np.random.randint(0, 256, size=image.shape) # 75% zeros result = image & mask elif operation == "or": mask = np.random.randint(0, 256, size=image.shape) # 75% ones result = image | mask elif operation == "xor": mask = np.random.randint(0, 256, size=image.shape) # 50% 0s and 1s result = image ^ mask else: return None return result # Load image in grayscale image_path = "/content/head.jpg" original_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Apply operations and_image = apply_operation(original_image, "and") or_image = apply_operation(original_image, "or") xor_image = apply_operation(original_image, "xor") # Display results plt.figure(figsize=(15, 5)) plt.subplot(1, 4, 1) plt.imshow(original_image, cmap='gray') plt.title("Original Image") plt.subplot(1, 4, 2) plt.imshow(and_image, cmap='gray') plt.title("AND Operation") plt.subplot(1, 4, 3) plt.imshow(or_image, cmap='gray') plt.title("OR Operation") plt.subplot(1, 4, 4) plt.imshow(xor_image, cmap='gray') plt.title("XOR Operation") plt.tight_layout() plt.show() ```