【发布时间】:2017-06-02 19:08:39
【问题描述】:
我从文件图像中读取二进制文件,每个 128 字节,并使用 rsa 加密。但加密后我无法从二进制创建图像。我创建了函数生成密钥 rsa。我将二进制转换为 int 以进行加密
from PIL import Image
import KeyRSA
import RsaMath
pub, piv = KeyRSA.GenerateRsaKey(size=1024)
n, e = pub
with open("hinh.png", "rb") as infile:
data = infile.read()
step = 128
cipher_data = []
for i in range(0, len(data), step):
value = data[i:i+step]
m = RsaMath.OS2IP(value)
c = pow(m, e, n)
cipher_data.append(RsaMath.I2OSP(c, 128))
cipher_data = "".join(cipher_data)
im = Image.open("hinh.png")
W, H = im.size
img = Image.frombytes("RGB", (W,H), cipher_data)
img.show()e here
【问题讨论】:
-
KeyRSA和RsaMath来自哪里?您的问题是因为您正在加密 PNG 文件的字节,而不是原始像素数据。但是如果不知道KeyRSA和RsaMath模块函数的作用,就很难给出更具体的答案。 -
嗨。 KeyRSA 只是为 RSA 生成密钥。 RsaMath 包含 IO2SP 和 O2ISP 函数,用于将八位字节字符串转换为数字,将数字转换为八位字节字符串。
-
所以使用PIL打开源图片,使用图片
.tobytes方法获取原始像素字节数据。如果它是大小为 WxH 的 RGB 图像,您将获得 3*W*H 字节。我假设你的 RSA 编码算法输出的字节数与你只提供整个 128 字节块的字节数相同。 -
所以。当我加密时。我想从字节创建图像。怎么做。对不起,我不好
-
img = Image.frombytes("RGB", (W,H), cipher_data)将在cipher_data包含 恰好 3*W*H 字节时工作。 RSA 加密数据的生成图像只是看起来随机的噪声,但我认为这就是您想要的。