簡體   English   中英

C 使用 openssl 進行客戶端 AES 128 GCM 加密,使用 rijndael 128 GCM 在 Intel SGX 內部進行服務器解密

[英]C Client AES 128 GCM encryption with openssl and server decryption inside Intel SGX with rijndael 128 GCM

我想使用 Openssl AES 128 GCM 在客戶端加密數據,並使用 rijndael 128 GCM 在 Intel SGX 內的服務器端解密這些數據。 我可以在 sgx_aes_gcm.cpp 中看到它使用與 Openssl 相同的函數。

我可以想象 EVP_CIPHER_CTX_ctrl(pState, EVP_CTRL_GCM_GET_TAG, 16, tag) function 生成的標簽是解密成功所必需的。

所以我的問題是,如何將標簽從客戶端傳輸到服務器,以便成功驗證和解密數據?

我對上述場景做了一些測試,但 sgx 端的解密失敗

關於 AES-GCM

AES with Galois/Counter Mode (AES-GCM) 提供經過身份驗證的加密(機密性和身份驗證)以及檢查以明文形式發送的附加身份驗證數據 (AAD) 的完整性和身份驗證的能力。

經過身份驗證的加密有四個輸入:密鑰初始化向量(IV)(有時稱為隨機數†)、明文本身和可選的附加身份驗證數據 (AAD)。 nonce 和 AAD以明文形式傳遞。 有兩個輸出:與明文長度完全相同的密文和一個身份驗證標簽(“標簽”)。 該標記有時稱為消息驗證碼 (MAC) 或完整性校驗值 (ICV)。

來源: https://www.cryptosys.net/pki/manpki/pki_aesgcmauthencryption.html

關於英特爾 SGX 方法

根據 SGX SDK for Linux, sgx_rijndael128GCM_decrypt需要一個sgx_aes_gcm_128bit_tag_t * 作為它的最后一個參數。

function arguments 描述將此 arguments 指定為:

p_in_mac [in] 這是在加密過程(調用 sgx_rijndael128GCM_encrypt)期間對輸入數據緩沖區(要加密的數據)以及附加身份驗證數據(這是可選數據)執行的 GCM MAC。

MAC(消息驗證代碼)由加密過程生成,並與初始化向量 (IV) 和數據本身一起發送到服務器。 Intel自己提出的一種典型的架構方式是:

* Encrypted data:      | MAC | IV | AES128(data)
* Buffer size:           16    12   size(data)
* Ranges:
* MAC reference:         &data       :   &data+16
* IV reference:          &data+16    :   &data+16+12
* AES128(data) ref:      &data+12+16 : 

資料來源: https://01.org/sites/default/files/documentation/intel_sgx_sdk_developer_reference_for_linux_os_pdf.pdf

暫無
暫無

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

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