首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cryptography.Hazmat密码输出长度

Cryptography.Hazmat密码输出长度
EN

Stack Overflow用户
提问于 2019-09-22 12:07:17
回答 1查看 746关注 0票数 4

在Python中,使用Cryptography.Hazmat模块的AES,加密的输出长度不是16的倍数;我是否实现了加密密码错误,如果是,有什么问题吗?我收到的输出长度是16 + len(input) (16,因为它是IV的长度)。以下代码如下:

代码语言:javascript
复制
from cryptography.hazmat.primitives.ciphers import Cipher
from cryptography.hazmat.primitives.ciphers.algorithms import AES
from cryptography.hazmat.primitives.ciphers.modes import CBC,OFB,CFB

class AES_Cipher:   
  def __init__(self,key):
    self.key = key

  def encrypt(self,plain_text):
    initialization_vector = urandom(16)
    cipher = Cipher(AES(self.key),OFB(initialization_vector),backend)
    encryption_engine = cipher.encryptor()
    return initialization_vector + encryption_engine.update(plain_text.encode("utf-8")) + encryption_engine.finalize()

  def decrypt(self,cipher_text):
    initialization_vector = cipher_text[:16]
    cipher = Cipher(AES(self.key),OFB(initialization_vector),backend)
    decryption_engine = cipher.decryptor()
    return (decryption_engine.update(cipher_text[16:]) + decryption_engine.finalize()).decode("utf-8")

密码的名称如下:

代码语言:javascript
复制
from hashlib import sha3_256
aes_key = sha3_256(b"Strong Encryption Key").digest()
aes_engine = AES_Cipher(aes_key)
aes_engine.encrypt("Hello World")

这就是结果:

b'\xc4I\xf2\xe5\xf4\xaeX\x96\xa5\xfe\xbd+\xde\x8ca\xd5\xdb\xad\x97S\x01\x81C\x9e\xd5\xd8@'

这只有27字节长,而预期的32字节。27 = 16 +len(“”)。为什么它不是32字节长?代码丢失了什么?另一件事,解密工作得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-23 08:59:02

27字节的长度对于OFB是正确的。

Python代码中使用的OFB模式将分组密码转换为流密码.更详细地描述了分组密码和流密码的区别。特别是,明文输入的长度对于流密码可以是任意的,也就是说,与块密码相比,长度不必是块大小的整数倍,因此不需要填充。生成的密文具有与明文相同的长度。

在当前的示例中,明文Hello (因此也是密文)的长度为11个字节。与长度为16字节的IV一起,总长度为27字节,与您的结果完全对应。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58049057

复制
相关文章

相似问题

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