Pyt*_*ast 0 python cryptography key encryption-asymmetric
我正在尝试使用非对称加密来加密我的消息。我正在使用 SHA256 算法。密钥大小是2048. 这是我的代码:-
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization, hashes
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
# saving public key
pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('public_key.pem', 'wb') as f:
f.write(pem)
# reading public key
with open("public_key.pem", "rb") as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
backend=default_backend()
)
message = {
'504201': '504346',
'504293': '504306',
'504299': '504273',
'B.O': 'B.O',
'Non-Delivery': 'Delivery',
'regionname': 'Hyderabad',
'Sirpur (t)': 'Asifabad',
'ANDHRA PRADESH\nAnnaram B.O': 'ANDHRA PRADESH\nChichdhari Khanapur B.O',
'officeType': 'S.O',
'Nirmal': 'Adilabad',
'circlename': 'Andhra Pradesh',
'Districtname': 'Adilabad',
'ANDHRA PRADESH\nBansapalli B.O': 'ANDHRA PRADESH\nDeepaiguda B.O',
'pincode': '504103',
'ANDHRA PRADESH\nAndugulpet B.O': 'ANDHRA PRADESH\nBurguda B.O',
'504202': '504313',
'504231': '504293',
'Hyderabad': 'Hyderabad',
'Khanapur': 'Utnoor',
'Luxettipet': 'Asifabad',
'officename': 'dilabad)',
'ANDHRA PRADESH\nBellalbadi B.O': 'ANDHRA PRADESH\nDhaboli B.O',
'Taluk': 'Mudhole',
'ANDHRA PRADESH\nBambara B.O': 'ANDHRA PRADESH\nCoal Chemical Complex S.O',
'ANDHRA PRADESH\nBangalpet B.O': 'ANDHRA PRADESH\nDantanpalli B.O',
'salt': 1,
'divisionname': 'Adilabad',
'statename\nAda B.O': 'ANDHRA PRADESH\nBirvelli B.O',
'Delivery': 'Delivery',
'ANDHRA PRADESH\nBhainsa S.O (A': 'ANDHRA PRADESH\nDhann',
'504106': '504311',
'Andhra Pradesh': 'Andhra Pradesh',
'ANDHRA PRADESH\nArli (T) B.O': 'ANDHRA PRADESH\nChintaguda B.O',
'504295': '504302',
'Asifabad': 'Mancherial',
'ANDHRA PRADESH\nBejjur B.O': 'ANDHRA PRADESH\nDehgaon B.O',
'504306': '504309',
'504312': '504296',
'Adilabad': 'Adilabad',
'Deliverystatus': 'Delivery',
'Chennur': 'Utnoor'
}
message = json.dumps(message).encode('utf-8')
encrypted = self.public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
Run Code Online (Sandbox Code Playgroud)
上面的代码引发异常ValueError: Data too long for key size. Encrypt less data or use a larger key size.如果我将 key_size 增加到 4096 它可以工作。但是,如果我的数据有更多的键,即使 4096 也会失败。
作为一种解决方法,我阅读了多个类似的 SO 问题,其中建议使用对称加密缩短(加密)数据,然后使用非对称加密。
我尝试了以下相同的方法:-
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(MY_ABOVE_JSON_DUMPS_MESSAGE)
encrypted = self.public_key.encrypt(
cipher_text,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
Run Code Online (Sandbox Code Playgroud)
这也会导致同样的错误,因为cipher_text它又太长了。
我怎么做对?
RSA 密码系统的性质是,您不能加密比模数更长的值(事实上,它必须更短才能安全地加密它,因为 RSA 的安全部分以填充为前提)。
如果你想加密一个更大的有效载荷,你需要构建一个系统,这样你使用对称密码加密你的有效载荷(确保它是经过身份验证的加密!cryptography提供了一个名为 Fernet 的结构,可以做到这一点),然后使用对称密钥加密您的 RSA 公钥。然后,您可以将两个密文发送给收件人。接收者可以使用他们持有的私钥解密 RSA 加密密钥,并使用生成的密钥解密更大的密文。
如果您从头开始构建这个系统,请考虑使用PyNaCl的Box,但如果您需要更流行的加密原语,那么像ECIES这样的概念也可以在不使用 RSA 的情况下实现这种能力。
| 归档时间: |
|
| 查看次数: |
3013 次 |
| 最近记录: |