如何使M2Crypto与aes128-cbc-pkcs7一起使用?

时间:2013-12-08 15:54:10

标签: python cryptography pycrypto m2crypto

在Python脚本中我需要解密由aes128-cbc-pkcs7加密的数据

我在Problem with M2Crypto's AES回答中检查了示例,但它描述了aes128-cbc,我不知道如何将其用于aes128-cbc-pkcs7

我拥有的只是一把钥匙:

key = 'MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHdH2zoKQJ43olhVZstEiBHjZvhUkGL1YcB2baSlHsHjoV5uRkYDyPEHUaN7htski3aGoIUY1vEF7nv0dJaM686KqEfkIxzlRizdnNJr+A8j1OOnOPOooqTuf06570kEEqXCW2STlLIMxwIESPHXAqiKYMPUtNGfu+PpmdY6NUHDAgMBAAE='

    key = """MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHdH2zoKQJ43olhVZstEiBHjZvhU
kGL1YcB2baSlHsHjoV5uRkYDyPEHUaN7htski3aGoIUY1vEF7nv0dJaM686KqEfk
IxzlRizdnNJr+A8j1OOnOPOooqTuf06570kEEqXCW2STlLIMxwIESPHXAqiKYMPU
tNGfu+PpmdY6NUHDAgMBAAE="""

我不确定如何以正确的方式存放钥匙 - 使用直线制动器或不使用。

请举例说明如何使用aes128-cbc-pkcs7进行编码/解码,应该类似于aes128-cbc(在Problem with M2Crypto's AES中解释)

对不起,如果问题听起来很奇怪,我就是密码学的新手。

1 个答案:

答案 0 :(得分:2)

如果您已获得RSA公钥,则无法仅使用AES加密。您需要使用混合加密:生成16,24或32字节的随机AES密钥,然后加密。如果为每次加密生成新的AES密钥,则可以保持为零IV。

然后,可以使用您提供的公钥对AES密钥进行加密,使用OAEP或 - 为了向后兼容 - PKCS#1 v1.5 padding

如果我正确阅读文档,默认模块似乎不使用填充。我在pastebin找到了填充/取消填充例程,感谢Peter分享:

def pkcs7_pad(data, blocksize=16):
    padlen = blocksize - len(data) % blocksize
    return data + bytes([padlen]) * padlen


def pkcs7_unpad(data, blocksize=16):
    if data:
        padlen = data[-1]
        if 0 < padlen < blocksize:
            if data.endswith(bytes([padlen]) * padlen):
                return data[:-padlen]

    raise ValueError('incorrect padding')

请注意,如果您通过通信渠道使用此加密,则加密并不安全。即使您只需要明文的机密性,也需要添加消息验证代码(MAC)。不正确使用CBC模式加密可能会使协议容易受到填充oracle攻击。