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;
    }

}

所需要的类库

时间: 2024-08-11 07:32:46

java rsa 签名,验签的相关文章

RSA签名验签

import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; /** * Author:JsonLu * DateTime:

RSA签名验签学习笔记

RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行BER编码再加密. 先看一个例子. 公钥模:89 54 E6 61 C1 52 DB ED 07 57 50 04 AD B3 D2 A7 A9 8F E8 D8 20 5B 01 B2 E5 E4 7A 7B EE 80 E3 C0 13 11 D2 F9 AD C3 CC 5F 1D 96 AC

.net core RSA 分段加密解密,签名验签(对接java)

参考地址: https://www.cnblogs.com/stulzq/p/7757915.html https://www.cnblogs.com/stulzq/p/8260873.html https://github.com/stulzq/RSAExtensions(XC.RSAUtil) https://www.cnblogs.com/stulzq/p/12053976.html https://github.com/stulzq/RSAExtensions (RSAExtension

JAVA 实现 基于RSA算法的签名验签

基本步骤 签名方: 1用sha1算出原文的摘要 2用私钥对摘要进行加密 3对密文进行BASE64编码 验证方: 1对密文进行BASE64解码 2用公钥对解码后的密文解密 3用sha1对原文计算摘要并和解密后的明文比对 上干货 //参数字符串         String userId="2312sd";         String orderId="232djfj";         String price="12312";         

eos中签名验签流程和eosjs中的加解密原理

关键词:eos 签名 验签 ecc dsa 加密 解密 eosjs aes 本文主要探讨两方面 1.eosjs中用密钥对进行加解密功能 2.eos中密钥对生成,签名和验签过程(私钥签名 公钥验签) 常用的加密算法 对称性加密算法 对称式加密就是加密和解密使用同一个密钥,信息接收双方都需事先知道密匙和加解密算法,之后便是对数据进行加解密了.对称加密算法用来对敏感数据等信息进行加密. 对称性加密算法有:AES.DES.3DES DES(Data EncryptionStandard):数据加密标准,

非对称加密解密与签名验签的关系

首先看一下各自的定义: 加密:发送方利用接收方的公钥对要发送的明文进行加密. 解密:接受方利用自己的私钥进行解密. 签名:发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,得到的就是这个报文对应的数字签名.通常来说,发送方会把数字签名和报文原文一并发送给接受者. 验签:接收方得到原始报文和数字签名后,用同一个哈希函数从报文中生成摘要A,另外,用发送方提供的公钥对数字签名进行解密,得到摘要B,对比A和B是否相同,就可以得知报文有没有被篡改过. 两者的目的不同,加

RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密  对称加密的意思:有一个密钥 相当于加密算法,加密用它来加

RSA加解密&RSA加验签

开发语言与私钥证书的关系如下: 开发语言 私钥格式 证书格式 JAVA .key.p8 .crt PHP .key.pem .cert.pem .NET .key.der .crt 其它 .key.pem .cert.pem 我们是java语言,工程property配置:#商户私钥 PKCS#8标准的私钥 90000002.mer.prikey.path=cert/90000002.key.p8#平台公钥 X.509证书 plat.cert.path=cert/umpay.cert.crt RS

openresty中使用私钥/公钥进行加密/解密/签名/验签。

对于公钥私钥的提取,详细请看http://www.cnblogs.com/dreamer-One/p/5621134.html另外付在线加解密工具链接:http://tool.chacuo.net/cryptrsaprikey--公钥local RSA_PUBLIC_KEY = [[ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ9YqFCTlhnmTYNCezMfy7yb7xwAzRinXup1Zl51517rhJq8W0wVwNt+ mcKwRzisA1S