簡體   English   中英

如何將C#中的AES/GCM-256加密轉換為python?

[英]How to convert AES/GCM-256 encryption in C# to python?

我正在C#在function中轉換加密C#至Python。我在88274274259905488和我使用的情況下找到了以下代碼。 . 我的 Python function 生成的 output 字符串(編碼)與 C# function 的 output 不同,盡管我的輸入(密鑰、iv 和數據)在兩個函數中是相同的。

如果有人能幫助我,我將不勝感激

我的密鑰是:b'4fda3c622e966e0839441401bbd3b8f191d4267bf5f19b40812a34b212fd3ed9'

我的 iv 是:b'4fda3c622e966e0839441401bbd3b8f191d4267bf5f19b40812a34b212fd3ed9'

C# function

        public static string AesEncrypt(byte[] payload, byte[] key, byte[] iv)
        {
            var cipher = new GcmBlockCipher(new AesEngine());

            byte[] baPayload = new byte[0];
            cipher.Init(true, new AeadParameters(new KeyParameter(key), 128, iv, baPayload));
            var cipherBytes = new byte[cipher.GetOutputSize(payload.Length)];
            int len = cipher.ProcessBytes(payload, 0, payload.Length, cipherBytes, 0);
            cipher.DoFinal(cipherBytes, len);
            return Convert.ToBase64String(cipherBytes);
        }

可以使用以下 C# 中的 function PASSPHRASE 將其轉換為字節:

 public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                            .Where(x => x % 2 == 0)
                            .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                            .ToArray();
        }

python:

PASSPHRASE= b'a4b42ed2702cb1b00a14f39a88c719cb04e5e8b29e2479634c990258e327483'

        def AES_encrypt(data,iv):
           global PASSPHRASE
           data_json_64 = data
           key = binascii.unhexlify(PASSPHRASE)
           cipher = AES.new(key, AES.MODE_GCM, iv)
           x = cipher.encrypt(data)
           return x

因為我所有的數據都是一樣的,所以我希望我的 output 是一樣的,但事實並非如此

我對 C# 和 Python 的輸入測試字符串是: "In publishing and graphic design, Lorem ipsum is a"

我對 C# 和 Python 的 iv 是: '4fda3c622e966e0839441401bbd3b8f191d4267bf5f19b40812a34b212fd3ed9'

C#中編碼的output為: 02Em9Vve6fWtAcVNesIXzagoB327EmskwMZdRippAAaxqAzkp0VeGSjctbaguqA/01CnPHB2PkRDDOxjgZ9pAfu2

Python中編碼的output為: HudpKzIov7lNt4UNng+a9P/FLXrzdenwDBT4uFYhIUc3XOS7TpaCzxja8I+zHCdXnvk=

在根據您的評論實施建議的更改並對您的代碼進行一些小調整后,可以重現您的 C# 結果。 主要問題是密文句柄和標簽 正如@Topaco在評論中所述,C# 隱式連接 ciphertext 和 tag 為ciphertext|tag ,這意味着您需要在代碼中執行相同的操作。 如果您遵循GCM 文檔,您將看到您需要使用encrypt_and_digest() function 來獲取密文和標簽。 這是您需要更改的內容:

  • cipher = AES.new(key, AES.MODE_GCM, iv) cipher = AES.new(key, AES.MODE_GCM, binascii.unhexlify(iv))
  • x = cipher.encrypt(data) x, key = cipher.encrypt_and_digest(data)
  • return x return x + key

這些更改應該可以幫助您修復代碼。 我還有一些其他的建議。 我不會在您的代碼中使用全局變量。 對於初學者,這意味着您的 function 應該是AES_encrypt(data, key, iv)而不是AES_encrypt(data, iv) 為什么全局變量是個壞主意? 在這種特殊情況下,使用全局變量作為密碼是沒有意義的,因為您不應該使用相同的密碼來加密所有內容。 此外,在談論加密時,您會看到每種算法都使用與密碼不同的密鑰。 在這里,您正在實施基於密碼的加密。 但是,您沒有正確執行此操作,因為您使用密碼(密碼)作為加密密鑰。 基於密碼的加密背后的想法是使用良好的摘要/密鑰擴展技術從您的密碼創建密鑰。 最后,您應該查看NIST 特別出版物 800-38D ,以了解有關實施安全加密時 GCM 和 NIST 建議參數的更多信息。

暫無
暫無

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

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