Я пытаюсь расшифровать мой ESP-пакет, зашифрованный с помощью AES128-GCM12. Я использовал c библиотеку openssl для расшифровки. Но расшифрованный результат неверен!
Я использовал две виртуальные машины Linux 18.04 для имитации пакета ESP с помощью IPS strongswan. Я захватил пакет ESP и распечатал все мои переменные в моей функции расшифровки.
static void _aes_gcm_decrypt(uint8_t* payload, uint16_t payload_len, uint8_t* key, uint16_t key_len, uint8_t* iv, uint8_t iv_len, uint8_t* icv, uint8_t icv_len, uint8_t* aad, uint8_t aad_len) {
EVP_CIPHER_CTX *ctx;
int outlen;
uint8_t outbuf[1024];
int rv;
const EVP_CIPHER *cipher;
// Ignore salt
key_len -= 4;
switch(key_len) {
case 16: cipher = EVP_aes_128_gcm(); break;
case 24: cipher = EVP_aes_192_gcm(); break;
case 32: cipher = EVP_aes_256_gcm(); break;
default: break;
}
print_hex("original payload", payload, payload_len);
print_hex("key", key, key_len);
print_hex("iv", iv, iv_len);
print_hex("icv", icv, icv_len);
print_hex("aad", aad, aad_len);
ctx = EVP_CIPHER_CTX_new();
// Select cipher
EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv);
// Set IV length, omit for 96 bits
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL);
// Specify key and IV
EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv);
// Zero or more calls to specify any AAD
EVP_DecryptUpdate(ctx, NULL, &outlen, aad, aad_len);
// Decrypt plaintext
EVP_DecryptUpdate(ctx, outbuf, &outlen, payload, payload_len);
print_hex("decrypted_payload", outbuf, outlen);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, icv_len, icv);
rv = EVP_DecryptFinal(ctx, icv, &outlen);
printf("Tag Verify %s\n", rv > 0 ? "Successful!" : "Failed!");
EVP_CIPHER_CTX_free(ctx);
}
А это мой перехваченный пакет.
04:51:57.347960 IP (tos 0x0, ttl 64, id 48604, offset 0, flags [DF], proto ESP (50), length 136)
pc2 > 10.10.10.100: ESP(spi=0xc08247f5,seq=0x2), length 116
0x0000: 0011 2233 4401 0800 2758 2898 0800 4500
0x0010: 0088 bddc 4000 4032 538b 0a0a 0a65 0a0a
0x0020: 0a64 c082 47f5 0000 0002 7a2b 37d7 160c
0x0030: 853c 870d 1119 5a34 9d95 e597 be6a 8bc7
0x0040: 2037 a1f7 ba02 1ef2 a0be de5e 5406 a5b1
0x0050: 0e03 c463 c235 5c45 9b51 6734 1f28 e364
0x0060: 2b36 470b 64da bfa3 1a68 f209 94aa 44b0
0x0070: 9131 ffe0 12f1 9208 3a7b aa95 da51 bafd
0x0080: 31cd 3d0a 8733 56e0 ae0d d7b5 13fe 8c5e
0x0090: 96d8 598d a74f
А это мои печатные переменные
original payload(88):
0x0000: 870d 1119 5a34 9d95 e597 be6a 8bc7 2037
0x0010: a1f7 ba02 1ef2 a0be de5e 5406 a5b1 0e03
0x0020: c463 c235 5c45 9b51 6734 1f28 e364 2b36
0x0030: 470b 64da bfa3 1a68 f209 94aa 44b0 9131
0x0040: ffe0 12f1 9208 3a7b aa95 da51 bafd 31cd
0x0050: 3d0a 8733 56e0 ae0d
key(16):
0x0000: 1a0f cccc 0315 2b58 1b1a 02ea 3664 485f
iv(8):
0x0000: 7a2b 37d7 160c 853c
icv(12):
0x0000: d7b5 13fe 8c5e 96d8 598d a74f
aad(8):
0x0000: c082 47f5 0000 0002
decrypted_payload(88):
0x0000: 860c 9110 87c6 db5a c40a a592 f862 b8ea
0x0010: b476 3be6 0881 06d4 ad11 eb2a 2e1c 698d
0x0020: a803 2417 8ffb 7130 444d 4fc8 b402 c602
0x0030: 1a0b 031b b89a 4ddb 707b f920 04ea 48c5
0x0040: 5424 5a9b bb34 a88a 08ee 2556 5532 3419
0x0050: 2621 19e6 f4e1 72b2
Tag Verify Failed!
Дешифрованная полезная нагрузка должна быть пакетом ICMP. Но это неправильно!
Является ли метод дешифрования неправильным или переменные попали в пакет неправильно?