【问题标题】:Python Encryption - Unexpected Variable ReturnPython 加密 - 意外的变量返回
【发布时间】:2014-05-14 00:59:15
【问题描述】:

我目前遇到无法解密加密后提供的文本的问题。它返回:

Key: ンƚ!*!゙ᆱø}Qd`Dᆱd!Þxͦ}ᄚミᄀ>'U

Unpadded Text: Hello World

Padded Text: Hello World

Salt: h5eE0b814M

Encrypted Text: WxCž~¼!Ò]Cú´=P+

Encrypted Text with Salt: h5eE0b814MWxCž~¼!Ò]Cú´=P+

Key: ンƚ!*!゙ᆱø}Qd`Dᆱd!Þxͦ}ᄚミᄀ>'U

Unencrypted Text: 

在哪里

Unencrypted Text: 

应该是“未加密文本:Hello World”

其中使用了两个程序,一个是模块,一个是主程序。您必须运行 master 才能运行该模块。由于我被困了一段时间,任何建议或帮助都会得到很大的帮助。感谢您的宝贵时间。

代码如下:

Master.py

import Encryption as encrypt

#Place Holder Variables
SALT_SIZE = 16 
padded_text = ''
ciphertext = ''
key = ''
ciphertext_with_salt = ''
#Adjustable Variables
text = "Hello World"
iterations = 62705
salt = 'h5eE0b814M'
password = 'pause232'

encrypt.key_generation(password, salt, iterations)
encrypt.encryption(text, password, SALT_SIZE, salt, iterations)
encrypt.decryption(ciphertext_with_salt, password, SALT_SIZE, salt, iterations)

加密.py

import Crypto.Random
from Crypto.Cipher import AES
import hashlib


#Key Generation(Used in encyption to create cipher)
def key_generation(password, salt, iterations):
    global key
    assert iterations > 0
    key = password + salt #Combines [password] and [salt] to create a [key]
    for i in range(iterations): #Hashes the [key]
        key = hashlib.sha256(key).digest() #Using Sha256 it hashes the [key] based on amount of [iterations]
    print '\nKey: ' + key #Debug Print
    return key

#Text padding function to set text to a incerment of SALT_SIZE
def pad_text(text, SALT_SIZE):
    print '\nUnpadded Text: ' + text #Debug Print
    global padded_text
    extra_bytes = len(text) % SALT_SIZE #Using the length of [text] it counts how many more characters is required to make an incerment of [SALT_SIZE]
    pad_size = SALT_SIZE - extra_bytes #Subtracts the needed bytes from the [SALT_SIZE] and sets [pad_size] as the length of pading needed.
    pad = chr(pad_size) * pad_size #Creates padding for the [text]
    padded_text = text + pad #Adds the [pad] to the [text]
    print '\nPadded Text: ' + padded_text #Debug Print

#Primary Encryption Function(using text and password)
def encryption(text, password, SALT_SIZE, salt, iterations):
    global padded_text
    global ciphertext
    cipher = AES.new(key, AES.MODE_ECB)
    padded_plaintext = pad_text(text, SALT_SIZE)
    ciphertext = cipher.encrypt(padded_text)
    ciphertext_with_salt = salt + ciphertext
    #debug script
    print '\nSalt: ' + salt #Debug Print
    print '\nEncrypted Text: ' + ciphertext #Debug Print
    print '\nEncrypted Text with Salt: ' + ciphertext_with_salt #Debug Print
    return ciphertext_with_salt

#Primary Decryption Function(using the encrypted text and password)
def decryption(ciphertext_with_salt, password, SALT_SIZE, salt, iterations):
    ciphertext_with_salt = ciphertext[SALT_SIZE:]
    key = key_generation(password, salt, iterations)
    cipher = AES.new(key, AES.MODE_ECB)
    unencrypted_text = cipher.decrypt(ciphertext_with_salt)
    print '\nUnencrypted Text: ' + unencrypted_text #Debug Print
    return unencrypted_text

#Code to allow to use as outside module
if __name__ == '__main__':
    key_generation(password, salt, iterations)
    encryption(text, password, SALT_SIZE, salt, iterations)
    decryption(ciphertext_with_salt, password, SALT_SIZE, salt, iterations)

【问题讨论】:

  • 你检查过unencrypted_text == ""吗?
  • 填充应该在块大小上执行,而不是盐大小。对于字符串,不应使用 ECB 模式。至少使用带有随机 IV(附加到密文)的 CBC 模式。

标签: python encryption cryptography aes pycrypto


【解决方案1】:

您将密文和密钥作为字符串传输。您应该确保构成密文和密钥的字节保持不变。如果您想使用字符串传输它们,请使用十六进制编码或 base 64。十六进制更易于阅读和检查长度,base 64 更有效。

请注意,密文将包含具有 any 值的字节,包括 ASCII 控制字符 (< 0x20),其中还包含终止字符,例如 0x00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 2020-03-29
    • 2016-02-02
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多