[英]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.