![](/img/trans.png)
[英]AES encryption between python and Node.js with PKCS7Padding
[英]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.