为什么我无法解密我用 pycrypto 加密的内容?
Why I am not able to decrypt what I encrypted with pycrypto?
这是我的代码:
加密:
from Crypto.Cipher import AES
import base64
def encryption (privateInfo):
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
secret = 'Fr3@k1nP@ssw0rd.'
print('encryption key:', secret)
cipher = AES.new(secret)
encoded = EncodeAES(cipher, privateInfo)
print('Encrypted string:', encoded)
encryption('secret')
加密后的字符串为:b'QuCzNmwiVaq1uendvX7P+g=='
解密:
from Crypto.Cipher import AES
import base64
def decryption(encryptedString):
PADDING = '{'
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
key = 'Fr3@k1nP@ssw0rd.'
cipher = AES.new(key)
decoded = DecodeAES(cipher, encryptedString)
print(decoded)
decryption("b'QuCzNmwiVaq1uendvX7P+g=='")
结果:
ValueError: Input strings must be a multiple of 16 in length
这是 Python 3.4 上的 PyCrypto 2.6.1;我也安装了 VC++ 2010 Express。
真正让我困惑的是它在 Python 2.7
上完美运行
欢迎任何建议,但请注意,我是 Python 的新手。
可能是因为您在 "b'QuCzNmwiVaq1uendvX7P+g=='"
左右有 "
个。
改变
decryption("b'QuCzNmwiVaq1uendvX7P+g=='")
到
decryption(b'QuCzNmwiVaq1uendvX7P+g==')
你应该一切就绪。
经过一些研究和大量的编码、测试和改进,我在 Python 3.4.4 和 [=18 上制作了这段代码 运行 =]Windows10:
import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
PAD = "X"
def key_hash(key):
return SHA256.new(key.encode()).digest()
def encrypt(text, key):
while len(text) % 16 != 0:
text += PAD
cipher = AES.new(key_hash(key))
encrypted = cipher.encrypt(text.encode())
return base64.b64encode(encrypted).decode()
def decrypt(text, key):
cipher = AES.new(key_hash(key))
plain = cipher.decrypt(base64.b64decode(text))
return plain.decode().rstrip(PAD)
if __name__ == '__main__':
e = encrypt("This is my string.", "password")
p = decrypt(e, "password")
print("Encrypted:", e)
print("Plain:", p)
输出:
Encrypted: QjkhFlXG2tklZQgHorpAOFSTb2vYZLNb/eEUIvAsT1g=
Plain: This is my string.
如果你有什么questions/improvements/critics,欢迎留言评论!
这是我的代码:
加密:
from Crypto.Cipher import AES
import base64
def encryption (privateInfo):
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
secret = 'Fr3@k1nP@ssw0rd.'
print('encryption key:', secret)
cipher = AES.new(secret)
encoded = EncodeAES(cipher, privateInfo)
print('Encrypted string:', encoded)
encryption('secret')
加密后的字符串为:b'QuCzNmwiVaq1uendvX7P+g=='
解密:
from Crypto.Cipher import AES
import base64
def decryption(encryptedString):
PADDING = '{'
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
key = 'Fr3@k1nP@ssw0rd.'
cipher = AES.new(key)
decoded = DecodeAES(cipher, encryptedString)
print(decoded)
decryption("b'QuCzNmwiVaq1uendvX7P+g=='")
结果:
ValueError: Input strings must be a multiple of 16 in length
这是 Python 3.4 上的 PyCrypto 2.6.1;我也安装了 VC++ 2010 Express。 真正让我困惑的是它在 Python 2.7
上完美运行欢迎任何建议,但请注意,我是 Python 的新手。
可能是因为您在 "b'QuCzNmwiVaq1uendvX7P+g=='"
左右有 "
个。
改变
decryption("b'QuCzNmwiVaq1uendvX7P+g=='")
到
decryption(b'QuCzNmwiVaq1uendvX7P+g==')
你应该一切就绪。
经过一些研究和大量的编码、测试和改进,我在 Python 3.4.4 和 [=18 上制作了这段代码 运行 =]Windows10:
import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
PAD = "X"
def key_hash(key):
return SHA256.new(key.encode()).digest()
def encrypt(text, key):
while len(text) % 16 != 0:
text += PAD
cipher = AES.new(key_hash(key))
encrypted = cipher.encrypt(text.encode())
return base64.b64encode(encrypted).decode()
def decrypt(text, key):
cipher = AES.new(key_hash(key))
plain = cipher.decrypt(base64.b64decode(text))
return plain.decode().rstrip(PAD)
if __name__ == '__main__':
e = encrypt("This is my string.", "password")
p = decrypt(e, "password")
print("Encrypted:", e)
print("Plain:", p)
输出:
Encrypted: QjkhFlXG2tklZQgHorpAOFSTb2vYZLNb/eEUIvAsT1g=
Plain: This is my string.
如果你有什么questions/improvements/critics,欢迎留言评论!