【问题标题】:Python RSA message encryption "Plaintext is too long"?Python RSA消息加密“明文太长”?
【发布时间】:2021-01-23 07:54:53
【问题描述】:

我正在使用以下代码来实现用于加密和解密数据的基本 RSA 解决方案,但是当我尝试加密任何长度超过 87 个字符的文本时,我收到来自文件 Crypto/Cipher/PKCS1_OAEP.py 的错误消息 Plaintext is too long .

我读到了 RSA 无法加密和解密大量数据的其他问题,但我不确定这是否属实。如果是,我可以使用哪些其他选项来加密任意数量的数据?

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
from Crypto import Random
from base64 import b64encode, b64decode
hash = "SHA-256"

def newkeys(keysize):
   random_generator = Random.new().read
   key = RSA.generate(keysize, random_generator)
   private, public = key, key.publickey()
   return public, private

def encrypt(message, pub_key):
   cipher = PKCS1_OAEP.new(pub_key)
   return cipher.encrypt(message)

【问题讨论】:

  • 您可以阅读这里给出的一些建议:crypto.stackexchange.com/questions/50033/…
  • @KrishnaChaurasia 感谢您指出显而易见的问题,您了解该问题中提出的任何解决方案吗?好吧,我也没有。
  • RSA 只能加密明文的密钥长度,例如,使用 RSA 2048 密钥 = 2048 位 = 256 字节)您可以加密 256 字节减去所需的数据内部填充,所以最后你可以加密大约数百字节的明文(取决于密钥长度)。加密较长明文的解决方案是使用混合加密,这意味着您在 GCM 模式下使用 AES 等 对称 算法加密数据,并使用随机生成的密钥(32 字节长)。在第二步中,您使用您的 RSA 公钥加密此密钥。用于解密 - 首先是 RSA,而不是 AES。

标签: python rsa


【解决方案1】:

我这样修复它:[这是我的代码,我没有编辑你的]

    with open(file, 'rb') as f: 
        fernet_key = f.read() 
        if len(fernet_key) > 80 : 
            fernet_key1 = ''
            tostart = 0
            toadd = 0
            flag_tostart = 0
            while True: 
                if fernet_key1 == fernet_key: 
                    break
                else:
                    flag_tostart = flag_tostart +1
                    if flag_tostart == '2'or flag_tostart > 2 or flag_tostart == 2: 
                        tostart = tostart + 80


                    toadd = toadd +80
                    
                    if tostart == 0 : 
                        tostart = 0 
                    
                    else:   
                        tostart = tostart + 80

                    fernet_key[tostart:toadd] += fernet_key1

                    public_crypter = PKCS1_OAEP.new(public_key)

                    with open(file, 'wb') as f: 
                        enc_fernet_key = 
                        public_crypter.encrypt(fernet_key1)

                        f.write(enc_fernet_key)

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2015-08-11
    • 2020-08-05
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多