java rsa 签名,验签

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java rsa 签名,验签相关的知识,希望对你有一定的参考价值。

package com.fabiao;

import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

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

public class RSA_sign_verify {

    // 16进制公钥 有误
    private static final String pubKey = "081890451974948292818100d1605dd1191e5fe8392892874914c2b0268c07a4540839814464a4c1a74bd90f0bb301d9fa22d2e8ef07a25fc77f985baec8c9e75f2f716a3d78aa0eda3412f973022fe8aa5f49b3e1c4fd43ecf79709aa4107dee541968798795ed32c706b3565d09ac4b6310203010001";
    // 16进制私钥 有误
    private static final String priKey = "50004820260308219789494949025c02010002818100d1649617494798905dd1191e5fe8392c2b0268c07a454083981446415689489014949aec8c9e75f2f716a3d78aa0eda3412f9736f8af1ff94c5caa5f49b3e1c4fd43ecf7974169874948bfwjhpwortjh09aa4107dee5ed32c706b3565d09ac4b631020301000102818061d646008f5c4234a182a2165e1c9306093f74b104a7732869a4ab35d24289952e932e4e5cd0b72f626096bce20c537f8a292bcb23cd03a607c34e19b7c4a2692650f8b9ae824cf026be8e9ec7b716e4ec6f62a8c8683d89dfd90ef210e1e7f4ba7efff0d8ccedb1346b2ea9123be9f32c67beb925d1b0e9cab674135d0c9481024100ff642ad49b155807eaf34f314a6d52e2ed3d40759c469e4a5a6ba0c77f8adc0446571dad828c00bfc4c4068038c7bfe9832a838c150add352d2c4e3bae3571fb024100d1e01f4716905cd045517ed4b981b7dc3d0c4d990b8ae8f77e2aa9242d11260ba9d40a27a1b03d6b106bad7990c47281537fb2f40a06b70f6890fe5abb9b6cc3024079b7417a6616fc077a004fa3cc36e223e8b122816ae375193692c8e38b73a07c2111efc0fbd0c1a2a3a250fed710cbf3fc614ca47c7adb0636eb40b5ccc707f5024077ab9d0a12e2a41999bcfb5dde9d09b28a18ced25a938d7d39b2a7995a1d321d6a6bde92748ea2a6bec937345f08b4e5eb2fa061a8a9e58de2a8f26fd813aab3024100f4cd7e54d0dcf2e2b62a5de1636a70182d588d3b";
    
    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
    
    public static void main(String[] args) throws Exception
    {
        //测试串
        String str = "[email protected]#$%^&*()_+12";
        //签名
        String signstr = sign(str, priKey);
        //验签
        boolean ret = verify(str, signstr, pubKey);
        System.out.println("verify result=" + ret);
    }

    /*
     * 输入参数 签名字符串,16进制私钥 输出参数 16进制的签名串 函数当中测试了enbase64 的 合成与解析
     */
    public static String sign(String content, String privateKey) {
        byte[] signed = null;
        String str = null;
        try {
            // hex to str
            byte[] str_to_hex = Hex.decodeHex(privateKey.toCharArray());
            // str to encode 64
            byte[] encodedKey = Base64.encodeBase64(str_to_hex);
            // decode 64
            byte[] decodedKey = Base64.decodeBase64(new String(encodedKey));
            // str to byte
            byte[] pckbyte = decodedKey;

            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(pckbyte);
            KeyFactory keyf = KeyFactory.getInstance("RSA");
            PrivateKey priKey = keyf.generatePrivate(priPKCS8);
            // sha256
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] sha256Digest = md.digest(content.getBytes());
            // sha1
            java.security.Signature signature = java.security.Signature
                    .getInstance(SIGN_ALGORITHMS);
            signature.initSign(priKey);
            signature.update(sha256Digest);
            signed = signature.sign();
            // sign to 16进制字符串
            str = Hex.encodeHexString(signed);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }

    /*
     * 输入参数 需要验签字符串,签名字符串,16进制公钥 输出参数 是否成功验签 函数当中测试了enbase64 的 合成与解析
     */
    public static boolean verify(String content, String sign, String publicKey) {
        try {
            // hex to str
            byte[] str_to_hex = Hex.decodeHex(publicKey.toCharArray());
            // str to encode 64
            byte[] encodedKey1 = Base64.encodeBase64(str_to_hex);
            // decode 64
            byte[] decodedKey = Base64.decodeBase64(new String(encodedKey1)); // right
            // str to byte
            byte[] encodedKey = decodedKey;
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey pubKey = keyFactory
                    .generatePublic(new X509EncodedKeySpec(encodedKey));

            // 对数据进行SHA-256签名
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] sha256Digest = md.digest(content.getBytes());
            System.out.println("function doCheck sha256="
                    + Hex.encodeHexString(sha256Digest));
            // 对数据进行SHA1签名
            java.security.Signature signature = java.security.Signature
                    .getInstance(SIGN_ALGORITHMS);

            signature.initVerify(pubKey);
            signature.update(sha256Digest);
            boolean bverify = signature
                    .verify(Hex.decodeHex(sign.toCharArray()));
            return bverify;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}

所需要的类库
技术分享

 











































































































以上是关于java rsa 签名,验签的主要内容,如果未能解决你的问题,请参考以下文章

对加签验签的理解

Java实现RSA密钥对并在加解密加签验签中应用的实例

Python中rsa模块sign 加签验签的使用

微信小程序(17)-- RSA加密 解密 加签 验签

基于注解的 java 加签验签框架 checksum

java rsa 签名,验签