python-从变量读取一定数量的字节

时间:2019-04-29 06:45:38

标签: python cryptography

我正在尝试实现AES算法,对于该算法,消息将被分为每个1字节的b块(AES-128每个状态单元需要1字节)。因此,如果消息是:“今天是星期六,是时候讲故事了。”,我必须从中读取1个字节并将其存储在状态单元中。

所以,我的第一个问题是,是否可以从变量中读取(或提取)一定数量的字节?

紧随其后的问题是:“ 如果可以从变量中获取一定数量的字节,那么,我们如何获取该字节中的位?

>

1 个答案:

答案 0 :(得分:1)

最近才这样做。这是一个选择:

从itertools导入islice

byteorder = 'big'
plain = b"This is saturday, and it is time to tell tale."

def chunked(iterable, n):
    it = iter(iterable)
    values = bytes(islice(it, n))
    while values:
        yield values
        values = bytes(islice(it, n))

for block_bytes in chunked(plain, n=8):
    block_int =  int.from_bytes(block_bytes, byteorder)
    print(block_bytes, bin(block_int))

输出

b'This is ' 0b101010001101000011010010111001100100000011010010111001100100000
b'saturday' 0b111001101100001011101000111010101110010011001000110000101111001
b', and it' 0b10110000100000011000010110111001100100001000000110100101110100
b' is time' 0b10000001101001011100110010000001110100011010010110110101100101
b' to tell' 0b10000001110100011011110010000001110100011001010110110001101100
b' tale.' 0b1000000111010001100001011011000110010100101110

请注意,byteorder也可以是'little'

block_int

很容易获得各个位:最低有效位是block_int & 1;对于其他位置的位,您可以移位:(block_int >> 5) & 1等,或者从block_bytes(是int的数组)中获得所需的字节,然后选择所需的位;例如(block_bytes[4] >> 7) & 1

也许this answer也很有帮助。