乐趣区

关于算法:算法设计密码技术中数字签名算法的Java实现

数字签名是数字音讯 (数据) 的非对称加密哈希。它是能够保障真实性, 不可否认性和完整性的值。换句话说, 这意味着你能够验证发件人, 日期和工夫以及邮件内容没有被泄露或泄露。

留神:你能够参考这个链接为了更好地了解明码术语。

数字签名的计算

数字签名通常应用椭圆曲线明码来计算, 尤其是在 IoT 设施中, 然而咱们将应用 RSA 进行演示。首先, 因为输出音讯的速度和安全性, 咱们将应用 SHA-256 获取输出音讯并为其创立哈希, 而后应用非对称密钥对中的私钥对该哈希进行加密。另一方面, 接管方将应用公共密钥对其进行解密, 并比拟散列以确保它们的确雷同。

数字签名流程

  • 为了更好地了解, 让 ” 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()));
     }
}

输入如下:

更多计算机平安和算法相干内容请参考:lsbin – IT 开发技术:https://www.lsbin.com/

查看以下更多平安或算法相干的内容:

  • 操作系统中的死锁检测算法具体指南:https://www.lsbin.com/3598.html
  • 操作系统中的页面替换算法:https://www.lsbin.com/3476.html
  • 如何实现 Luhn 算法?:https://www.lsbin.com/3457.html
退出移动版