簡體   English   中英

Python Crypto AES 128 with PKCS7Padding different output from Swift vs Python

[英]Python Crypto AES 128 with PKCS7Padding different outputs from Swift vs Python

加密產生的 output 具有以下密鑰

key = base64.b64decode('PyxZO31GlgKvWm+3GLySzAAAAAAAAAAAAAAAAAAAAAA=') (16 bytes)

message = "y_device=y_C9DB602E-0EB7-4FF4-831E-8DA8CEE0BBF5"

我的IV object 看起來像這樣: iv = base64.b64decode('AAAAAAAAAAAAAAAAAAAAAA==')

目標 C CCCrypt產生以下 hash 4Mmg/BPgc2jDrGL+XRA3S1d8vm02LqTaibMewJ+9LLuE3mV92HjMvVs/OneUCLD4

它似乎正在使用AlgorithmAES128使用PKCS7Padding和上面提供的密鑰。

我正在嘗試實現相同的加密編碼功能以獲得 output 像4Mmg/BPgc2jDrGL+XRA3S1d8vm02LqTaibMewJ+9LLuE3mV92HjMvVs/OneUCLD4

這就是我到目前為止所能提供的

from Crypto.Util.Padding import pad, unpad
from Crypto . Cipher import AES
class MyCrypt():
    def __init__(self, key, iv):
        self.key = key
        self.iv = iv
        self.mode = AES.MODE_CBC
   
    def encrypt(self, text):
      cryptor = AES.new(self.key, self.mode, self.iv)
      length = 16
      text = pad(text, 16)
      self.ciphertext = cryptor.encrypt(text)
      return self.ciphertext


key = base64.b64decode('PyxZO31GlgKvWm+3GLySzAAAAAAAAAAAAAAAAAAAAAA=')
IV = base64.b64decode('AAAAAAAAAAAAAAAAAAAAAA==')
plainText = 'y_device=y_C9DB602E-0EB7-4FF4-831E-8DA8CEE0BBF5'.encode('utf-8')
crypto = MyCrypt(key, IV)
encrypt_data = crypto.encrypt(plainText)
encoder = base64.b64encode(encrypt_data)
print(encrypt_data, encoder)

這會產生以下 output Pi3yzpoVhax0Cul1VkYoyYCivZrEliTDBpDbqZ3dD1bwTUycstAF+MLSTIjSMiQj而不是4Mmg/BPgc2jDrGL+XRA3S1d8vm02LqTaibMewJ+9LLuE3mV92HjMvVs/OneUCLD4

這不是我想要的 output。 我不應該使用MODE_ECB ,還是按預期使用key

添加更多上下文

我對 Crypto/Objective C 很天真。

我目前正在測試一個應用程序,它在幕后進行了一些哈希處理。

使用 frida 我正在跟蹤這些 function 調用,我看到為 swift Objc 調用填充了以下內容。

CCCrypt(operation: 0x0, CCAlgorithm: 0x0, CCOptions: 0x1, keyBytes: 0x1051f8639, keyLength: 0x10, ivBuffer: 0x1051f8649, inBuffer: 0x2814bd890, inLength: 0x58, outBuffer: 0x16f1c5d90, outLength: 0x60, outCountPtr: 0x16f1c5e10)

在哪里

CCCrypt(operation: 0x0, CCAlgorithm: 0x0, CCOptions: 0x1, keyBytes: 0x1051f8639, keyLength: 0x10, ivBuffer: 0x1051f8649, inBuffer: 0x280e41530, inLength: 0x2f, outBuffer: 0x16f1c56c0, outLength: 0x30, outCountPtr: 0x16f1c5710)
In buffer:
            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
280e41530  79 5f 64 65 76 69 63 65 3d 79 5f 43 39 44 42 36  y_device=y_C9DB6
280e41540  30 32 45 2d 30 45 42 37 2d 34 46 46 34 2d 38 33  02E-0EB7-4FF4-83
280e41550  31 45 2d 38 44 41 38 43 45 45 30 42 42 46 35     1E-8DA8CEE0BBF5
Key:  16 47
            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
1051f8639  3f 2c 59 3b 7d 46 96 02 af 5a 6f b7 18 bc 92 cc  ?,Y;}F...Zo.....
IV:  16
            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF
1051f8649  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

我使用https://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h來引用基於指針發生的加密類型,即對於Options參數,以下是通過0x1

鍵 = base64.b64decode('PyxZO31GlgKvWm+3GLySzAAAAAAAAAAAAAAAAAAAAAA=') (16 字節)

不,那是 32 個字節。 確實只有 16 個非零,這是一個非常糟糕的密鑰,但是如果你傳遞 256 位,你正在做 AES-256,你會得到與使用前 128 位的 AES-128 不同的結果那把鑰匙的。

您的標題提到了 PKCS #7 填充,但看起來您的代碼用零填充。 這也會改變結果。

歐洲央行不使用IV。 如果您可以看到 Swift 代碼正在使用 IV,您可能也可以看到它使用的模式,或者您可以嘗試 CBC 作為第一個猜測。 在大多數情況下,歐洲央行是不安全的。 當然,使用固定的 IV 也是不安全的。

您的 output 比應有的長度長(64 字節而不是 48 字節)。 您嘗試自己進行填充可能是造成這種情況的原因。

<CommonCryptor.h>中,我們可以解碼 Swift 調用 CCCrypt 時使用的參數:

類型 價值 姓名 評論
C操作 0x0 kCC加密 對稱加密。
CC算法 0x0 kCC算法AES128 高級加密標准,128 位塊
CC選項 0x1 kCCOptionPKCS7Padding 執行 PKCS7 填充。
CC選項 0x2 kCCOptionECB模式 電子密碼本模式。 默認為 CBC。

CCOptions是位域, kCCOptionECBMode沒有設置,所以使用默認。

所以這是 CBC 模式下的 AES-128,帶有 PKCS #7 填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM