Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用pycryptodome在python中实现AES OFB_Python_Python 3.x_Cryptography_Aes_Pycryptodome - Fatal编程技术网

使用pycryptodome在python中实现AES OFB

使用pycryptodome在python中实现AES OFB,python,python-3.x,cryptography,aes,pycryptodome,Python,Python 3.x,Cryptography,Aes,Pycryptodome,我正在尝试使用pycryptodome库实现AES加密的OFB模式,但在理解应该向密码提供什么输入时遇到了问题。我知道pycryptodome已经实现了OFB,但我需要将纯文本分解成字节,应用OFB的正确步骤,使用AES密码和ECB模式对其进行加密,然后解密 诸如b'\x16\xa8W\xed.)\xc4\xb8x\xd6\xcf\x7f\xf3\xe3;^之类的字节字符串如何处理在python中工作 我需要获取这样一个字节字符串,对其进行加密,然后将其分成两半,并用8字节的纯文本对其进行异或运

我正在尝试使用pycryptodome库实现AES加密的OFB模式,但在理解应该向密码提供什么输入时遇到了问题。我知道pycryptodome已经实现了OFB,但我需要将纯文本分解成字节,应用OFB的正确步骤,使用AES密码和ECB模式对其进行加密,然后解密

诸如
b'\x16\xa8W\xed.)\xc4\xb8x\xd6\xcf\x7f\xf3\xe3;^之类的字节字符串如何处理在python中工作

我需要获取这样一个字节字符串,对其进行加密,然后将其分成两半,并用8字节的纯文本对其进行异或运算。对我来说,理解和实现这一点最简单的方法是使用AES对IV(上面的字节字符串)进行加密,然后将其和纯文本转换为二进制和xor,然后将它们转换回ByTestRing。我该怎么做

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"
iv = get_random_bytes(32)

print("iv: ", iv)

cipher = AES.new(key, AES.MODE_ECB)
toXor = cipher.encrypt(iv)

print("toXor: ", toXor)

"""
toXorF=first half of toXor
ivS=second half of iv

cipherText=toXorF xored to first 8 bytes of plainText
iv=ivS + toXorS
"""
打印输出:

iv:  b"v'xg;\xd7h\xfc\xf2\xa4[\r\xee]J\x1eu\xa5\xe68\xa3a\xde\x02(\xc1\xe0\xc9z\x0f\xc3n"
toXor:  b'\x97\xbex\xfc\xb6\xbb\x85\xccZ\xc4\xe4\x9d\xd6M\xf2\xd7\xb7\xbf\xd0\xbe\xa5A\xd6\xee\x07U\xe0S\x7f\x88\xea\xcd'

如果您对我的程序/解决问题的方法的更好架构有任何建议,请随时启发我。

我应用了t.m.adam的建议,这是最终的代码,它可以完美地工作

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"


def ofbEnc(plainText, key):
    pos = 0
    cipherTextChunks = []
    iv = get_random_bytes(16)
    originalIV = iv
    cipher = AES.new(key, AES.MODE_ECB)
    if len(plainText) % 16 != 0:
        plainText += b"1"
    while len(plainText) % 16 != 0:
        plainText += b"0"
    while pos + 16 <= len(plainText):
        toXor = cipher.encrypt(iv)
        nextPos = pos + 16
        toEnc = plainText[pos:nextPos]
        cipherText = bytes([toXor[i] ^ toEnc[i] for i in range(16)])
        cipherTextChunks.append(cipherText)
        pos += 16
        iv = toXor
    return (originalIV, cipherTextChunks)


def ofbDec(cipherTextChunks, key, iv):
    plainText = b""
    cipher = AES.new(key, AES.MODE_ECB)
    for chunk in cipherTextChunks:
        toXor = cipher.encrypt(iv)
        plainText += bytes([toXor[i] ^ chunk[i] for i in range(15)])
        iv = toXor
    while plainText[-1] == 48:
        plainText = plainText[0:-1]
    if plainText[-1] == 49:
        plainText = plainText[0:-1]
    return plainText


iv, result = ofbEnc(plainText, key)
print(iv, result)

plain = ofbDec(result, key, iv)
print(plain)
从加密密码导入AES
从Crypto.Random导入获取\u Random\u字节
纯文本=b“我的知识,我的知识,我的知识,我的知识”
key=b“anaaremereaaaaaaa”
BENC的def(明文,密钥):
pos=0
cipherTextChunks=[]
iv=获取随机字节(16)
原始值=iv
密码=AES.new(密钥,AES.MODE\u ECB)
如果len(纯文本)%16!=0:
明文+=b“1”
而len(纯文本)%16!=0:
明文+=b“0”

pos+16时,我应用了t.m.adam的建议,这是最终的代码,可以完美地工作

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"


def ofbEnc(plainText, key):
    pos = 0
    cipherTextChunks = []
    iv = get_random_bytes(16)
    originalIV = iv
    cipher = AES.new(key, AES.MODE_ECB)
    if len(plainText) % 16 != 0:
        plainText += b"1"
    while len(plainText) % 16 != 0:
        plainText += b"0"
    while pos + 16 <= len(plainText):
        toXor = cipher.encrypt(iv)
        nextPos = pos + 16
        toEnc = plainText[pos:nextPos]
        cipherText = bytes([toXor[i] ^ toEnc[i] for i in range(16)])
        cipherTextChunks.append(cipherText)
        pos += 16
        iv = toXor
    return (originalIV, cipherTextChunks)


def ofbDec(cipherTextChunks, key, iv):
    plainText = b""
    cipher = AES.new(key, AES.MODE_ECB)
    for chunk in cipherTextChunks:
        toXor = cipher.encrypt(iv)
        plainText += bytes([toXor[i] ^ chunk[i] for i in range(15)])
        iv = toXor
    while plainText[-1] == 48:
        plainText = plainText[0:-1]
    if plainText[-1] == 49:
        plainText = plainText[0:-1]
    return plainText


iv, result = ofbEnc(plainText, key)
print(iv, result)

plain = ofbDec(result, key, iv)
print(plain)
从加密密码导入AES
从Crypto.Random导入获取\u Random\u字节
纯文本=b“我的知识,我的知识,我的知识,我的知识”
key=b“anaaremereaaaaaaa”
BENC的def(明文,密钥):
pos=0
cipherTextChunks=[]
iv=获取随机字节(16)
原始值=iv
密码=AES.new(密钥,AES.MODE\u ECB)
如果len(纯文本)%16!=0:
明文+=b“1”
而len(纯文本)%16!=0:
明文+=b“0”

虽然pos+16 bytestring是二进制数据,但您不必转换它们。如果您询问如何用明文对密钥流进行异或运算,可以使用
密文=字节([ks[i]^pt[i]表示范围(16)])
。对于下一个块,使用keystream作为IV(参见)。请注意,您必须使用16字节的IV,并将明文“剪切”为16字节的块。我发现了一些示例,其中说明我应该将键流用作下一个块的IV,而其他示例则说明新IV是旧IV的后半部分+键流的前半部分。当我运行使用pycryptodome的AES和OFB加密文本的标准代码时,我得到了最终iv的以下输出:OI83f0NCCXSVhDT5bQkb/a==大小为24字节。我应该破坏密钥流还是应该保持原样并继续加密?(只是为了确保,keystream=iv是用提供的密钥加密的,对吗?)我认为这不可行,你能分享到这些例子的链接吗?你得到的静脉注射似乎是base64编码的;如果你解码它,你会得到一个16字节的字符串。如果它是用AES-ECB加密的,则base64对其进行解码,并用明文进行异或运算以获得密文。(是的,keystream=iv使用提供的密钥加密)首先想到的3个破坏密钥流的例子是:嗯,我不知道这个实现,我必须研究它,谢谢!然而,我认为只有第二个视频使用这种方法,我怀疑PyCryptodome或大多数其他加密库是否使用这种方法。ByTestRing是二进制数据,您不必转换它们。如果您询问如何用明文对密钥流进行异或运算,可以使用
密文=字节([ks[i]^pt[i]表示范围(16)])
。对于下一个块,使用keystream作为IV(参见)。请注意,您必须使用16字节的IV,并将明文“剪切”为16字节的块。我发现了一些示例,其中说明我应该将键流用作下一个块的IV,而其他示例则说明新IV是旧IV的后半部分+键流的前半部分。当我运行使用pycryptodome的AES和OFB加密文本的标准代码时,我得到了最终iv的以下输出:OI83f0NCCXSVhDT5bQkb/a==大小为24字节。我应该破坏密钥流还是应该保持原样并继续加密?(只是为了确保,keystream=iv是用提供的密钥加密的,对吗?)我认为这不可行,你能分享到这些例子的链接吗?你得到的静脉注射似乎是base64编码的;如果你解码它,你会得到一个16字节的字符串。如果它是用AES-ECB加密的,则base64对其进行解码,并用明文进行异或运算以获得密文。(是的,keystream=iv使用提供的密钥加密)首先想到的3个破坏密钥流的例子是:嗯,我不知道这个实现,我必须研究它,谢谢!然而,我认为只有第二个视频使用这种方法,我怀疑PyCryptodome或大多数其他加密库是否使用这种方法。