我正在尝试使用公钥加密大型文件(这是教师的要求,不能使用AES密钥),即使我知道我一次只能加密128个字节使用1024位密钥。我将文件(任何类型,.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 =="问题。 有什么建议吗?
答案 0 :(得分:0)
您正在使用普通或教科书RSA。 RSA仅适用于小于模数 N 的输入,在您的情况下为1024位。因此,必然会有128字节的输入,但数字上大于 N 的输入无法加密。
例如使用带有RSA填充的127字节块或64字节块,例如PKCS#1 v1.5或PKCS#1 v2 OAEP。
作为旁注:您的方案基本上是ECB模式下的RSA,这在语义上是不安全的。很容易看出,重新排序块在解密时仍会产生明文,但明文错误。您必须在完整的结果密文上添加类似HMAC的内容以检测重新排序。