Python 非对称加密-明文大小错误

Python 非对称加密-明文大小错误,python,encryption,cryptography,private-key,public-key,Python,Encryption,Cryptography,Private Key,Public Key,我正在尝试使用python的非对称加密技术对小数据进行加密。我目前正在使用M2Crypto生成1024位的私钥/公钥对 在使用了不同的python库之后,比如M2Crypto和Pycrypto(有几个变体),我遇到了纯文本大小问题:ValueError:纯文本太长了。 发生这种情况是因为我正在尝试加密数据,然后加密最后一次加密(加密高于加密),例如: 加密: EKpuuser(EKprown(数据))->EData puser:公钥用户, prown:私钥(数据)所有者 解密: DKpruser

我正在尝试使用python的非对称加密技术对小数据进行加密。我目前正在使用M2Crypto生成1024位的私钥/公钥对

在使用了不同的python库之后,比如M2Crypto和Pycrypto(有几个变体),我遇到了纯文本大小问题:ValueError:纯文本太长了。 发生这种情况是因为我正在尝试加密数据,然后加密最后一次加密(加密高于加密),例如:

加密: EKpuuser(EKprown(数据))->EData

puser:公钥用户, prown:私钥(数据)所有者

解密: DKpruser(DKpuown(EData))->数据

普鲁士:私钥用户, puown:公钥(数据)所有者

我在网络上找到了许多解决方案,但唯一帮助我解决这个问题的是在加密之前使用签名:

ciphertext = 'xpto'
m_EOi = hashlib.sha1()
m_EOi.update(ciphertext_EOi)
sig_EOi = (m_EOi.hexdigest())
但是这个解决方案不是我需要的,因为在我使用它并加密签名(并加密加密)之后,然后进行解密,无法解密签名,因此我无法获得初始消息

编辑:


我已经做过类似的事情,例如:

BLOCK_SIZE = 32 
PADDING = '{' 
message = 'today' 
key = 'aaaaaaaaaa123456' 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) cipher = AES.new(key) 
encoded = EncodeAES(cipher, message)


但我一直都有明文大小的问题。

非对称加密并不是为您所要做的事情而设计的

不对称密码通常用于混合解决方案中,以加密用于加密实际数据的对称密码系统的密钥

所以你通常有这样的东西:

您的数据+对称(随机)密钥(K)->对称密码(如AES)->密码文本

K+收件人的公共非对称密钥->非对称密码->Ke

然后你把密文传给收件人

如果您想问这与您的问题有什么关系:


K通常比非对称密码的最大数据大小小得多,而您的普通纯文本数据不是

非对称密码不是为您尝试执行的操作而设计的

不对称密码通常用于混合解决方案中,以加密用于加密实际数据的对称密码系统的密钥

所以你通常有这样的东西:

您的数据+对称(随机)密钥(K)->对称密码(如AES)->密码文本

K+收件人的公共非对称密钥->非对称密码->Ke

然后你把密文传给收件人

如果您想问这与您的问题有什么关系:


K通常比非对称密码的最大数据大小小得多,而当您使用RSA密钥加密数据时,普通纯文本数据不是

,例如,您希望使用OAEP填充数据。无论您的明文有多小,比如“今天”,它都会被填充到密钥的全模,例如1024位。如果下次尝试使用相同大小的密钥对其进行加密,则该密钥将不适用。再也没有地方再垫了。你需要一把更大的钥匙,或者,你不需要键盘。不填充将是一个很大的错误——你需要填充物是安全的

你为什么要加密两次呢?这不会让它更安全。你在设计你自己的计划吗?那是有风险的


你为什么要在密文上签名?密文上的数字签名就是在一份莫名其妙的文件上签名——试着在法庭前签名。为什么不添加MAC?

例如,当您使用RSA密钥加密数据时,您希望使用OAEP填充来填充数据。无论您的明文有多小,比如“今天”,它都会被填充到密钥的全模,例如1024位。如果下次尝试使用相同大小的密钥对其进行加密,则该密钥将不适用。再也没有地方再垫了。你需要一把更大的钥匙,或者,你不需要键盘。不填充将是一个很大的错误——你需要填充物是安全的

你为什么要加密两次呢?这不会让它更安全。你在设计你自己的计划吗?那是有风险的


你为什么要在密文上签名?密文上的数字签名就是在一份莫名其妙的文件上签名——试着在法庭前签名。为什么不加一台MAC电脑呢?

经过更多的研究,我终于找到了一些对我有帮助的东西。它不是我想要的100%(与纯文本大小错误有关),但在某种程度上帮助我使用签名来解决问题。以下是我发现信息的链接:


经过更多的研究,我终于找到了一些对我有帮助的东西。它不是我想要的100%(与纯文本大小错误有关),但在某种程度上帮助我使用签名来解决问题。以下是我发现信息的链接:


您试图加密的明文有多长时间?我正在用非常小的数据进行测试。例如,像“Today”这样的字符串。您试图加密的明文有多长?我正在用非常小的数据进行测试。例如,像“Today”这样的字符串。我已经做了类似于您所说的事情,例如:1)
BLOCK_SIZE=32 PADDING='{message='Today'key='aaaaaaaaaa 123456'pad=lambda s:s+(BLOCK_SIZE-len(s)%BLOCK_SIZE)*PADDING EncodeAES=lambda c,s:base64.b64encode(c.encrypt(pad(s)))cipher=AES.new(key)encoded=EncodeAES(密码,消息)
------------------------------------2)
key=123 h1=SHA256.new()h1.update(key)key1=h1.digest()[0:16]iv1=Random.new().read(16)cipher1=AES.new(key1,AES.MODE_CFB,iv1)scriptogram1=iv1+cipher1.encrypt(data1)
但是我总是有明文大小的问题。@Psycho_Mind用澄清来更新你的问题,而不是在评论中发布不可读的代码。我已经做了一些你说的事情,例如:1)
BLOCK_size=32 PADDING='{'message='today'key='aaaaaaaaaaaaa 123456'pad=lambda s:s+(BLOCK_size-len(s)%BLOCK_SIZE)*PADDING EncodeAES=lambda c,s:base64.b64encode(c.encrypt(pad(s))
key = 123 
h1 = SHA256.new() 
h1.update(key) 
key1 = h1.digest()[0:16] 
iv1 = Random.new().read(16) 
cipher1 = AES.new(key1, AES.MODE_CFB, iv1) 
criptogram1 = iv1 + cipher1.encrypt(data1)