【问题标题】:Trouble with AES Cryptography (specifically encrypting with CryptoSwift and decrypting with PyCryptodomeAES 加密问题(特别是使用 CryptoSwift 加密和使用 PyCryptodome 解密)
【发布时间】:2019-08-02 18:02:06
【问题描述】:

我目前正在尝试使用 AES 加密技术来加密和解密一个长度始终为 9 个字符的字符串。我要做的是快速加密字符串,然后在 python 中解密该加密字符串。我使用 AES 加密和 CryptoSwift 并使用 PyCryptodome 解密。

这就是我在 swift 中的功能:

import CryptoSwift
func crypto_testing() {
        print("Cryptography!")

        let ivString = "0000000000000000"
        let keyString = "This is a key123"

        let key = [UInt8](keyString.utf8)
        let iv = [UInt8](ivString.utf8)
        let stringToEncrypt = "123456789"


        let enc = try! aesEncrypt(stringToEncrypt: stringToEncrypt, key: key, iv: iv)
        print("ENCRYPT:",enc)
    }


    func aesEncrypt(stringToEncrypt: String, key: Array<UInt8>, iv: Array<UInt8>) throws -> String {
        let data = stringToEncrypt.data(using: String.Encoding.utf8)
        let encrypted = try AES(key: key, blockMode: CFB(iv: iv), padding: .noPadding).encrypt((data?.bytes)!)
        return encrypted.toHexString() //result
    }

我运行crypto_testing函数得到的结果是:

Cryptography!
ENCRYPT: 5d02105a49e55d2ff7

此外,这就是我在 python 中的解密函数的样子:

import binascii
from Crypto.Cipher import AES

KEY = b'This is a key123'
IV = b'0000000000000000'
MODE = AES.MODE_CFB

def decrypt(key, iv, encrypted_text):
    aes = AES.new(key, MODE, iv)
    encrypted_text_bytes = binascii.a2b_hex(encrypted_text)
    decrypted_text = aes.decrypt(encrypted_text_bytes)
    return decrypted_text

decrypted_text = decrypt(KEY, IV, encrypted_text)
print(decrypted_text)

将加密消息插入解密函数的结果如下:

>>> decrypt(b'This is a key123', b'0000000000000000', '5d02105a49e55d2ff7')

b'1%\xdc\xc8\xa0\r\xbd\xb8\xf0' 

如果有人知道这里出了什么问题,那将是一个很大的帮助。

【问题讨论】:

  • Pycryptodome 中 CFB 的默认段大小为 8 位 (docs)。在AES.new() 中使用此参数segment_size=128 尝试您的Python 代码。
  • 谢谢亚当,完美解决了我的问题
  • 设置 128 不适合您。您想加密 9 个字符。我的建议是使用不需要填充的 CTR 模式。

标签: python swift encryption pycryptodome cryptoswift


【解决方案1】:

试试这个:


let stringToEncrypt = "123456789"

var aes: AES

var encrypted: [UInt8]

do {

aes = try AES(key: key, blockMode: CBC(iv: iv), padding: . noPadding)

 encrypted = try aes.encrypt(stringToEncrypt.bytes)

}

let base64Encypted = encrypted.toBase64()```

【讨论】:

  • 在哪里试试这个?
  • 我签入了我的代码。我创建了 2 种方法一,用于 swift 本身的加密和解密。请在最后尝试。
  • 是的,我可以自己在 python 和 swift 中加密和解密。我遇到的问题是跨语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多