数字签名是数字消息(数据)的非对称加密哈希。它是可以保证真实性, 不可否认性和完整性的值。换句话说, 这意味着你可以验证发件人, 日期和时间以及邮件内容没有被泄露或泄露。
注意:你可以参考这个链接为了更好地理解密码术语。
数字签名的计算
数字签名通常使用椭圆曲线密码来计算, 尤其是在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/
查看以下更多安全或算法相关的内容:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。