java中数字签名MD5withRSA和SHA1withRSA

一、简介

数字签名用于验证消息发送者的身份,确保其他人无法伪造身份。

二、原理

数字签名基于非对称加密算法,利用只有拥有者才有私钥的特性(这可以标识身份)进行的。

1、数字签名的生成

对发送内容先生成有限长度的摘要,再使用私钥进行加密,进而生成数字签名。

2、数字签名验证

用公钥对数字签名进行解密获取加密内容(其实也就是摘要),再用与发送方相同的摘要算法对发送内空生成摘要,

再将这两者进行比较,若相等,则验证成功,否则失败。

三、代码实例

在此使用java自带的数字签名api进行演示,包括MD5withRSA和SHA1withRSA两种方式,签名使用base64编码。

 

public class DigitalSignatureMain {
    public static void main(String[] args)  throws Exception {
        String content = "study hard and make progress everyday";
        System.out.println("content :"+content);

        KeyPair keyPair = getKeyPair();
        // 获取公钥对象
        PublicKey publicKey =  keyPair.getPublic();
        // 获取私钥对象
        PrivateKey privateKey = keyPair.getPrivate();

        String md5Sign  = getMd5Sign(content,privateKey);
        System.out.println("MD5withRSA算法的签名 :"+ md5Sign);
        boolean md5Verifty = verifyWhenMd5Sign(content,md5Sign,publicKey);
        System.out.println("MD5withRSA算法的签名验签结果 :"+ md5Verifty);

        String sha1Sign  = getSha1Sign(content,privateKey);
        System.out.println("SHA1withRSA算法的签名 :"+ sha1Sign);
        boolean sha1Verifty = verifyWhenSha1Sign(content,sha1Sign,publicKey);
        System.out.println("SHA1withRSA算法的签名验签结果 :"+ sha1Verifty);

    }

    // 生成密钥对
    static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(512); //这是生成的秘钥长度,此处的值也可以是1024或2048。秘钥越大加密后的密文长度也越大,加密解密越慢。加密的原文要比秘钥小些。一般1024足够用了。
        KeyPair keyPair = keyGen.generateKeyPair();
        return keyPair;
    }

    // 用md5生成内容摘要,再用RSA的私钥加密,进而生成数字签名
    static String getMd5Sign(String content , PrivateKey privateKey) throws Exception {
        byte[] contentBytes = content.getBytes("utf-8");
        // 返回MD5withRSA签名算法的 Signature对象
        Signature signature = Signature.getInstance("MD5withRSA");
        signature.initSign(privateKey);
        signature.update(contentBytes);
        byte[] signs = signature.sign();
        return Base64.encodeBase64String(signs);
    }

    // 对用md5和RSA私钥生成的数字签名进行验证
    static boolean verifyWhenMd5Sign(String content, String sign, PublicKey publicKey) throws Exception {
        byte[] contentBytes = content.getBytes("utf-8");
        Signature signature = Signature.getInstance("MD5withRSA");
        signature.initVerify(publicKey);
        signature.update(contentBytes);
        return signature.verify(Base64.decodeBase64(sign));
    }

    // 用sha1生成内容摘要,再用RSA的私钥加密,进而生成数字签名
    static String getSha1Sign(String content , PrivateKey privateKey) throws Exception {
        byte[] contentBytes = content.getBytes("utf-8");
        // 返回SHA1WithRsa签名算法的 Signature对象
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initSign(privateKey);
        signature.update(contentBytes);
        byte[] signs = signature.sign();
        return Base64.encodeBase64String(signs);
    }

    // 对用md5和RSA私钥生成的数字签名进行验证
    static boolean verifyWhenSha1Sign(String content, String sign, PublicKey publicKey) throws Exception {
        byte[] contentBytes = content.getBytes("utf-8");
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initVerify(publicKey);
        signature.update(contentBytes);
        return signature.verify(Base64.decodeBase64(sign));
    }
}

输出如下:

content :study hard and make progress everyday
MD5withRSA算法的签名:L0pxR69rmOYoWoHdOJHKEvHDVdEamrqQlmYV4Yrwfz0BFIAKgSL4tGyw+4G3WDiOCHeZMPAPM/F39Ygxc1rtMg==
MD5withRSA算法的签名验签结果 :true
SHA1withRSA算法的签名 :jBhPcFAhZ7mGcc3jjVhmyybIPNwnIMPzGQ+piQf6RyMbICtYzT/xxG2P0rQ09t8+9ybp/NIWy83I5kWIs3MZfg==
SHA1withRSA算法的签名验签结果 :true

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SHA1WithRSA 是一种数字签名算法,不是加密算法,所以无法进行解密操作。它通常用于验证数字证书、软件包等的完整性和真实性。如果您需要解密 RSA 加密的数据,请使用 RSA 解密算法。以下是 Java 使用 RSA 解密数据的示例代码: ```java import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import javax.crypto.Cipher; public class RSADecryptionExample { public static void main(String[] args) throws Exception { // 私钥字符串 String privateKeyStr = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM+X/fxOc0T5lqHt" + "Q4AtYFVQ5fzP+Y7V7rRv7md1q9jvJfOlZ1t9EgulD5lCY3vLmLwZPsFzE6GkW9V" + "FwWQ0nVNLyZjyjy+9gMv3W7ZJ1d6kH8r5VleNyrKzLrQ7Vz7f7zW4Kry2j8NNTd" + "BZJWdQVQoGxASs8jXcGdH/z7eOZ9AgMBAAECgYEAiUWzRzGJx1KQIIPV7ZioG9W" + "n+Cp9tQlXoJm9SdNkYhLH4Hm6VvWQ8LkxJZy3d6P3zNokTtU5p1hsMvHl5C8Pp4" + "WAMH5K+I3L3J6tj8y4ZvJ4qfG2WQ+HgY1w2iIzGQVyJZTkaJkfJe7nVd0yA8H+/" + "4LWkXO8CnS8Zb+5J0r0M1F3z5IqCECQQD4O3H8Lro7Zp8Il6+cxJQ3Yw9tC9d9S" + "TfRASzLWJyD3qB5gKlE7vNXXL1rWJ6n8Fw1e1i2fOjO6gXnU5mLQ+5WTAkEA2Jt" + "dLlL0Q2BdP3pLwNFpi+EJk8XAcYpq2pKg3rMhnD7CnWJcVZK1inTq4yMMYRV7fZ" + "ejFJc6bSDlRG2jPvUwJBAJr6XJv6XDs/7ZDgE1/8+I2oKzNUiOQLqjU9A/4n2g" + "5R4u1S7i3SGnSvSN2aC9h7+9PnJ2xg/7VbqkTQYz1tsCQQDGo9jIxI7Vr4DyDy2" + "FQvKUvR/4/tDBg2ZzF8Fj+REOreD5Q5p4rWVSiRfsZ5A6OQ9Q0yqPbZD8Jd1J5m" + "zuIrAkEAo54+SH1NVWsJYNMDQgFfB/QvWDw5WjRq1G2xYzsKzOgCj6t6oHvO1b6" + "psJx4IwWZ7oTzEwUx8vqQpwwkaPvJg=="; // 将私钥字符串转换为 PrivateKey 对象 byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // 使用私钥解密数据 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] encryptedData = ...; // 待解密的数据 byte[] decryptedData = cipher.doFinal(encryptedData); System.out.println(new String(decryptedData)); } } ``` 请注意,上述代码使用了 Base64 解码私钥字符串,您需要将 `...` 替换为待解密的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值