Python Crypto,RSA 公钥/私钥,大文件

标签 python encryption cryptography rsa pycrypto

我现在知道 RSA 公钥/私钥只能一次加密非常短的输入,但是谁能提供一种方法来加密任何类型的文件(.txt、.phf、.exe 等),只使用 public/私钥?我不想有额外的 AES key 。

这是我的代码,在用一对公钥和私钥加密和解密后,我没有取回原始内容。我不关心我的加密或解密有多安全,我只希望简单的加密解密可以处理它可能需要的任何输入,无论它有多长或多大。

from Crypto.PublicKey import RSA
from Crypto import Random


random_generator = Random.new().read
key = RSA.generate(1024, random_generator)
public_key = key.publickey()

f = open('C:\Users\Administrator\Desktop\jack.txt','r').read()

print 'original content: '+ f

enc_data = public_key.encrypt(f, 32)
print 'encrypted data: '
print enc_data

dec_data = key.decrypt(enc_data)
print 'decrypted data: '+ dec_data

这是输出:

original content: Python Cryptography Toolkit

A collection of cryptographic modules implementing various algorithms and protocols.

Subpackages:

Crypto.Cipher
Secret-key (AES, DES, ARC4) and public-key encryption (RSA PKCS#1) algorithms
Crypto.Hash
Hashing algorithms (MD5, SHA, HMAC)
Crypto.Protocol
Cryptographic protocols (Chaffing, all-or-nothing transform, key derivation functions). This package does not contain any network protocols.
Crypto.PublicKey
Public-key encryption and signature algorithms (RSA, DSA)
Crypto.Signature
Public-key signature algorithms (RSA PKCS#1)
Crypto.Util
Various useful modules and functions (long-to-string conversion, random number generation, number theoretic functions)
encrypted data: 
('\x08\xe3\x9d\x03\x1e\xe9(\xe2\xc7\xc6e\x0b5\x02\xc0\xd8G\x1f\xf5\xb8\x9cMC\x93Z\x982\xa5\x97\xec\xab4\x18\xc2\xc8\xd9\xd3\x99aX\xd96b\x19\x96\xdc\x1d|F\xe0\xa9\xa9\xea\x03\x10>0g\x83\xdb\xeb\xdb\x13\x91\xc6\xd8\xf6\x95\xedE@A\x0bc\xae\xbe\xbe\xf0\xde\xcc\xcexk\x10\xb3\x86\xd3\xdd\xd0\xca@T2\x9a\x8a6ut\xb1\xaf\x07\x1f\xa2M\r\xf0D\xa2`h\xc3\x89\x18\x0e\xd4\xca\xee\xf5\xfc\x01\xed\x95}X\x1f\x13 1',)
decrypted data: ���J�rPX �����ju�a,�xm�'�]��ٟ�?y;�)��tĹ�,�D4^�ba�8����9q
+�i��l �q]Kd�Y���u��S�B���Ϲ�^�A3
.7��j��m�
�6�dl� qU

最佳答案

RSA 只能加密有限数量的输入。多少取决于 RSA 的 key 大小(在您的情况下为 1024 位)和使用的填充。任何大于它的东西(不使用填充时为 128 字节,如果使用填充则更少)并且您无法再恢复它。

解决方案是使用混合加密。

  1. 生成一个 16、24 或 32 字节的随机字节串用作 AES key ,
  2. 使用先前生成的 key 使用 AES 加密实际数据
  3. 使用 RSA 加密 AES key 。

AES加密:

from Crypto.Cipher import AES
from Crypto import Random

aeskey = Random.new().read(32)
iv = Random.new().read(AES.block_size)
cipher = AES.new(aeskey, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')

RSA 加密(使用像 OAEP 这样的适当填充,因为教科书 RSA 被严重破坏):

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

message = aeskey
random_generator = Random.new().read
rsakey = RSA.generate(1024, random_generator)
cipher = PKCS1_OAEP.new(rsakey.publickey())
ciphertext = cipher.encrypt(message)

并且只发送msgciphertext。解密是类似的,但是是倒退的,因为您首先必须从 RSA 密文中恢复 AES key 。使用 AES 解密时不要忘记切掉 IV。

关于Python Crypto,RSA 公钥/私钥,大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28426102/

相关文章:

python - atof 返回无法将字符串转换为 float : '2, 5'

用于打印 bash 颜色的 python 类

javascript - AJAX 安全规范

ios - 苹果为何在压缩.ipa之前先对其进行加密?

c# - 可移植类库 (PCL) 贡献 - 密码学

python - 将函数结果写入 stdin

python - 如何使用子进程与 python 脚本交互

php - 128位PHP数据加密和解密

cryptography - 2010 年及以后的密码破解

ios - iOS 上的 CMAC-AES