AES 256位CBC PKCS#5 Python加密/解密

2024-04-26 13:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个应用程序,它需要加密/解密来自和发送到用AS3编码的客户端应用程序的数据(是的,我知道…),它使用这个库http://crypto.hurlant.com/

我在这里或那里找到了许多关于使用Python进行AES加密的线程,但由于某些原因,我无法在我的案例中使用它们。在

我的加密数据是AES 256位CBC PKCS#5然后Base64编码并通过web套接字传输到Python。在

客户端应用程序生成的数据示例:

密钥:fce4aa4dcf0d2b27fe4ffdafa602c81d1930c410f48ada5c763d4c4052a939eb

四:c75271d593ca86ca785e3bb25e8d02cb

清晰的数据:这个该死的加密引擎不工作了!在

加密数据:44FsQIcqM412+YXZBwwoQSCz2uB9QPQMXJ410Xpw1f/M5RTRS7N6yfziAGq/Fd/E

我试着在这个线程Encrypt & Decrypt using PyCrypto AES 256上使用代码,但是有太多不同设置的例子,我不知道该选哪一个,我真的是一个加密的傻瓜。 有什么帮助吗?在


Tags: 数据com应用程序http客户端编码原因crypto
1条回答
网友
1楼 · 发布于 2024-04-26 13:16:22

下面的代码可以满足您的需要。它基本上是你的链接问题的highest voted answer与外部的IV集有关。在

Python2.x代码(如果需要Python3。x代码您必须以不同的方式进行十六进制解码):

import base64
from Crypto.Cipher import AES
from Crypto import Random

BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
unpad = lambda s : s[:-ord(s[len(s)-1:])]

class AESCipher:
    def __init__( self, key ):
        self.key = key

    def encrypt( self, raw, iv ):
        raw = pad(raw)
        cipher = AES.new( self.key, AES.MODE_CBC, iv )
        return base64.b64encode( cipher.encrypt( raw ) )

    def decrypt( self, enc, iv ):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return unpad(cipher.decrypt( enc ))

a = AESCipher('fce4aa4dcf0d2b27fe4ffdafa602c81d1930c410f48ada5c763d4c4052a939eb'.decode('hex_codec'))
print a.encrypt("This bloody encryption engine won't work !", 'c75271d593ca86ca785e3bb25e8d02cb'.decode('hex_codec'))

b = AESCipher('fce4aa4dcf0d2b27fe4ffdafa602c81d1930c410f48ada5c763d4c4052a939eb'.decode('hex_codec'))
print b.decrypt('44FsQIcqM412+YXZBwwoQSCz2uB9QPQMXJ410Xpw1f/M5RTRS7N6yfziAGq/Fd/E', 'c75271d593ca86ca785e3bb25e8d02cb'.decode('hex_codec'))

输出

^{pr2}$

静脉注射一定是不可预测的。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。静脉注射不是秘密的,所以你可以把它和密文一起发送。通常,它只是在密文前面加上一层,然后在解密之前被切掉。在

相关问题 更多 >