python rsa库_Python Crypto,RSA公钥/私钥,包含大文件

我现在知道RSA公钥/私钥只能一次加密非常短的输入,但任何人都可以提供一种方法来加密任何类型的文件(.txt,.phf,.exe等)只有公钥/私钥?我不想要额外的AES密钥.

这是我的代码,我的加密和解密后,我没有得到原始内容与公共&私钥.我不关心加密或解密的安全性,我只想让简单的加密解密工作在它可能需要的任何输入上,无论它有多长或多大.

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的密钥大小(在您的情况下为1024位)和使用的填充.比这更大的东西(没有使用填充时为128字节,如果使用填充则更少)并且您无法再恢复它.

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

>生成一个随机字节串16,24或32字节用作AES密钥,

>使用以前生成的密钥和AES使用AES加密实际数据

>使用RSA加密AES密钥.

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)

并且只发送msg和密文.解密类似,但后退,因为您首先必须从RSA密文恢复AES密钥.在使用AES解密时,不要忘记切掉IV.

标签:pycrypto,python,encryption,cryptography,rsa

来源: https://codeday.me/bug/20190722/1505364.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值