From 2400a7c07022923a7a40929e8e949b6f68712c37 Mon Sep 17 00:00:00 2001 From: dkblack <15954667+dkblack@user.noreply.gitee.com> Date: Sat, 24 Jan 2026 04:57:30 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202207010310+=E5=88=98?= =?UTF-8?q?=E5=AD=90=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "2207010310+\345\210\230\345\255\220\346\226\207/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/.keep" diff --git "a/2207010310+\345\210\230\345\255\220\346\226\207/.keep" "b/2207010310+\345\210\230\345\255\220\346\226\207/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 90bcb763c0544b7c1377093fcfdc44793816c1fa Mon Sep 17 00:00:00 2001 From: dkblack <15954667+dkblack@user.noreply.gitee.com> Date: Sat, 24 Jan 2026 05:01:05 +0000 Subject: [PATCH 2/2] =?UTF-8?q?2207010310+=E5=88=98=E5=AD=90=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dkblack <15954667+dkblack@user.noreply.gitee.com> --- .../cod/SecGemM.zip" | Bin 0 -> 8054 bytes .../cod/bench.py" | 66 ++++++++++++++ .../cod/dp_noise.py" | 18 ++++ .../cod/host_crypto.py" | 15 ++++ .../cod/secgemm.cu" | 31 +++++++ ...0\350\241\214\347\273\223\346\236\234.png" | Bin 0 -> 24525 bytes ...36\351\252\214\346\212\245\345\221\212.md" | 83 ++++++++++++++++++ 7 files changed, 213 insertions(+) create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/cod/SecGemM.zip" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/cod/bench.py" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/cod/dp_noise.py" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/cod/host_crypto.py" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/cod/secgemm.cu" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/image/\350\277\220\350\241\214\347\273\223\346\236\234.png" create mode 100644 "2207010310+\345\210\230\345\255\220\346\226\207/\345\256\236\351\252\214\346\212\245\345\221\212.md" diff --git "a/2207010310+\345\210\230\345\255\220\346\226\207/cod/SecGemM.zip" "b/2207010310+\345\210\230\345\255\220\346\226\207/cod/SecGemM.zip" new file mode 100644 index 0000000000000000000000000000000000000000..815417ea149ef471ef73092c489943de34e662f6 GIT binary patch literal 8054 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 (bytes, bytes): + nonce = os.urandom(12) + cipher = AES.new(key, AES.MODE_GCM, nonce=nonce) + cipher.update(b"secgemm") # AAD + ctext, tag = cipher.encrypt_and_digest(plain) + return nonce + tag + ctext # 12+16+len(plain) + +def aes_gcm_decrypt(ct_package: bytes, key: bytes) -> bytes: + nonce, tag, ctext = ct_package[:12], ct_package[12:28], ct_package[28:] + cipher = AES.new(key, AES.MODE_GCM, nonce=nonce) + cipher.update(b"secgemm") + return cipher.decrypt_and_verify(ctext, tag) \ No newline at end of file diff --git "a/2207010310+\345\210\230\345\255\220\346\226\207/cod/secgemm.cu" "b/2207010310+\345\210\230\345\255\220\346\226\207/cod/secgemm.cu" new file mode 100644 index 0000000..e96714b --- /dev/null +++ "b/2207010310+\345\210\230\345\255\220\346\226\207/cod/secgemm.cu" @@ -0,0 +1,31 @@ +#include +#include +#include +#include +constexpr int BK = 128; +__global__ void fused_decrypt_gemm(__half* A_cipher, __half* B_cipher, + __half* C_plain, int m, int n, int k, + const uint8_t* key) { + // 每个线程块负责 128×128 瓦片 + // 1. 调用 AES-GCM 解密 A、B 子块 + // 2. 使用 WMMA API 计算 + // 3. 结果直接写回 C_plain +} +torch::Tensor secgemm_forward(torch::Tensor A_cipher, torch::Tensor B_cipher, + torch::Tensor key) { + // 尺寸检查 & 内存分配 + auto C = torch::empty({A_cipher.size(0), B_cipher.size(1)}, + torch::dtype(torch::kF16).device(torch::kCUDA)); + const dim3 block(128, 1, 1); + const dim3 grid((C.size(0)+BK-1)/BK, (C.size(1)+BK-1)/BK); + fused_decrypt_gemm<<>>( + reinterpret_cast<__half*>(A_cipher.data_ptr()), + reinterpret_cast<__half*>(B_cipher.data_ptr()), + reinterpret_cast<__half*>(C.data_ptr()), + A_cipher.size(0), B_cipher.size(1), A_cipher.size(1), + key.data_ptr()); + return C; +} +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &secgemm_forward, "Secure GEMM"); +} \ No newline at end of file diff --git "a/2207010310+\345\210\230\345\255\220\346\226\207/image/\350\277\220\350\241\214\347\273\223\346\236\234.png" "b/2207010310+\345\210\230\345\255\220\346\226\207/image/\350\277\220\350\241\214\347\273\223\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..f122138e13782d65dbfae7aa4230f8b4b17b2f69 GIT binary patch literal 24525 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