非对称加密 - 明文大小错误
我正在尝试用Python进行小数据的加密,使用的是非对称加密技术。目前我在用M2Crypto生成1024位的私钥和公钥对。
在使用不同的Python库,比如M2Crypto和Pycrypto(还有一些变种)后,我遇到了明文大小的问题:ValueError: 明文太长。这个问题出现是因为我在尝试对数据进行加密,然后再对最后的加密结果进行加密(也就是加密再加密),例如:
加密过程: EKpuuser(EKprown(Data)) -> EData
这里的puser是公钥用户,prown是私钥(数据)拥有者。
解密过程: DKpruser(DKpuown(EData)) -> Data
这里的pruser是私钥用户,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)
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)
但是我总是遇到明文大小的问题。
3 个回答
当你用RSA密钥加密数据时,比如说,你想用OAEP填充来处理数据。无论你的原始数据有多小,比如“今天”,它都会被填充到密钥的完整模数,比如1024位。如果你接着想用同样大小的密钥再加密一次,那就不行了,因为没有空间再填充了。你需要一个更大的密钥,或者就不填充。但不填充是个大错误——你需要填充来确保安全。
那么,为什么要加密两次呢?这样并不会让安全性更高。你是在自己设计方案吗?那样风险很大。
为什么要对密文进行签名呢?对密文的数字签名就像是在签署一份看不懂的文件——试想一下把这个签名拿到法庭上去。为什么不直接加一个消息认证码(MAC)呢?
非对称加密并不是为了你想做的事情而设计的。非对称加密通常用于混合解决方案中,用来加密对称加密系统的密钥,而对称加密系统则是用来加密实际的数据。
通常是这样的:
data + a symmetric (random) key (K) -> symmetric cipher (e.g. AES) -> cipher text
K + public asymmetric key of the recipient -> asymmetric cipher -> Ke
然后你把密文和 Ke
发送给接收者。
K
通常比非对称加密的最大数据大小要小得多,而你的普通明文数据则不是。
经过更多的研究,我找到了一些对我有帮助的东西。虽然这不是我最初想要的(与纯文本大小错误有关),但它以一种我可以使用签名的方法来解决这个问题。这里是我找到这些信息的链接: