数字签名是数字音讯 (数据) 的非对称加密哈希。它是能够保障真实性, 不可否认性和完整性的值。换句话说, 这意味着你能够验证发件人, 日期和工夫以及邮件内容没有被泄露或泄露。
留神:你能够参考这个链接为了更好地了解明码术语。
数字签名的计算
数字签名通常应用椭圆曲线明码来计算, 尤其是在 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