在iOS和Python上的Swift之间兼容AES加密

时间:2016-04-06 11:03:02

标签: python ios swift encryption

在我的服务器上,我使用此代码加密数据:

class AESCipher(object):

    def __init__(self, key, iv, block_size=32):
        self.bs = block_size
        self.iv = iv
        self.encoder = PKCS7Encoder(block_size=self.bs)
        self.key = hashlib.sha256(key.encode()).digest()

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

并使用此代码:https://github.com/janglin/crypto-pkcs7-example/blob/master/pkcs7.py进行填充。

在我的应用中,我使用this answer来解密和加密。

但我得到了不同的结果: 在python:

cipher = AESCipher(BaseConfig.AES_KEY, BaseConfig.AES_IV)
print cipher.encrypt("hello") #returns: Z3FMT0hVaW9RMFFqaHV2SXMOLB2j6ZdRhuUKwE60BBRYa6bgS2gFqgR/VFKXyJiU

在swift:

print(try! "hello".aesEncrypt(GVariables.AESKey, iv: GVariables.AESIv)) //reutrns: 9OpPH19GmTd6n0dsXFJ0mQ==

1 个答案:

答案 0 :(得分:3)

Python加密返回64个Base64编码字节,即加密5个字节的48个数据字节,这表明附加信息已添加到加密数据中。

使用AES加密5个字节将产生16个字节(一个块)。因此加密数据中还有32个字节。答案显示在IV之前,但只有16个字节,另外还有16个字节未知。

请注意,您复制的代码使用CFB模式,您可能应使用CBC模式。

鉴于缺乏加密经验,最好的建议是考虑使用RNCryptor,有许多语言版本,包括RNCryptor-pythonRNCryptor iOS,它处理安全加密所需的所有细节。