当前位置: 首页 > 面试题库 >

使用PyCrypto AES进行Python加密

景志
2023-03-14
问题内容

我今天刚找到pycrypto,并且一直在研究AES加密课程。不幸的是,它只能成功一半。self.h.md5以十六进制格式输出md5哈希,并且为32byte。这是输出。似乎是对消息进行了解密,但是它在解密后放置了随机字符,在这种情况下,是\
n \ n \ n …我认为self.data的块大小有问题,有人知道如何解决此问题吗?

Jans-MacBook-Pro:test2 jan $ ../../bin/python3 data.py
b’RLfGmn5jf5WTJphnmW0hXG7IaIYcCRpjaTTqwXR6yiJCUytnDib + GQYlFORm + jIctest 1
2 3 4 5最终测试\ n \ n \ n \ n \ n \ n \ n’

from Crypto.Cipher import AES
from base64 import b64encode, b64decode
from os import urandom

class Encryption():
    def __init__(self):
        self.h = Hash()

    def values(self, data, key):
        self.data = data
        self.key = key
        self.mode = AES.MODE_CBC
        self.iv = urandom(16)
        if not self.key:
            self.key = Cfg_Encrypt_Key
        self.key = self.h.md5(self.key, True)

    def encrypt(self, data, key):
        self.values(data, key)
        return b64encode(self.iv + AES.new(self.key, self.mode, self.iv).encrypt(self.data))

    def decrypt(self, data, key):
        self.values(data, key)
        self.iv = b64decode(self.data)[:16]
        return AES.new(self.key, self.mode, self.iv).decrypt(b64decode(self.data)[16:])

问题答案:

老实说,字符 “ \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n” 在我看来并不那么随意。;-)

您正在CBC模式下使用AES。这就要求明文和密文的长度始终为16字节的倍数。使用显示的代码,您实际上应该看到data传递给的异常encrypt()不满足该条件时引发了异常。看起来您已经在输入的内容中添加了足够的换行符(
’\ n’ ,直到明文碰巧对齐为止。

除此之外,还有两种解决对齐问题的常用方法:

  1. 从CBC(AES.MODE_CBC)切换到CFB(AES.MODE_CFB)。segment_size使用PyCrypto使用的默认值,您将对明文和密文长度没有任何限制。

  2. 保留CBC并使用类似PKCS#7的填充方案,即:

    • 在对X字节的明文进行加密之前,请向后追加达到下一个16字节边界所需的尽可能多的字节。所有填充字节都具有相同的值:您要添加的字节数:
          length = 16 - (len(data) % 16)
      

      data += bytes([length])*length

这就是Python 3风格。在Python 2中,您将具有:

            length = 16 - (len(data) % 16)
    data += chr(length)*length


* 解密后,从纯文本的后面删除与填充指示的一样多的字节:

            data = data[:-data[-1]]

即使我了解您的情况,这只是一个课堂练习,但我想指出的是,没有任何形式的身份验证(例如,MAC)发送数据是不安全的。



 类似资料:
  • 问题内容: 我之所以写这个问题+答案,是因为我挣扎了很多(也许是因为缺乏经验),并迷失了使用node或python进行加密/解密的许多不同方式。 我以为我的案子将来可以帮助人们。 我需要做的是: 从表单获取数据,使用Crypto(node-js)对其进行加密 在Python中传递加密的数据,然后使用PyCrypto将其解密。 我选择使用AES加密。 这是我的开始方式(我不会尝试的所有事情): 我遵

  • 问题内容: 我正在尝试在Python中加密某些内容,并在nodejs应用程序中对其进行解密。 我正在努力使这两个AES实现一起工作。这是我的位置。 在节点中: 产生输出: 在python中 这产生输出 显然,它们非常接近,但是node似乎在用某些内容填充输出。有什么想法可以使两者互操作吗? 问题答案: 好的,我已经弄清楚了,节点使用OpenSSL,后者使用PKCS5进行填充。PyCrypto不处理

  • 是否可以使用pycryptodome或任何其他库在python中使用私钥加密消息?我知道你不应该用私钥加密而用公钥解密,但我的目的是用私钥加密,这样接收者就可以确定消息是由真正的作者发送的。除了安全加密之外,我还在寻找某种模糊处理。我想做一个应用程序,其中的消息是公开的,但它只能看到,如果你有公钥。我尝试过这样做: 但它会引发下一个错误:TypeError:这不是私钥。

  • 问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是首先了解他们的知识,然后通

  • 一段时间以来,我一直在阅读CodeProject a的一篇文章,该文章解释了如何使用RSA提供程序进行加密和解密: RSA私钥加密 虽然2009年的旧版本有缺陷,但2012年的新版本(支持System.Numerics.BigInteger)似乎更可靠。但这个版本缺少的是一种使用公钥加密和使用私钥解密的方法。 所以,我自己也试过了,但解密时会收到垃圾。我对RSA提供商不熟悉,所以我对这里一无所知。

  • 本文向大家介绍Python使用Pycrypto库进行RSA加密的方法详解,包括了Python使用Pycrypto库进行RSA加密的方法详解的使用技巧和注意事项,需要的朋友参考一下 密码与通信 密码技术是一门历史悠久的技术。信息传播离不开加密与解密。密码技术的用途主要源于两个方面,加密/解密和签名/验签 在信息传播中,通常有发送者,接受者和窃听者三个角色。假设发送者Master想要写信给接受者Gho