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