社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何根据python中的种子生成特定大小的密钥

Chase • 5 年前 • 1353 次点击  

我用的是 pycryptodome 模块及其AES功能来加密某些数据。但是我需要为 AEScipher 我以后可以找回的。该项目以图像的形式存储所有私有数据(包括密钥)。基本上我们使用一个像素数组并使用 PIL 并使用 getdata() 功能。

要创建图像:-

array = numpy.array(pixels, dtype = numpy.uint8)
new_image = Image.fromarray(array)
new_image.save('user_key.png')

整数元组列表 [[(...), (...)], [(...), (...)], ...] 这是带钥匙的物体 要从图像中获取密钥,请执行以下操作:-

im = Image.open(image_path)
return list(im.getdata())

AES key ,假设我用 Random.get_random_bytes(AES.key_size) 从加密模块。

如何生成加密安全密钥,同时使用 pixels ,比如一个整数元组?

编辑:-

要详细说明,pixels对象是 整数元组列表 像素对象的第0个索引 可能看起来像这样- [(69, 147, 245), (120, 212, 198), ...] 这个 key_list 我指的对象实际上是 list(im.getdata()) . 这是一个 整数元组列表 ,每个元组包含3个整数,每个整数的范围为0到255。这看起来像这样- [(69, 147, 245), (120, 212, 198)....] 关键字列表第0个索引 (69, 147, 245)

我需要将AES密钥存储在与这些值相同的位置。理想情况下,我希望将AES密钥存储为3个从0到255的整数的元组。所以是的,我需要将AES密钥转换为元组,然后将其存储在 .

另一个关键细节是,元组包含3个整数,因为它们分别表示用于创建图像的RGB值。我相信元组可以用4个整数来表示RGBA值。这样就解决了3的倍数问题。

但还有一个问题。每个元组 实际上是通过 [i for i in itertools.product(range(256), repeat=3)] . 为了生成一个由4个整数而不是3组成的元组,我必须更改 repeat=3 repeat=4 ,这会引起纪念。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56627
 
1353 次点击  
文章 [ 1 ]  |  最新文章 5 年前
martineau
Reply   •   1 楼
martineau    5 年前

这里有一个函数,可以用来将字节字符串中的值分成指定大小的元组。字节字符串首先作为整数列表输出,然后是与之对应的元组列表。请注意,在示例中,最后一个元组的最后两个值除以3后,是如何用零填充的,因为字节字符串长度(16)不是该值的倍数。在将其分成大小为4的元组时不会发生这种情况(因此没有附加填充值)。

还要注意 grouper() itertools documentation .

from itertools import zip_longest

def grouper(n, iterable, fillvalue=None):
    "s -> (s0, s1...sn-1), (sn, sn+1...s2n-1), (s2n, s2n+1...s3n-1), ..."
    return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)

aes_key = b'\x80in\xbe\x06b\x8f\x8fZ}l-\xb4j\xb5\x1f'

ints = list(aes_key)
print(ints)

tuples = list(grouper(3, aes_key, fillvalue=0))
print(tuples)

tuples = list(grouper(4, aes_key, fillvalue=0))
print(tuples)

[128, 105, 110, 190, 6, 98, 143, 143, 90, 125, 108, 45, 180, 106, 181, 31]
[(128, 105, 110), (190, 6, 98), (143, 143, 90), (125, 108, 45), (180, 106, 181), (31, 0, 0)]
[(128, 105, 110, 190), (6, 98, 143, 143), (90, 125, 108, 45), (180, 106, 181, 31)]

由于您似乎想用这些数据制作一个图像,您可能仍然需要根据图像每行中像素的数量进一步格式化该数据。

可以将元组列表转换回如下所示的字节字符串:

# To convert a list of tuples back into a byte string.
from itertools import chain
print(bytes(chain.from_iterable(tuples)))

输出:

b'\x80in\xbe\x06b\x8f\x8fZ}l-\xb4j\xb5\x1f'

但是,如果没有添加填充值,这将只与原始字节字符串相同(与使用4元组的情况一样)。