【问题标题】:Is it possible to encrypt integers?是否可以加密整数?
【发布时间】:2018-03-18 18:12:21
【问题描述】:

所以我的程序是一个速记程序,它将一个图像插入到另一个图像中,我试图在将数据插入封面图像之前对其进行加密。但是,大多数加密模块都需要字符串,我正在尝试传递整数。

我尝试转换为字符串然后加密,但加密中充满了特殊字符和字母,因此转换回整数以进行插入是不可能的。

有人知道我能否以某种方式加密一个整数吗?它不必非常安全。

我正在尝试在此处添加加密:

for i in range(0,3):
    #verify we have reached the end of our hidden file
    if count >= len(Stringbits):
        #convert the bits to their rgb value and appened them
        for rgbValue in pixelList:
            pixelnumbers1 = int(''.join(str(b) for b in rgbValue), 2)
            #print pixelnumbers1
            rgb_Array.append(pixelnumbers1)
        pixels[x, y] = (rgb_Array[0], rgb_Array[1], rgb_Array[2])
        print "Completed"
        return imageObject.save(output)

我一直在尝试加密pixelnumbers1 然后将其添加进去。但pixels[x, y] 需要一个整数。

下面是其余的代码:

def write(mainimage, secret, output):
    #string contains the header, data and length in binary
    Stringbits = dcimage.createString(secret)
    imageObject = Image.open(mainimage).convert('RGB')
    imageWidth, imageHeight = imageObject.size
    pixels = imageObject.load()
    rgbDecimal_Array = []
    rgb_Array = []
    count = 0

    #loop through each pixel
    for x in range (imageWidth):
        for y in range (imageHeight):
            r,g,b = pixels[x,y]
            #convert each pixel into an 8 bit representation
            redPixel = list(bin(r)[2:].zfill(8))
            greenPixel = list(bin(g)[2:].zfill(8))
            bluePixel = list(bin(b)[2:].zfill(8))
            pixelList = [redPixel, greenPixel, bluePixel]

            #for each of rgb
            for i in range(0,3):
                #verify we have reached the end of our hidden file
                if count >= len(Stringbits):
                    #convert the bits to their rgb value and appened them
                    for rgbValue in pixelList:
                        pixelnumbers1 = int(''.join(str(b) for b in rgbValue), 2)
                        #print pixelnumbers1
                        rgb_Array.append(pixelnumbers1)
                    pixels[x, y] = (rgb_Array[0], rgb_Array[1], rgb_Array[2])
                    print "Completed"
                    return imageObject.save(output)

                #If we haven't rached the end of the file, store a bit
                else:
                    pixelList[i][7] = Stringbits[count]
                    count+=1
            pixels[x, y] = dcimage.getPixel(pixelList)

【问题讨论】:

  • 大多数加密系统使用任意二进制数据、字符串或两者。 “整数”不是他们可以处理的概念,因为整数的格式从一个系统到另一个系统差异很大。您始终可以将整数转换为字符串,对其进行加密,然后将其烘焙。加密数据通常是原始二进制文件,并且将其字符串化需要使用 Base64 或类似的东西进行编码。
  • 整数、字符串等只是二进制值的解释。如果您可以加密一种类型,则可以全部加密。
  • @tadman “烘烤”是什么意思?
  • 假设您说的是steganography 而不是stenography,“烘焙”是将加密数据嵌入另一个介质的过程。

标签: python encryption steganography


【解决方案1】:

您对计算机如何查看任何类型的数据存在根本性的误解。

你读取一个文件的字节流,对你来说它看起来像一个字符串,但每个字符实际上是一个字节,一个从 0 到 255 的值。恰好其中一些是由传统的字符串字符表示的。尝试print(bytes(range(256)) 来查看所有内容。大多数标准加密函数将一个字节数组输入并吐出一个字节数组。只是碰巧你得到了更多没有“简单”表示的字节。但它们的字节数并不比你最初输入的少。

您的 dcimage.py 包含以下内容:

#get the file data in binary
fileData = bytearray(open(secret, 'rb').read())#opens the binary file in read or write mode
for bits in fileData:
    binDataString += bin(bits)[2:].zfill(8)#convert the file data to binary

没有什么能阻止你这样做

fileData = open(secret, 'rb').read() # a bytes object by default
encryptedData = myEncryptionFuction(fileData) # also a bytes object
for bits in encryptedData:
    # ...

非常重要:您在消息末尾添加一个空字节,以便您的提取序列知道何时停止。如果您压缩或加密字符串(或字节数组),则很可能空字节将成为该流的一部分,这将破坏您的提取顺序。在这种情况下,您想使用 header 提前告诉您的程序要提取多少位。


顺便说一句,字节已经是整数形式了。

>>> some_byte = b'G'
>>> some_byte[0]
71

您最好使用bitwise operations 进行隐写术。您获取字节,而不是在它们和像素之间使用按位运算,而是将两者都转换为二进制字符串,将它们切片并缝合,然后将它们转换回整数。

def bytes_to_bits(stream):
    for byte in stream:
        for shift in range(7, -1, -1):
            yield (byte >> shift) & 0x01

secret_bits = tuple(bytes_to_bits(encoded_data))

# simplified for one colour plane
for x in range(image_height):
    for y in range(image_width):
        # (pixel AND 254) OR bit - the first part zeroes out the lsb
        pixels[x,y] = (pixels[x,y] & 0xfe) | secret_bits[count]
        count += 1

# -------------------------------------

# to extract the bit from a stego pixel
bit = pixel & 0x01

【讨论】:

  • 我想我明白了,我照你说的做了。 fileData1 = open(secret, 'rb').read() encryptedData = cipher_suite.encrypt(fileData1) encryptedData = bin(int(binascii.hexlify(encryptedData),16)) 我转换为二进制,然后尝试将其添加到我的 bitString bitString = binName + nullDelimiter + binDataSize + nullDelimiter + encryptedData 但是当尝试将其保存在我的 getPixel 函数中时,我得到一个:int() 基数为 2 的无效文字:'0000000b'
  • 我在 Python 方面充其量还是个新手,所以请多多包涵。
  • @PaulCabz 您的整数到位串转换可能有误。 bin() 给你一个以'0b' 开头的字符串,并且不知何故,'b' 被标记了。整个回溯和相关代码不可能告诉你哪里出错了,但如果你无法弄清楚,你应该问一个新问题。这是一个关于你最初问的问题;加密二进制数据。
  • @PaulCabz 我用一些信息更新了答案,如果您决定加密您的消息,这些信息可能会变得相关。
【解决方案2】:

可以通过将每个数字添加到 0 到 9 范围内的随机整数流中来加密整数,当总和 > 9 时减去 10。由于模棱两可,应避免取模。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多