在我的服务器上,我使用此代码加密数据:
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==
答案 0 :(得分:3)
Python加密返回64个Base64编码字节,即加密5个字节的48个数据字节,这表明附加信息已添加到加密数据中。
使用AES加密5个字节将产生16个字节(一个块)。因此加密数据中还有32个字节。答案显示在IV之前,但只有16个字节,另外还有16个字节未知。
请注意,您复制的代码使用CFB
模式,您可能应使用CBC
模式。
鉴于缺乏加密经验,最好的建议是考虑使用RNCryptor,有许多语言版本,包括RNCryptor-python和RNCryptor iOS,它处理安全加密所需的所有细节。