代码之家  ›  专栏  ›  技术社区  ›  Chase

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

  •  0
  • Chase  · 技术社区  · 5 年前

    我用的是 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 ,这会引起纪念。

    0 回复  |  直到 5 年前
        1
  •  2
  •   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元组的情况一样)。