拆分文件的 RSA 加密过程中的某些块导致密文块太短

Some chunks during RSA encryption on a split file result in too short ciphertext chunks

我正在尝试用 public 密钥本身加密一个大文件(这是老师的要求,不能使用 AES 密钥),尽管我知道我一次只能加密 128 个字节使用 1024 位密钥。我将文件(任何类型,.txt.pdf.xls.exe)拆分为 128 字节的块,并使用我的 public 密钥加密每个块。

from Crypto.PublicKey import RSA
from Crypto import Random
import base64

def splitter(content,n):
    return [content[i:i+n] for i in range(0, len(content), n)]
####################
def encryption(public_key, content):
    list = splitter(content,128)
    enc_data = ''
    for i in list:

        enc_data = enc_data+base64.encodestring(public_key.encrypt(i, None)[0])
        #print len(base64.encodestring(public_key.encrypt(i, None)[0]))
        print base64.encodestring(public_key.encrypt(i, None)[0])
    return enc_data
####################
def decryption(private_key, content):
    list = splitter(content,175)
    dec_data = ''
    for i in list:
        dec_data = dec_data+private_key.decrypt(base64.decodestring(i))
    return dec_data
####################

public_key=RSA.importKey(open('public_key.pem','r').read())
private_key=RSA.importKey(open('private_key.pem','r').read())

f = open('C:\Users\Administrator\Desktop\excel_example.xls','rb').read()

enc = encryption(public_key, f)
print enc

dec = decryption(private_key, enc)
print dec

通常,每个 128 字节的块将被转换为 175 位的 base64 代码,除了一些 128 字节的块变成 "AA=="

KgVqcHadyuHff0EjRC2sq83VbM8joyAp99TKYHjJQJL+l4WZd4rDnC1y/Xd7Vif60gK7Mz3h+8it
iDs4ZDD2chQz4IU0CznoeYUa5o7nl/uwiFppbXx1AlGhRO+L3Olz32eIph2oJlHvmshfMmysnXpJ
zDAqAkOOYBcagonY/7s=
QpHGS7x5bTde8YqifMIOonvUjigjpktYONSDWJU0vSIuODCiG1GPJsum4pOyJ2BseCKzTD8qGMoU
rfbHFBAObjOlkU3RjxCLuOrCk2lSPXC3eNn5DIQqXFtHFX0jfkj/hnrl0R5nQ7R5tmSFTJf2SB5A
c90pAL9hcBP8eEvnAYM=
AA==
AA==
AA==
AA==
AA==
AA==

到目前为止,此代码仅适用于 .txt 文件,它可以加密任何大小的 .txt,但所有其他文件,我有这个 "AA==" 问题。 有什么建议吗?

您使用的是普通或教科书 RSA。 RSA 仅适用于小于模 N 的输入,在您的情况下为 1024 位。因此必然会有 128 字节的输入,但在数字上大于 N 无法加密。

例如使用带有 RSA 填充的 127 字节块或 64 字节块,例如 PKCS#1 v1.5 或 PKCS#1 v2 OAEP。

附带说明:您的方案基本上是 ECB 模式下的 RSA,这在语义上是不安全的。也很容易看出,对块重新排序,解密时仍会产生明文,但会是错误的明文。您将必须在完整的结果密文上添加类似 HMAC 的内容以检测重新排序。