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

使用AES + CTR的PyCrypto问题

乌和畅
2023-03-14
问题内容

我正在编写一段代码,以使用对称加密来加密文本。但这并没有带来正确的结果…

from Crypto.Cipher import AES
import os

crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter = lambda : os.urandom(16))
encrypted = crypto.encrypt("aaaaaaaaaaaaaaaa")
print crypto.decrypt(encrypted)

在这里,解密后的文本与原始文本不同。

我对密码学不是很了解,所以请多多包涵。我知道CTR模式每次都需要一个“计数器”功能来提供一个随机计数器,但是为什么当我的密钥是32字节并且它也坚持我的消息也是16字节的倍数时,为什么它需要是16字节?这正常吗?

我猜想它不会回到原始消息,因为计数器在加密和解密之间发生了变化。但是,从理论上讲,它应该如何工作?我究竟做错了什么?无论如何,我不得不求助于欧洲央行,直到我弄清楚了:(


问题答案:

counter必须返回相同的解密,因为它没有加密,你直觉,所以,一个( 不安全AT ALL )的方式来做到这一点是:

>>> secret = os.urandom(16)
>>> crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=lambda: secret)
>>> encrypted = crypto.encrypt("aaaaaaaaaaaaaaaa")
>>> print crypto.decrypt(encrypted)
aaaaaaaaaaaaaaaa

点击率是一种 分组 密码,因此“ 16次”约束似乎很自然,这让您感到惊讶。

当然,在每次调用中返回 相同
值的所谓“计数器”是完全不安全的。不需要花费太多就可以做得更好,例如:

import array

class Secret(object):
  def __init__(self, secret=None):
    if secret is None: secret = os.urandom(16)
    self.secret = secret
    self.reset()
  def counter(self):
    for i, c in enumerate(self.current):
      self.current[i] = c + 1
      if self.current: break
    return self.current.tostring()
  def reset(self):
    self.current = array.array('B', self.secret)

secret = Secret()
crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=secret.counter)
encrypted = crypto.encrypt(16*'a' + 16*'b' + 16*'c')
secret.reset()
print crypto.decrypt(encrypted)


 类似资料:
  • 作为一个自学练习,我正在尝试学习如何使用一些pycrypto库。我需要使用AES在CBC_模式下解密密文字符串。I密文、密钥和IV都已给出。以下是我编写的代码: 当我运行这个,我得到以下错误: ValueError:IV的长度必须为16字节 我知道IV字符串是32个十六进制字符,因此是16个字节。我认为这可能是一个打字问题,但我不知道如何纠正它。有人能帮忙吗? 非常感谢。

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

  • 我不知道我做错了什么,在这里试图用给定的密钥解密一串十六进制值,使用ruby的OpenSSL密码AES-128-CTR。 我正在使用gem hex_字符串将我的十六进制转换为字节 我知道我遗漏了一些小东西,因为我有类似的代码实现AES-128-CBC。我是否需要一个计数器,为密文中128字节的每一块递增IV?

  • 让AES密码文本解密有点困难。 在这个特定的场景中,我使用Crypto-JS在客户端加密数据,并使用PyCrypto在python服务器上解密数据。 加密。js: 解密。py: 我成功地重新计算了HMAC,但当我尝试然后解密密码时,我得到了一些似乎用密码加密的东西�'结果如何。 我在密码文本的输入长度方面遇到了错误,但当我切换到CFB模式时,修复了它,所以我认为这不是一个填充问题。

  • 问题内容: 我正在尝试使用PyCrypto构建两个接受两个参数的函数:消息和密钥,然后对消息进行加密/解密。 我在网络上找到了几个链接可以帮助我,但是每个链接都有缺陷: 在codekoala上的此代码使用了os.urandom,PyCrypto不建议这样做。 此外,我不能保证给函数的键具有预期的确切长度。我该怎么做才能做到这一点? 另外,有几种模式,推荐哪种?我不知道该怎么用:/ 最后,IV到底是

  • 我试图使用PyCrypto构建两个函数,它们接受两个参数:消息和密钥,然后加密/解密消息。 我在网上找到了几个帮助我的链接,但每一个都有缺陷: 编辑:删除了代码部分,因为它不安全。