【问题标题】:Some chunks during RSA encryption on a split file result in too short ciphertext chunks对拆分文件进行 RSA 加密期间的某些块导致密文块太短
【发布时间】:2015-04-10 12:49:13
【问题描述】:

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

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==”问题。 有什么建议吗?

【问题讨论】:

    标签: python encryption cryptography rsa


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多