數位簽章演算法

數字簽名算法(DSA)是用於數字簽名的聯邦信息處理標準之一,基於模算數離散對數的複雜度。DSA是SchnorrElGamal簽名方案的變體。

美國國家標準技術研究所(NIST)於1991年提出將DSA用於其數字簽名標準(DSS),並於1994年將其作為FIPS 186採用。[2]已對初始規範進行了四次修訂。DSA已獲得專利,但NIST已將此專利在全球範圍內買斷式授權

DSA的橢圓曲線密碼學版本是ECDSA

概述 編輯

DSA算法工作在框架公鑰加密模算數離散對數問題,這被認為是難解問題。該算法使用由公鑰私鑰組成的密鑰對。私鑰用於生成消息的數字簽名,並且可以通過使用簽名者的相應公鑰來驗證這種簽名。數字簽名提供信息鑑定(接收者可以驗證消息的來源),完整性(接收方可以驗證消息自簽名以來未被修改)和不可否認性(發送方不能錯誤地聲稱它們沒有簽署消息)。

操作 編輯

DSA 演算法包含了四種操作:金鑰生成、金鑰分發、簽章、驗證

金鑰生成 編輯

金鑰生成包含兩個階段。第一階段是演算法參數的選擇,可以在系統的不同使用者之間共享,而第二階段則為每個使用者計算獨立的金鑰組合。

參數選擇 編輯

  • 選擇經核可的 密碼雜湊函式  ,在原版的 DSS(Digital Signature Standard)中,  總是使用 SHA-1,而目前的 DSS 已核可更為安全的 SHA-2 作為雜湊函式。[1][2] 假如長度   大於模數長度  ,則雜湊函式的輸出只有最左邊的   位元會被使用。
  • 選擇金鑰長度  ,原版的 DSS 限制   必須為 512 到 1024 之間 64 的倍數,NIST 800-57 建議使用長度為 2048 的金鑰。[3]
  • 選擇模數長度   使得   FIPS 186-4 規定   必須為 (1024, 160)、(2048, 224)、(2048, 256) 或 (3072, 256) 其中一種。[1]
  • 選擇長度為   位元的質數  
  • 選擇長度為   位元的質數   使得    的倍數。
  •   隨機選擇  
  • 計算  ,當   時需要重新產生不同的  ,通常會使用  ,即使數值很大時仍然可以非常有效率的計算這個 模冪

演算法參數為 ( ,  ,  ),可被不同的使用者共享。

使用者金鑰 編輯

給定一套演算法參數後,第二階段會為每位使用者計算獨立金鑰組合:

  •   選擇隨機整數  
  • 計算  

其中   是私鑰、  是公鑰。

金鑰分發 編輯

簽章者需要透過可信任的管道發佈公鑰  ,並且安全地保護   不被其他人知道。

簽章流程 編輯

訊息   簽名流程如下:

  •   隨機選擇整數  
  • 計算  ,當出現   狀況時重新選擇隨機數  
  • 計算  ,當出現   狀況時重新選擇隨機數  

簽章為   組合

計算    旨在為不同訊息建立獨立的金鑰,計算  模冪是這個演算法中最耗資源的部分,但這可在不知道訊息的前提下進行計算。 第二耗運算資源的部分是計算   模反元素,同樣也能在不知道訊息的前提下進行計算,這可以用擴展歐幾里得演算法費馬小定理   求得。

驗證簽章 編輯

透過以下步驟可以驗證   是訊息   的有效簽章:

  • 驗證   
  • 計算  
  • 計算  
  • 計算  
  • 計算  

只有在   時代表簽章是有效的

實作 編輯

下列密碼學函式庫有提供 DSA 的支援:

相關條目 編輯

參考文獻 編輯

  1. ^ 1.0 1.1 FIPS PUB 186-4: Digital Signature Standard (DSS), July 2013 (PDF). csrc.nist.gov. [2021-05-01]. (原始內容存檔 (PDF)於2016-12-27). 
  2. ^ FIPS PUB 180-4: Secure Hash Standard (SHS), March 2012 (PDF). csrc.nist.gov. [2021-05-01]. (原始內容存檔 (PDF)於2013-02-17). 
  3. ^ NIST Special Publication 800-57 (PDF). csrc.nist.gov. (原始內容 (PDF)存檔於2014-06-06).