1. 程式人生 > >Java密碼學原型演算法實現——第三部分:雙線性對

Java密碼學原型演算法實現——第三部分:雙線性對

背景介紹

技術部落格已經好久沒更新了。倒不是因為沒得寫,是因為實在是太忙了,而且研究也到了一個瓶頸期,需要大量閱讀文獻。

本來打算很長一段時間都不更新部落格了,甚至打算等我畢業工作後再更新一些有價值的部落格,但是最近在CSDN私信上和知乎上經常收到求救帖子,希望我能寫一個jPBC使用方法的部落格。甚至實驗室的碩士生們也在各種諮詢我相關的問題。於是,我打算一勞永逸,寫一篇有關jPBC使用的部落格。希望這個部落格出來後,能解決絕大多數人的問題吧…
本篇部落格期望解決的問題:

  • 如何使用jPBC庫進行雙線性群初始化,包括:
    • 質數階雙線性群(Prime-Order Bilinear Groups);
    • 合數階雙線性群(Composite-Order Bilinear Groups);
  • 如何使用jPBC庫執行雙線性群運算,包括:
    • 指數群Z的加法和乘法;
    • 雙線性群G的乘法和指數冪;
    • 目標群GT的乘法和指數冪
    • 雙線性群G對映到目標群GT的對(Pairing)運算;
  • 使用jPBC庫的一些注意事項。

本篇部落格不會涉及到的問題:

  • 如何配置jPBC庫到Eclipse中;這方面的內容請參考我的另一篇部落格:jPBC 2.0.0配置與測試(補充版)
  • 有關雙線性對的數學知識;這方面我在第二章會稍微介紹一下,但是不會詳談,因為內容太多了。
  • 對偶雙線性群向量空間群(Dual Pairing Vector Space,DPVS);這個群在理論上被用於替代合數階雙線性群。其可以在保證同等安全性的條件下,使雙線性對運算時間較短,而代價是儲存開銷會變大。這個工具在2012年得到了廣泛的應用。但是這兩年普遍認為這個工具的進一步應用場景有限,而且表示並不直觀,還不如和合數階雙線性群好用。jPBC 2.0.0實際上提供了DPVS的實現,也是正確的。有興趣的朋友們可以自己研究一下,我在這裡就不詳述了。
  • 如何使用jPBC 2.0.0的多線性對(Multilinear Maps)函式庫;這方面我自己一直沒找時間測試一下多線性對函式庫,實際上近期我也不太想測試這個庫,主要有兩方面的原因。
    • 現在所構造出來的多線性對並非密碼學中的理想多線性對(Ideal Multilinear Maps),而是候選多線性對(Candidate Multilinear Maps),後者在使用上有很多的限制。
    • jPBC 2.0.0實現的多線性對是[CLT-14]的方案,但這個方案已經被證明是不安全的了。

雙線性群簡介

質數階雙線性群(Prime-Order Bilinear Groups)

質數雙線性群可以由五元組(

p,G1,G2,GT,e)來描述。五元組中p是一個與給定安全常數λ相關的大質數,G1,G2,GT均是階為p的乘法迴圈群,e為雙線性對映e:G1×G2GT,它滿足以下3個條件:

  • 雙線性(Bilinearity):對於任意的gG1hG2a,bZp,有e(ga,hb)=e(g,h)ab
  • 非退化性(Non-degeneracy):至少存在元素g1G1,g2G2,滿足e(g1,g2)1
  • 可計算性(Efficiency):對於任意的uG1,vG2,存在一個與給定安全常數λ相關的多項式時間演算法,可以高效地計算e(u,v)

現在的密碼學相關論文中,習慣將G1,G2設定為乘法迴圈群。但是,基於橢圓曲線的雙線性群構造中,G1,G2是加法群。所以在大約2005年以前的論文中,雙線性群一般寫成加法群形式。jPBC中將G1,G2表示稱為了乘法迴圈群,因此在實現寫成加法群形式的方案時,要注意將加法群改成乘法群的寫法再進行實現。如何修改呢?很簡單,把加法群中的加法運算寫成乘法運算、把加法群中的乘法運算寫成冪指數運算即可。

合數階雙線性群(Composite-Order Bilinear Groups)

合數階雙線性群和質數階雙線性群很類似,區別是G1,G2,GT的階數是一個合數N,其中N是一些大質數的乘積,如N=p1p2pn。同樣,e為雙線性對映e:G1×G2GT,它滿足雙線性性、非退化性以及可計算性。

與質數階雙線性群不同,合數階雙線性群中,GN有階數分別為p1,p2,,pn的子群Gp1,,Gpn。這些子群進一步滿足正交特性。

hiGpihjGpjij

相關推薦

Java密碼原型演算法實現——部分線性

背景介紹 技術部落格已經好久沒更新了。倒不是因為沒得寫,是因為實在是太忙了,而且研究也到了一個瓶頸期,需要大量閱讀文獻。 本來打算很長一段時間都不更新部落格了,甚至打算等我畢業工作後再更新一些有價值的部落格,但是最近在CSDN私信上和知乎上經常收到求救帖子,

Java密碼原型演算法實現——第一部分標準Hash演算法

題注 從部落格中看出來我是個比較鍾愛Java的應用密碼學研究者。雖然C在密碼學中有不可替代的優勢:速度快,但是,Java的可移植性使得開發人員可以很快地將程式碼移植到各個平臺,這比C實現要方便的多。尤其是Android平臺的出現,Java的應用也就越來越廣。因此,我本人在密

演算法導論 函式的增長 筆記(Θ記號、O記號、Ω記號、o記號、ω記號、漸近記號的性質、標準記號與常用函式)

Θ記號: 該記號圓圈中是個M。Θ記號漸近地給出一個函式的上界和下界。 對於一個給定的函式g(n),我們用Θ(g(n))來表示以下函式的集合: Θ(g(n))={f(n):存在正常量c1、c2和n0,使得對於所有n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)}。 即若存在正常

24小時通Qt之學時Qt基礎

一、問題與答案 問:我的編譯器顯示按鈕的clicked()訊號與qApp的quit()槽連線這一行錯誤,為什麼? 答:要確保傳遞給connect()函式的物件引數為指標(地址)。如果不是,應該使用地址運算子&(將它加在物件名稱前面),以獲得該物件的記憶體地址。 二、測試 1、

50個常見的 Java 錯誤及避免方法(部分

31.“Could Not Create Java Virtual Machine”當我們嘗試呼叫帶有錯誤引數的Java程式碼時,通常會產生此Java錯誤訊息(@ghacksnews):Error: Could not create the Java Virtual Mach

[譯] 利用 Python中的 Bokeh 實現資料視覺化,部分製作一個完整的儀表盤

原文地址:Data Visualization with Bokeh in Python, Part III: Making a Complete Dashboard 原文作者:Will Koehrsen 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/g

Cocos2d-x簡單遊戲程式碼實現|部分:引導層

#ifndef __ShootPlane__InstroLayer__ #define __ShootPlane__InstroLayer__ #include <iostream> #include "commonHeader.h"

Java Stream函數語言程式設計管道流結果處理

一、Java Stream管道資料處理操作 在本號之前寫過的文章中,曾經給大家介紹過 Java Stream管道流是用於簡化集合類元素處理的java API。在使用的過程中分為三個階段。在開始本文之前,我覺得仍然需要給一些新朋友介紹一下這三個階段,如圖: 第一階段(圖中藍色):將集合、陣列、或行文字檔案

Java從入門到失業》基礎語法及基本程式結構(四)基本資料型別(字元編碼和char型)

3.6.4字元編碼        咦?怎麼好像有東西亂入了?不是講基本資料型別麼?哈哈,因為還剩下最後一個char型了,因為char型會牽涉到Unicode編碼相關,因此我決定先科普一下字符集編碼。     &

Java併發必知必會用積木講解ABA原理

# Java併發必知必會第三彈:用積木講解ABA原理 ![封面圖](http://cdn.jayh.club/blog/20200825/f0IhlK4RmutQ.png?imageslim) 可落地的 Spring Cloud專案:[PassJava](https://github.com/Jackso

Java從入門到失業》基礎語法及基本程式結構(五)基本算數運算子(1)

3.7運算子       數學運算是計算機的基本用途之一,Java提供了非常豐富的運算子來支援。我們根據運算的特點和性質,把運算子劃分為幾組:基本算數運算子、自增自減運算子、關係運算符、位運算子、邏輯運算子、賦值運算子、其他運算子。下面分別介紹。 3.7.1基本算數運算子 &nb

Java從入門到失業》基礎語法及基本程式結構(3.7)運算子(小數二進位制、科學記數法、IEEE754標準)

3.7.1.4浮點數運算        要討論浮點數運算,牽涉到的知識比較多,下面一點一點的來逐步展開。為了便於同時討論十進位制和二進位制數,我們做一個約定,我們把十進位制數簡寫為N10,把二進位制數簡寫為N2。 3.7.1.4.1小數的二進位制 &

Java從入門到失業》基礎語法及基本程式結構(3.8)流程控制(選擇語句、if-else語句、switch語句)

3.8流程控制        到此為止,我們已經基本瞭解了Java的基礎語法,會定義不同型別的變數,會命名,會給變數賦值和運算等。接下來,我們需要學會流程控制方面的知識。 3.8.1選擇語句 3.8.1.1if-else語句   

Java從入門到失業》基礎語法及基本程式結構(3.8)流程控制(迴圈語句、while語句、for語句)

3.8.2迴圈語句 3.8.2.1while語句        最近這些年買彩票只能去投注站買,早些年,筆者經常是在網上買。在網上買有個功能:追號。就是假如你想一直買同一組號碼,直到中大獎為止。你可以設定一個條件,比如中了頭獎就不繼續買了,如果沒有中頭獎,下一期繼續買同

Java從入門到失業》基礎語法及基本程式結構(3.9)陣列(陣列基本使用、陣列的迴圈、陣列拷貝、陣列排序、多維陣列)

3.9陣列 3.9.1陣列基本使用        陣列,英文叫Array,是一種資料結構,是用來存放同一資料型別數值的集合。例如存放30個int型數值、存放100個double型數值等等。 我們知道使用一個變數,需要先宣告一個變數,例如:int a;

Kaggle word2vec NLP 教程 部分詞向量的更多樂趣

第三部分:詞向量的更多樂趣 程式碼 第三部分的程式碼在這裡。 單詞的數值表示 現在我們有了訓練好的模型,對單詞有一些語義理解,我們應該如何使用它? 如果你看它的背後,第 2 部分訓練的 Word2Vec 模型由詞彙表中每個單詞的特徵向量組成,儲存在一個名為sy

python全棧開發中級班全程筆記(第二模組) 部分 遞迴

python全棧開發筆記第二模組 第三部分 :遞迴   一、遞迴定義及使用 定義:什麼叫遞迴?遞迴就是在函式的執行中呼叫自己  下面程式碼舉例說明: 例: def recursion(n): #設定計數 print(n) #為了能驗證呼叫自己多少次,列

設計資料密集型應用部分派生資料

  《Designing Data-Intensive Applications》的第一部分,基於單點(single node)介紹了資料系統的基礎理論與知識;在第二部分,則是將視野擴充套件到了分散式資料系統,主要是Partition和Repliacation。在第三部分,則聚焦於派生資料系統。 int

部分初步認識Twisted

第三部分:開始認識Twisted 可以從這裡從頭開始閱讀這個系列。   用twisted的方式實現前面的內容 最終我們將使用twisted的方式來重新實現我們前面的非同步模式客戶端。不過,首先我們先稍微寫點簡單的twisted程式來認識一下twisted。 最最簡單的twisted程式就是

【JavaFx教程】部分與使用者的互動

第3部分的主題: 在表中反應選擇的改變(TableView中)。 增加增加,編輯和刪除按鈕的功能。 建立自定義彈出對話方塊編輯人員。 驗證使用者輸入。 響應表的選擇 顯然,我們還沒有使用應用程式的右邊。想法是當用戶選擇表中的人員時,在右邊顯示人員的詳情。 首先