我想将二进制数据加密为二进制数据,然后以二进制文件解密。我怎么能在python中这样做?我试图使用AES
但无法成功执行此操作。
Key = '00000000’
des = DES.new(key', DES.MODE_ECB)
plain_text = "10101011"
#encryption
cipher_text = des.encrypt(plain_text)
#decryption
decrypted_pt = des.decrypt(cipher_text)
答案 0 :(得分:1)
您没有指定,但您的代码使您看起来像是在使用ECB模式。这是我为cryptopals挑战编写的代码的简短示例,稍加修改以更好地适合您的示例代码。确保您的密钥长度为16个字节。此外,纯文本必须是16个字节的倍数。另外一个挑战是你实现了填充功能。
另外需要注意的是,在加密数据之后,最安全的存储方式是某种编码方式,通常使用Base64。然后当你去解密它时,你首先对数据进行解码。
from Crypto.Cipher import AES
import base64
def ecb_encrypt(message, key):
""" Encrypts a message in AES ECB mode with a given key
ACCEPTS: Two strings, the plaintext message and the key
RETURNS: A bytes string of base64 encoded ciphertext
"""
aes = AES.new(key, AES.MODE_ECB)
return base64.b64encode(aes.encrypt(message)).decode()
def ecb_decrypt(encrypted, key):
""" Decrypts a ciphertext in AES ECB mode with a given key
ACCEPTS: Two strings, the base64 encoded ciphertext and the key
RETURNS: A bytes string of the plaintext message
"""
aes = AES.new(key, AES.MODE_ECB)
return aes.decrypt(base64.b64decode(encrypted))
if __name__ == "__main__":
Key = "0000000000000000"
plain_text = "1010101110101011"
cipher_text = ecb_encrypt(plain_text, Key)
decrypted_pt = ecb_decrypt(cipher_text, Key).decode()
print("Original message: {}".format(plain_text))
print("Encrypted message: {}".format(cipher_text))
print("Decrypted message: {}".format(decrypted_pt))
答案 1 :(得分:0)
你可能正在寻找的是python中的xor位运算符。 基本上它需要两个数字中的每一对位并且仅返回1并且仅当其中一个位为1时,否则返回0.
Input = int(raw_input('Encrypt/Decrypt this >>>'), 2) #input must be in bit format
key = 0b0100110 #'0b' indicates this is in second base
Encryption = key ^ Input
print Encryption
以“1101001”作为输入,代码将打印79(即1001111)
重复同样的过程:
Decryption = key ^ Encryption
print Decryption
将打印105,这是我们的原始输入(105 = 1101001)
如需更多阅读,请访问:https://wiki.python.org/moin/BitwiseOperators或https://www.tutorialspoint.com/python/bitwise_operators_example.htm
答案 2 :(得分:0)
我假设您正在使用PyCrypto,因此我建议您查看包含示例代码的this blog post,并引导您完成加密/解密二进制文件的过程(此处不值得复制代码)。
您可能还想查看simple-crypt,它摘要了一些使用PyCrypto的繁琐工作。