-1

Python 3.5、pycrypto 2.7a1、Windows、RC2 加密

例子:

print('Введите текс, который хотите зашифровать:')
text = input()

with open('plaintext.txt', 'w') as f:
    f.write(text)

key = os.urandom(32)

with open('rc2key.bin', 'wb') as keyfile:
    keyfile.write(key)

iv = Random.new().read(ARC2.block_size)

cipher = ARC2.new(key, ARC2.MODE_CFB, iv)
ciphertext = iv + cipher.encrypt(bytes(text, "utf-8"))

with open('iv.bin', 'wb') as f:
    f.write(iv)

with open('ciphertext.bin', 'wb') as f:
    f.write(ciphertext)

print(ciphertext.decode("cp1251"))

我想知道如何解密这个文本,我试过了,但做不到。

我尝试解密:

os.system('cls')
print('Дешифруем значит')

with open('ciphertext.bin', 'rb') as f:
    ciphertext = f.read()

with open('rc2key.bin', 'rb') as f:
    key = f.read()

with open('iv.bin', 'rb') as f:
    iv = f.read()

ciphertext = ciphertext.decode('cp1251')
iv = iv.decode('cp1251')

text =  ciphertext.replace(iv, '')
text = cipher.decrypt(text)

with open('plaintext.txt', 'w') as f:
    f.write(text)

print(text.decode("ascii"))

但是我知道我需要密码变量,并且我无法将其保存到 .txt 或 .bin 文件中,这就是我寻求帮助的原因。

4

1 回答 1

0

IV 是一个非秘密值,通常写在密文前面。由于您已经这样做了,您不需要编写额外的 IV 文件。RC2 的块大小为 64 位,因此 IV 将始终为 8 字节长。

with open('ciphertext.bin', 'rb') as f:
    ciphertext = f.read()

with open('rc2key.bin', 'rb') as f:
    key = f.read()

iv = ciphertext[:ARC2.block_size]
ciphertext = ciphertext[ARC2.block_size:]

cipher = ARC2.new(key, ARC2.MODE_CFB, iv)
text = cipher.decrypt(ciphertext).decode("utf-8")

with open('plaintext.txt', 'w') as f:
    f.write(text)

print(text)

其他问题:

  • 不要简单地解码诸如密文、密钥或 IV 之类的二进制数据,因为它们很可能是不可打印的。

  • cipher如果您正在做不同的事情,请不要重复使用相同的对象。解密需要一个新初始化的ARC2对象。

于 2016-08-21T16:44:55.190 回答