使用SHA1withRSA算法进行签名和验签

package com.hhh.nnn.test;

import org.apache.commons.codec.binary.Base64;

import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

public class EncryptionTest {

    /**
     * 密钥长度,DH算法的默认密钥长度是1024
     * 密钥长度必须是64的倍数,在512到65536位之间
     **/
    private static final int KEY_SIZE=1024;

    public static void main(String[] args) {

        try {
            KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
            gen.initialize(KEY_SIZE);
            KeyPair pair = gen.generateKeyPair();
            // rsa生成一对公私钥
            PublicKey publicKey = pair.getPublic();
            PrivateKey privateKey = pair.getPrivate();


            // 需要加密的密文
            byte[] data = "sss".getBytes(StandardCharsets.UTF_8);


            // SHA1withRSA算法进行签名,RSA私钥签名
            Signature sign = Signature.getInstance("SHA1withRSA");
            sign.initSign(privateKey);
            // 用于签名的数据
            sign.update(data);
            // 所获得的签名
            byte[] signature = sign.sign();



            // -----------------------------------------------
            // Base64加密
            String s = new String(Base64.encodeBase64(signature));
            // 虽然每次获得的s不一样,但是结果都为true
            System.out.println(s);

            // Base64解密,下面两种结果一样
            // signature = new BASE64Decoder().decodeBuffer(s);

            // 此处接受加密后的原始数组或者数组转化后的字符串均可
            signature = Base64.decodeBase64(s);

            // 这种不行,因为这只是单纯的转换为数组,并不是Base64解密
            // signature = s.getBytes(StandardCharsets.UTF_8); 
            // -----------------------------------------------



            // RSA公钥验签:
            Signature verifySign = Signature.getInstance("SHA1withRSA");
            verifySign.initVerify(publicKey);
            // 用于验签的数据
            verifySign.update(data);
            // 验证签名
            boolean flag = verifySign.verify(signature);
            // 结果为true
            System.out.println(flag);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

你可能感兴趣的:(Java)