首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >输入字符串的长度必须是16的倍数Python pycrypto

输入字符串的长度必须是16的倍数Python pycrypto
EN

Stack Overflow用户
提问于 2018-07-27 08:22:53
回答 1查看 3K关注 0票数 1

我正在尝试用python进行密码学研究,得到了一个问题。以下是我为学习和测试所做的一些代码。

代码语言:javascript
复制
#!/usr/bin/python3
import getpass
from Crypto.Cipher import AES
import hashlib
import random
import sys
import os

the_input = getpass.getpass("Enter password: ")
theHash = hashlib.sha256(the_input.encode("utf-8")).hexdigest()

key = theHash[0:16]
#IV = ''.join([chr(random.randint(0, 0xff)) for i in range(16)])
IV = os.urandom(16)
print("THEHASH: ", key, "Leangth: ", len(key))
print( "IVlen: ", len(IV), "|SYS,GETSIZEOF: ", sys.getsizeof(IV))
print("This is the IV: ", IV)
def Encrypt_str():
    aes1 = AES.new(key, AES.MODE_CBC, IV)
    data = 'whatevertest'.zfill(16)

    encr = aes1.encrypt(data)
    print("The ENCRYPTION: ",encr)
    aes2 = AES.new(key, AES.MODE_CBC, IV)
    decr = aes2.decrypt(encr)
    print("Decrypted: ", decr)

def Decrypt_str():
    aes2 = AES.new(key, AES.MODE_CBC, IV)
    inpa1 = input("Enter cip:")
    decr = aes2.decrypt(inpa1)
    print(decr)

Encrypt_str()
Decrypt_str()

在线路上

代码语言:javascript
复制
print("The ENCRYPTION: ",encr)

它打印带有.zfill(16)字节的加密代码

该代码是b'\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5‘

当我跑步的时候

代码语言:javascript
复制
len('\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5') in interpreter

我得到16个回报,当我把加密的aes代码粘贴到

代码语言:javascript
复制
inpa1 = input("Enter cip:")

我得到了

代码语言:javascript
复制
File "newtest.py", line 35, in <module>
    Decrypt_str()
  File "newtest.py", line 31, in Decrypt_str
    decr = aes2.decrypt(inpa1)
  File "/usr/lib/python3/dist-packages/Crypto/Cipher/blockalgo.py", line 295, i$
    return self._cipher.decrypt(ciphertext)
ValueError: Input strings must be a multiple of 16 in length

但我仍然可以在相同的函数中解密相同的16个字节

代码语言:javascript
复制
decr = aes2.decrypt(encr)

我发现weird...so,我真的搞不懂它是怎么工作的。可能会有一些帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-07-27 08:58:03

如果将\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5直接粘贴到输入提示符中,则会转义反斜杠。

代码语言:javascript
复制
>>> example=input("Prompt: ")
Prompt: \x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5
>>> example
'\\x0c\\x97\\x8e\\x1b\\xa9\\x10a\\n\\x07\\xde\\x16\\xa3\\xf7\\x10\\x9f5'
>>> print(example)
\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5

通常,在传递加密值时,最好对这些值进行base64编码。然后在解密该值之前对该值进行解码。

代码语言:javascript
复制
>>> import base64
>>> enc=b'\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5'
>>> base64_enc = base64.b64encode(enc)
>>> print(base64_enc)
b'DJeOG6kQYQoH3haj9xCfNQ=='
>>>
>>> i=input("Prompt: ")
Prompt: DJeOG6kQYQoH3haj9xCfNQ==
>>>
>>> i
'DJeOG6kQYQoH3haj9xCfNQ=='
>>> denc=base64.b64decode(i)
>>> print(denc)
b'\x0c\x97\x8e\x1b\xa9\x10a\n\x07\xde\x16\xa3\xf7\x10\x9f5'
>>> len(denc)
16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51549153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档