演演算法設計:密碼技術中數位簽章演演算法的Java實現

2021-04-01 03:00:57

數位簽章是數位訊息(資料)的非對稱加密雜湊。它是可以保證真實性, 不可否認性和完整性的值。換句話說, 這意味著你可以驗證發件人, 日期和時間以及郵件內容沒有被洩露或洩露。

注意:你可以參考這個連結為了更好地理解密碼術語。

數位簽章的計算

數位簽章通常使用橢圓曲線密碼來計算, 尤其是在IoT裝置中, 但是我們將使用RSA進行演示。首先, 由於輸入訊息的速度和安全性, 我們將使用SHA-256獲取輸入訊息併為其建立雜湊, 然後使用非對稱金鑰對中的私鑰對該雜湊進行加密。另一方面, 接收方將使用公共金鑰對其進行解密, 並比較雜湊以確保它們確實相同。
image

數位簽章流程

  • 為了更好地理解, 讓" A"和" B"成為密碼系統中的虛構角色。
  • " A"是傳送方, 計算郵件的雜湊值, 並附加要使用其私鑰傳送的簽名。
  • 另一面" B"對訊息進行雜湊處理, 然後使用A的公鑰解密簽名, 並比較兩個雜湊
  • 如果" B"找到匹配的雜湊值, 則表明該訊息沒有被更改或破壞。

實現數位簽章

讓我們使用演演算法SHA和RSA實現數位簽章, 並驗證雜湊是否與公鑰匹配。

方法:

  • 通過傳遞兩個引數輸入訊息和私鑰, 建立一個名為Create_Digital_Signature()的方法來實現數位簽章。在此方法中, 我們將通過簽名演演算法獲取簽名物件的範例, 併為其分配私鑰, 最後通過輸入將返回位元組陣列。

    public static byte[] Create_Digital_Signature(byte[] input, PrivateKey privateKey);
    signature.initSign(privateKey);
    signature.update(input);

  • 下一步是使用RSA演演算法和SecureRandom類函數生成非對稱金鑰對。

    SecureRandom secureRandom =new SecureRandom();
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);

  • 最後使用公鑰驗證簽名。 Verify_Digital_Signature()方法用於通過將輸入, 簽名和公鑰傳遞給簽名來檢查簽名是否匹配。

    Signature signature = Signature.getInstance(SIGNING_ALGORITHM);

        signature.initVerify(publickey);
        signature.update(input);
    

例子:

輸入:msg =" GEEKSFORGEEEKS是電腦科學門戶"輸出:簽名值:80429D3FA203437B4098CAF774D96C827B6CC2489F437A82926DA2EFCE64EF68FB33235B9F6BA8E3B033235B9F6BA8驗證:true

下面是實現:

// Java implementation for Generating
// and verifying the digital signature
  
package java_cryptography;
  
// Imports
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.util.Scanner;
  
import javax.xml.bind.DatatypeConverter;
  
public class Digital_Signature_lsbin {
  
     // Signing Algorithm
     private static final String
         SIGNING_ALGORITHM
         = "SHA256withRSA" ;
     private static final String RSA = "RSA" ;
     private static Scanner sc;
  
     // Function to implement Digital signature
     // using SHA256 and RSA algorithm
     // by passing private key.
     public static byte [] Create_Digital_Signature(
         byte [] input, PrivateKey Key)
         throws Exception
     {
         Signature signature
             = Signature.getInstance(
                 SIGNING_ALGORITHM);
         signature.initSign(Key);
         signature.update(input);
         return signature.sign();
     }
  
     // Generating the asymmetric key pair
     // using SecureRandom class
     // functions and RSA algorithm.
     public static KeyPair Generate_RSA_KeyPair()
         throws Exception
     {
         SecureRandom secureRandom
             = new SecureRandom();
         KeyPairGenerator keyPairGenerator
             = KeyPairGenerator
                   .getInstance(RSA);
         keyPairGenerator
             .initialize(
                 2048 , secureRandom);
         return keyPairGenerator
             .generateKeyPair();
     }
  
     // Function for Verification of the
     // digital signature by using the public key
     public static boolean
     Verify_Digital_Signature(
         byte [] input, byte [] signatureToVerify, PublicKey key)
         throws Exception
     {
         Signature signature
             = Signature.getInstance(
                 SIGNING_ALGORITHM);
         signature.initVerify(key);
         signature.update(input);
         return signature
             .verify(signatureToVerify);
     }
  
     // Driver Code
     public static void main(String args[])
         throws Exception
     {
  
         String input
             = "lsbin IS A"
               + " COMPUTER SCIENCE PORTAL" ;
         KeyPair keyPair
             = Generate_RSA_KeyPair();
  
         // Function Call
         byte [] signature
             = Create_Digital_Signature(
                 input.getBytes(), keyPair.getPrivate());
  
         System.out.println(
             "Signature Value:n "
             + DatatypeConverter
                   .printHexBinary(signature));
  
         System.out.println(
             "Verification: "
             + Verify_Digital_Signature(
                   input.getBytes(), signature, keyPair.getPublic()));
     }
}

輸出如下:
image

更多電腦保安和演演算法相關內容請參考:lsbin - IT開發技術https://www.lsbin.com/

檢視以下更多安全或演演算法相關的內容: