二、encoders

文章目錄

  • 一、batch_encoder (用于 BFV)
    • 1. 概述
    • 2. 數學原理
    • 3. 使用方法
    • 4. 代碼示例
  • 二、ckks_encoder (用于 CKKS)


?在 1. bfv_basics.cpp 中,我們展示了如何使用BFV方案執行非常簡單的計算。計算是在 plain_modulus 參數的模下執行的,并且 只使用了 BFV 明文多項式的一個系數。這種方法有兩個顯著的問題:

  1. 實際應用通常使用整數或實數算術,而不是模算術;
  2. 我們只使用了明文多項式的一個系數。這真的很浪費,因為明文多項式很大,無論如何都會被完整加密。

對于 (1),人們可能會問為什么不簡單地 增加 plain_modulus 參數 直到不發生溢出,并且計算表現得像整數算術一樣。問題是增加 plain_modulus 會 增加噪聲預算消耗,并且也會 減少初始噪聲預算

?在這些示例中,我們將討論將數據布局到 明文元素 中的其他方法(編碼),這些方法允許更多計算而不發生數據類型溢出,并且可以允許 充分利用整個明文多項式


一、batch_encoder (用于 BFV)

1. 概述

?Batch Encoder 的目標是什么?通常,一個同態加密的密文只加密一個明文值。如果我們想對 兩個數組 (向量) 逐項相加,就需要為每個元素單獨加密成一個密文,然后對每對密文分別進行同態加法,這非常低效。
?Batch Encoder 的作用就是將一個明文向量,比如 [a1,a2,...,ak][a_1, a_2, ..., a_k][a1?,a2?,...,ak?] 打包編碼到一個 單一的明文多項式 中。然后對這個單一多項式進行加密,得到一個 單一的密文。之后所有同態運算都作用在這一個密文上。一般稱之為 SIMD 策略,這極大地提高了同態加密的吞吐量和效率。

?設 N 表示 poly_modulus_degreeT 表示 plain_modulus批處理 允許將 BFV 明文多項式 視為 2×(N/2) 矩陣每個元素 都是 模 T 的整數
?在 矩陣視圖 中,加密操作對加密矩陣 按元素執行,允許用戶在完全可向量化的計算中獲得幾個數量級的加速。
?因此,除了最簡單的計算外,批處理應該是與 BFV 一起使用的首選方法,當正確使用時,將產生優于任何不使用批處理的實現。

2. 數學原理

?核心思想是,如果一個 模多項式 (在 BFV 中即 xN+1x^N+1xN+1) 可以其系數環 (這里是 ZtZ_tZt?) 上分解為多個 兩兩互質的因子,那么原始的、復雜的商環就與這些因子定義的更簡單的商環的 直積 (Direct Product) 存在一種被稱為 同構 的深刻聯系。

  1. 中國剩余定理
    ?Batch Encoder 的核心是基于 中國剩余定理 的多項式環分解。基本概念為:
    1. BFV 明文文空間是多項式環 Zt[x]xN+1\frac{Z_t[x]}{x^N+1}xN+1Zt?[x]?
    2. 其中 N=poly_modulus_degreeN=poly\_modulus\_degreeN=poly_modulus_degreet=plain_modulust=plain\_modulust=plain_modulus
    3. t滿足特定條件的素數 時,這個環可以分解。這個條件就是 t≡1(mod2N)t \equiv 1\ \ (mod\ 2N)t1??(mod?2N)當滿足這個條件時,多項式 xN+1x^N+1xN+1 可以完全分解為 N 個不同的線性因子。
  2. 環的分解
    ?當上面的條件滿足的時候,我們有:Zt[x]xN+1?Zt×Zt×...×Zt(N個副本)\frac{Z_t[x]}{x^N+1} \cong Z_t \times Z_t \times ... \times Z_t\ \ \ (N 個副本)xN+1Zt?[x]??Zt?×Zt?×...×Zt????(N個副本)?\cong? 是同構的意思,表示兩個代數結構是同構的,即它們在結構上是相同的,盡管它們的元素可能不同。
    ?這意味著:
    • 一個度數小于 N 的多項式 <—> N 個獨立的模 t 整數。
    • 多項式運算 <—> 對應位置的元素運算。
    • 實現了 SIMD 計算。
  3. 矩陣視圖
    ?在 SEAL 中,N 個槽被組織為 2×(N/2)2 \times (N / 2)2×(N/2) 矩陣:
[ slot_0, slot_1, ..., slot_(N/2-1) ]
[ slot_(N/2), ..., slot_(N-1)      ]

3. 使用方法

  1. 第一步當然是設置 加密參數,其中加密方案、多項式模數次數、密文系數模數何止前的思路一樣。但是要求將 plain_modulus 設置為一個 12*poly_modulus_degree 同余的素數。這一步 Microsoft SEAL 提供了一個輔助方法來尋找這樣的素數。在這個示例中,我們創建一個支持批處理的 20 位素數
parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));  // 設置支持批處理的明文模數
  1. 用設置好的參數生成上下文;
  2. 生成 KeyGeneratorEncryptorEvaluatorDecryptor
  3. 生成 BatchEncoder 的實例,批處理 '槽’的總數 等于 poly_modulus_degree = N,這些槽被組織成 2×(N/2) 矩陣,可以進行加密和計算。每個槽 包含一個 plain_modulus 的整數
  4. 先將數據存到 vector<uint64_t> pod_matrix(slot_count, 0ULL) 向量中。然后通過 BatchEncoder類 提供的方法 .encode,將矩陣編碼為明文 Plaintext類 的實例中;
  5. 解碼的過程完全相反,通過 BatchEncoder類 提供的 .decode 方法,將 Plaintext類 明文解碼為 vector<uint64_t> 向量。
  6. 對明文進行加密和運算的方法同之前一摸一樣。

4. 代碼示例

    print_example_banner("Example: Encoders / Batch Encoder");EncryptionParameters parms(scheme_type::bfv);  // 創建BFV方案的加密參數對象size_t poly_modulus_degree = 8192;  // 設置多項式模數次數為8192parms.set_poly_modulus_degree(poly_modulus_degree);  // 應用多項式模數次數設置parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));  // 設置系數模數為BFV默認值parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));  // 設置支持批處理的明文模數SEALContext context(parms);  // 使用參數創建SEAL上下文對象KeyGenerator keygen(context);  // 創建密鑰生成器對象SecretKey secret_key = keygen.secret_key();  // 生成私鑰PublicKey public_key;  // 聲明公鑰對象keygen.create_public_key(public_key);  // 創建公鑰RelinKeys relin_keys;  // 聲明重線性化密鑰對象keygen.create_relin_keys(relin_keys);  // 創建重線性化密鑰Encryptor encryptor(context, public_key);  // 創建加密器,使用公鑰Evaluator evaluator(context);  // 創建計算器Decryptor decryptor(context, secret_key);  // 創建解密器,使用私鑰BatchEncoder batch_encoder(context);  // 創建批處理編碼器對象size_t slot_count = batch_encoder.slot_count();  // 獲取槽的總數size_t row_size = slot_count / 2;  // 計算每行的大小cout << "明文矩陣行大小: " << row_size << endl;vector<uint64_t> pod_matrix(slot_count, 0ULL);  // 創建大小為slot_count的向量,初始化為0pod_matrix[0] = 0ULL;  // 設置第一行第一個元素pod_matrix[1] = 1ULL;  // 設置第一行第二個元素pod_matrix[2] = 2ULL;  // 設置第一行第三個元素pod_matrix[3] = 3ULL;  // 設置第一行第四個元素pod_matrix[row_size] = 4ULL;  // 設置第二行第一個元素pod_matrix[row_size + 1] = 5ULL;  // 設置第二行第二個元素pod_matrix[row_size + 2] = 6ULL;  // 設置第二行第三個元素pod_matrix[row_size + 3] = 7ULL;  // 設置第二行第四個元素Plaintext plain_matrix;  // 聲明明文對象batch_encoder.encode(pod_matrix, plain_matrix);  // 將矩陣編碼為明文vector<uint64_t> pod_result;  // 聲明結果向量batch_encoder.decode(plain_matrix, pod_result);  // 解碼明文到向量print_matrix(pod_result, row_size);  // 打印結果矩陣Ciphertext encrypted_matrix;  // 聲明密文對象encryptor.encrypt(plain_matrix, encrypted_matrix);  // 加密明文/*對密文的操作會導致在所有8192個槽(矩陣元素)中同時執行同態操作。為了說明這一點,我們構造另一個明文矩陣[ 1,  2,  1,  2,  1,  2, ..., 2 ][ 1,  2,  1,  2,  1,  2, ..., 2 ]并將其編碼為明文。*/vector<uint64_t> pod_matrix2;  // 聲明第二個矩陣向量for (size_t i = 0; i < slot_count; i++)  // 循環填充向量pod_matrix2.push_back((i & size_t(0x1)) + 1);  // 使用位運算生成1,2交替的模式Plaintext plain_matrix2;  // 聲明第二個明文對象batch_encoder.encode(pod_matrix2, plain_matrix2);  // 編碼第二個矩陣print_matrix(pod_matrix2, row_size);  // 第二個輸入明文矩陣evaluator.add_plain_inplace(encrypted_matrix, plain_matrix2);  // 將密文與明文相加(就地操作)evaluator.square_inplace(encrypted_matrix);  // 對密文進行平方(就地操作)evaluator.relinearize_inplace(encrypted_matrix, relin_keys);  // 重線性化以減少密文大小/*我們還剩多少噪聲預算?*/cout << "    + 結果中的噪聲預算: " << decryptor.invariant_noise_budget(encrypted_matrix) << " 位" << endl;/*我們解密并分解明文以恢復矩陣形式的結果。*/Plaintext plain_result;  // 聲明結果明文對象print_line(__LINE__);cout << "解密并解碼結果。" << endl;decryptor.decrypt(encrypted_matrix, plain_result);  // 解密密文batch_encoder.decode(plain_result, pod_result);  // 解碼明文到向量cout << "    + 結果明文矩陣 ...... 正確。" << endl;print_matrix(pod_result, row_size);

二、ckks_encoder (用于 CKKS)

暫時掠過

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88181.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88181.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88181.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據一致性解決方案總結

數據一致性解決方案總結 我們在系統中&#xff0c;主要進行了數據冗余&#xff0c;那么就會帶來數據一致性的問題。常見的數據一致性問題有&#xff1a;數據庫主從同步延遲導致的讀數據不一致&#xff1b;數據庫主主之間數據的不一致&#xff1b;緩存和數據庫之間的數據不一致。…

17.Spring Boot的Bean詳解(新手版)

文章目錄1. 什么是Bean&#xff1f;從零開始理解1.1 Bean的定義1.2 為什么需要Bean&#xff1f;1.3 Bean vs 普通對象的區別2. Spring容器&#xff1a;Bean的家2.1 什么是Spring容器&#xff1f;2.2 容器的工作流程3. Bean的聲明方式詳解3.1 使用Component及其專門化注解3.1.1 …

cherryStudio electron因為環境問題無法安裝解決方法或打包失敗解決方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是關于electron安裝失敗的解決方法. 也可以通過到git上下面包,解壓后,放到對應的目錄下面,并把里面的build文件夾刪除, b…

微服務架構中數據一致性保證機制深度解析

在微服務架構中&#xff0c;數據一致性是分布式系統設計的核心挑戰。由于服務拆分后數據自治&#xff08;每個服務獨立數據庫&#xff09;&#xff0c;跨服務操作的一致性保障需突破傳統單體事務的局限。本文從一致性模型、核心解決方案、技術實現及面試高頻問題四個維度&#…

【Gin】HTTP 請求調試器

文章目錄 項目概述代碼功能詳解1. 導入必要的包2. 主函數和路由設置3. 請求信息捕獲4. 請求參數和頭信息5. 請求體處理5.1 JSON 數據處理5.2 表單數據處理5.3 Multipart 表單數據處理5.4 其他類型數據處理6. 構造響應對象7. 返回 JSON 響應功能特點使用場景完整代碼項目概述 這…

物聯網(IoT)領域的協議

物聯網&#xff08;IoT&#xff09;領域的通信協議種類繁多&#xff0c;不同協議適用于不同的應用場景&#xff08;如低功耗設備、工業自動化、家庭智能設備等&#xff09;。以下是主要物聯網協議的分類及詳細解釋&#xff1a;一、物聯網協議分類物聯網協議通常分為兩大類&…

專題一_雙指針_四數之和

一&#xff1a;題目解析 題目鏈接&#xff1a;18. 四數之和 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;本題是在上題的基礎上講解的&#xff1a;專題一_雙指針_三數之和-CSDN博客 解析&#xff1a;和三數之區別在于找四元組和為targe的數字 而不是0 二&#xff1a…

Spring Boot多數據源配置詳解

Spring Boot多數據源配置詳解 在實際企業開發中&#xff0c;隨著業務復雜度提升&#xff0c;單一數據源已無法滿足所有場景需求。比如&#xff1a;讀寫分離、分庫分表、數據遷移、微服務整合等&#xff0c;這時就需要用到多數據源配置。本文將從原理、配置、常見問題和最佳實踐…

項目進度嚴重依賴關鍵人,如何分散風險

項目進度嚴重依賴關鍵人的風險&#xff0c;可以通過建立知識共享機制、強化團隊協作模式、實施交叉培訓和培養后備人才、優化流程標準化等措施有效分散。其中&#xff0c;實施交叉培訓和培養后備人才尤為重要&#xff0c;通過培養多個成員具備相似的關鍵技能&#xff0c;能夠迅…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 以太網傳輸實驗例程

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com)1.實驗簡介實驗目的&#xff1a;完成 DDR3 的讀寫測試。實驗環境&#xff1a;Window11 PDS2022.2-SP6.4芯片型號&#x…

《每日AI-人工智能-編程日報》--2025年7月9日

介紹:AI 方面1. Manus 通用智能體初成型&#xff0c;開啟 AIAgent 新時代?中泰證券發布研報稱&#xff0c;首款通用型 AI 智能體 Manus 已問世&#xff0c;能夠將復雜任務拆解為可執行的步驟鏈&#xff0c;并在虛擬環境中靈活調用工具&#xff0c;標志著 AI 從 “Reasoner” 走…

MyBatis之數據操作增刪改查基礎全解

目錄 1. ?MyBatis添加數據 1.1. 持久層接口添加方法 1.2. 映射文件添加標簽 1.3. 編寫測試方法 2. ??MyBatis修改數據 2.1. 代碼的優化 2.2. 持久層接口添加方法 2.3. 映射文件添加標簽 2.4. 編寫測試方法 3. &#x1f5d1;?MyBatis刪除數據與根據Id查詢 3.1. 刪…

kbmMemTable Pro 7.82 Delphi 11 源代碼

kbmMemTable Pro 7.82 Delphi 11 源代碼KbmMemTable 是一個用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 應用程序中存儲臨時數據的組件&#xff0c;這些應用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等編程語言創建&#xff0c;同時您還可以高速訪問存儲在數據…

LeetCode Hot 100 除自身以外數組的乘積

給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。請 不要使用除法&#xff0c;且在 O(n) 時間復雜度內…

VC Code--常用的配置

原文網址&#xff1a;VC Code--常用的配置-CSDN博客 簡介 本文介紹VC Cod常用的配置。 1.字體大小 整體字體大小 左下角齒輪> Settings> Windows> Window: Zoom Level> 改為&#xff1a;2 編輯器字體大小&#xff08;如果調整了整體字體大小&#xff0c;此處…

大模型驅動的智能體:從GPT-4到o1的能力躍升

大模型驅動的智能體&#xff1a;從GPT-4到o1的能力躍升 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之間的關系

1. Transformer架構的兩大方向 Transformer分為兩大類應用&#xff0c;但劃分標準不是"分類vs生成"&#xff0c;而是編碼方式&#xff1a; Encoder架構&#xff08;代表&#xff1a;BERT&#xff09;&#xff1a; 使用Transformer的??編碼器??&#xff08;Encode…

ARM匯編編程(AArch64架構)課程 - 第7章:SIMD與浮點運算

目錄1. NEON寄存器關鍵特性數據排列示例2. 浮點指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架構提供32個128位NEON向量寄存器&#xff08;V0-V31&#xff09;&#xff0c;支持SIMD并行計算 關鍵特性 寄存器類型數量位寬數據視圖Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型詳解:CBOW與Skip-gram

Word2Vec模型詳解&#xff1a;CBOW與Skip-gram 目錄 模型概述理論基礎CBOW模型詳解Skip-gram模型詳解模型對比代碼實現詳解訓練過程分析應用場景實驗結果總結 模型概述 Word2Vec是一種用于生成詞向量的神經網絡模型&#xff0c;由Google在2013年提出。它包含兩種主要架構&am…