Java RSA验证

maven依赖——RSA 有人说jar包比较难找,还得一一试,所以我把我的maven依赖发一下, 有几个确实难找的 jdom jdom 1.0 org.apache.commons commons-lang3 3.4 aspectj aspectjweaver 1.5.3 阅读详情

1、新增两个类RSAUtil 和 BASE64Util

package com.shishike.susie.utility;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;


/**
 * RSA加密解密
 * 此工具类能使用指定的字符串,每次生成相同的公钥和私钥且在linux和windows密钥也相同;相同的原文和密钥生成的密文相同
 */
public class RSAUtil {
    private static final String ALGORITHM_RSA = "RSA";
    private static final String ALGORITHM_SHA1PRNG = "SHA1PRNG";
    private static final int KEY_SIZE = 1024;
    private static final String PUBLIC_KEY = "RSAPublicKey";
    private static final String PRIVATE_KEY = "RSAPrivateKey";
    private static final String TRANSFORMATION = "RSA/None/NoPadding";

    /**
     * 解密
     * 用私钥解密,解密字符串,返回字符串
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static String decryptByPrivateKey(String data, String key) throws Exception {
        return new String(decryptByPrivateKey(BASE64Util.decodeToByte(data), key));
    }

    /**
     * 加密
     * 用公钥加密,加密字符串,返回用base64加密后的字符串
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptByPublicKey(String data, String key) throws Exception {
        return encryptByBytePublicKey(data.getBytes(), key);
    }
    /**
     * 加密
     * 用公钥加密,加密byte数组,返回用base64加密后的字符串
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptByBytePublicKey(byte[] data, String key) throws Exception {
        return BASE64Util.encodeByte(encryptByPublicKey(data, key));
    }

    /**
     * 解密
     * 用私钥解密
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
        byte[] keyBytes = BASE64Util.decodeToByte(key);//对私钥解密
        /*取得私钥*/
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        /*对数据解密*/
        Cipher cipher = Cipher.getInstance(TRANSFORMATION, new BouncyCastleProvider());//相同的原文、公钥能生成相同的密文。如果使用Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//相同的原文、公钥生成的密文不同
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        return cipher.doFinal(data);
    }

    /**
     * 加密
     * 用公钥加密
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
        byte[] keyBytes = BASE64Util.decodeToByte(key);//对公钥解密
        /*取得公钥*/
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        /*对数据加密*/
        Cipher cipher = Cipher.getInstance(TRANSFORMATION, new BouncyCastleProvider());//相同的原文、公钥能生成相同的密文。如果使用Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//相同的原文、公钥生成的密文不同
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        return cipher.doFinal(data);
    }

    /**
     * 取得私钥
     * @param keyMap
     * @return
     */
    public static String getPrivateKey(Map<String, Object> keyMap) {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return BASE64Util.encodeByte(key.getEncoded());
    }

    /**
     * 取得公钥
     * @param keyMap
     * @return
     */
    public static String getPublicKey(Map<String, Object> keyMap) {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return BASE64Util.encodeByte(key.getEncoded());
    }

    /**
     * 初始化公钥和私钥
     * @param seed
     * @return
     * @throws Exception
     */
    public static Map<String, Object> initKey(String seed) throws Exception {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM_RSA);
        SecureRandom random = SecureRandom.getInstance(ALGORITHM_SHA1PRNG);//如果使用SecureRandom random = new SecureRandom();//windows和linux默认不同,导致两个平台生成的公钥和私钥不同
        random.setSeed(seed.getBytes());//使用种子则生成相同的公钥和私钥
        keyPairGen.initialize(KEY_SIZE, random);
        KeyPair keyPair = keyPairGen.generateKeyPair();

        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//公钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//私钥

        Map<String, Object> keyMap = new HashMap<String, Object>(2);

        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;
    }


}
package com.shishike.susie.utility;
import org.apache.commons.codec.binary.Base64;

public class BASE64Util {
    /**
     * 加密
     * 字符串加密为字符串
     * @param source
     * @return
     */
    public static String encode(String source) {
        return encodeByte(source.getBytes());
    }

    /**
     * 解密
     * 字符串解密为字符串
     * @param source
     * @return
     */
    public static String decode(String source) {
        return new String(decodeToByte(source));
    }

    /**
     * 加密
     * 加密byte[]类型,密文为字符串
     * @param b
     * @return
     */
    public static String encodeByte(byte[] b) {
        return new String(new Base64().encode(b));
    }

    /**
     * 解密
     * 将字符串解密为byte[]类型
     * @param source
     * @return
     */
    public static byte[] decodeToByte(String source) {
        return new Base64().decode(source.getBytes());
    }


}

需要添加的依赖有

  <!--20180809-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.55</version>
            <!--         <scope>provided</scope> -->
        </dependency>

 

 测试方法为

    public void testrsa(HttpServletRequest request, HttpServletResponse response) throws Exception {


        RSAUtil rsaUtil = new RSAUtil();

        String source = "12dfefDKLJKLKL464d中文f465as43f1a3 f46e353D1F34&*^$E65F46EF43456abcd54as56f00ef";//原文
        String seed = "zsq";//种子

        System.out.println("原文:\n" + source);
        Map<String, Object> keyMap = rsaUtil.initKey(seed);//初始化密钥
        String publicKey = rsaUtil.getPublicKey(keyMap);//公钥
        String privateKey = rsaUtil.getPrivateKey(keyMap);//私钥
        System.out.println("公钥:\n" + publicKey);
        System.out.println("私钥:\n" + privateKey);
        String encodedStr = rsaUtil.encryptByPublicKey(source, publicKey);//加密
        System.out.println("密文:\n" + encodedStr);
        String decodedStr = rsaUtil.decryptByPrivateKey(encodedStr, privateKey);//解密
        System.out.println("解密后的结果:\n" + decodedStr);

    }

 

RSA+Base64工具类    RSA+Base64工具类 RSA加密后的,需要进行base64 /** * BASE64工具类 * * @author Frank.Z * */ public class Base64Utils { static private final int BASELENGTH = 128; static private final int LOOKUPLENGTH = 64... 阅读详情

相关推荐

常见加密工具类Base64、DES、AES、RSA、MD5汇总

文章目录引言1、Base64加密2、DES加密3、AES加密4、RSA加密5、MD5加密 引言 项目中经常会用到Base64、DES、AES、RSA、MD5几种加解密方式,每次都要去网上搜索半天,今天索性一次性把他们都汇总起来,以便记忆查找。 JDK版本:1.8.0_45 代码位置:com.leo.demo.encodetest 源码地址:https://gitee.com/leo825/sort...

u011047968的专栏 2183

加密解密算法java实现(3)—RSA

1、maven依赖 commons-codec commons-codec 1.9 org.bouncycastle bcprov-jdk15on 1.55 provided --> 2、java代码 import java.

lxhjh的专栏 789

RSA加密与签名验证:Android和Java实现指南

RSA算法是密码学历史上最重要的发明之一,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年共同提出。它是第一个既可以用作加密也可以用作数字签名的算法。RSA的安全性基于大数分解的难度,即给定两个大的质数相乘的结果,要分解出原来的质数在计算上是不可行的。数字签名是一种用于验证数字信息完整性和来源的技术。它与传统的手写签名具有相似的功能,但它是以数字形式存在的,可以被电子方式验证。

weixin_42524864的博客 1331

RSA非对称加密拿来即用

RSA非对称加密 1.Maven依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-codec&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-codec&amp;lt;/artifactId&amp;gt; &amp;lt;version&a

weixin_42632598的博客 234

MAVEN RSA签名生成验签

RSA签名可以确定唯一性,本项目是基于JAVA语言的项目,功能有RSA签名的生成,验签等,是一个MAVEN项目,

ClickHouse的bitmap使用

ClickHouse的bitmap使用 bitmap的基本使用 在CK中bitmap有两种构建方式,在ClickHouse的官网有说明: (1)一个是由聚合函数groupBitmapState构造的, (2)另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。 bitmap实战 数据和基本数据表准备 创建一张基本表,一个用户表,有多个描述的维度,每个维度由该维度的唯一id。 CREATE TABLE test02(id UInt16, tag1 UInt8, tag2 UInt8,

zg_hover的专栏 5654

Java实现RSA加密和验证

RSA是一种强大且多用途的加密算法,广泛应用于网络通信、数据安全、数字签名、身份验证和加密存储等领域。然而,需要注意的是,RSA的性能较低,特别是对于长消息,因此在某些情况下,可能需要与对称加密算法结合使用,以提高性能。

write less , do more 8571

九齐NY8A051F低功耗模式全解析:从待机到休眠的省电实战

本文全面解析台湾九齐NY8A051F MCU的低功耗模式,从待机到休眠的省电实战技巧。通过实测数据展示四种工作模式的电流消耗差异,提供模式切换的标准流程和唤醒时序优化策略,并分享外围电路省电设计和低电压检测的实战应用,帮助开发者实现物联网设备的超长续航。

weixin_30839881的博客 410

java rsa 字符串_如何从String加载RSA公钥以在Java中进行签名验证?

我有以下公共密钥,它以文本形式存储在数据库(Postgressql)中.这是一个字符串,在java中:-----BEGIN RSA PUBLIC KEY-----MIICCgKCAgEA1ht0OqZpP7d/05373OE7pB7yCVGNGzkUEuCneyfOzps6iA03NbvI1ZL0Jpp/N3AW73lGdhaoa3X3JE4GsI/bsToVLQwTKmIOC4yjTvBctmF...

weixin_42508241的博客 645

CUDA系列-Stream-1

This section describes static aspects of the CUSW_UNIT_STREAM unit’s architecture.和stream相关的其它Unit主要有Channel,Sync,Memmgr A CUDA stream is a software FIFO queue that allows commands like kernel launch and memcpy to be enqueued in it. The enqueued commands

weixin_43360707的博客 734

从零开始:使用英伟达nx开发板部署目标检测算法的全过程

英伟达nx开发板烧录、依赖安装、开发板联网

weixin_51192760的博客 3762

java rsa签名验证失败,在Java中验证jwt:无法为RSA签名指定密钥字节

I receive the jwt (access token) from an OAuth Server. The OAuth server has already provided me with the secret, public key, and self-signed CA certificate.I want to write a code that when I receive a...

weixin_30844407的博客 1166

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器?

本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。

weixin_30134145的博客 359

java radius_基于RSA securID的Radius二次验证java实现(PAP验证方式)

基于rsa SecurID的二次验证。RSA server自身可以作为Radius服务器,RSA也可以和其他的软件集合,使用其他的server作为Radius服务器。radius的验证的一般流程如下图:用java实现的主要代码实现如下(需要导入radius相关jar包,主要为radiusclient3.jar):①radius第一次验证, RADIUSClient的4个参数分别为server ip...

weixin_39816141的博客 1332

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1079

java rsa签名验证失败_Java使用RSA加密解密及签名校验

packagecom.ljq.test;importjava.io.ByteArrayOutputStream;importjava.security.Key;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.Priv...

weixin_31290291的博客 1459

【100%通过率】2023华为od机试C卷【螺旋数组矩阵】C++ 实现

给出数字个数n和行数m(1 < n,m < 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成个一m行矩阵。疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。输入一行,两个整数,空格隔开,依次表示n、m。4.数字不够时,使用单个*号占位。3.填充数字时优先填充外部。1:模拟整个过程打印即可。1.每行数字的个数一样多。小明对这个矩阵有些要求。2.列的数量尽可能少。

MISAYAONE的博客 1249

java 公钥 验证_java验证RSA公钥提示InvalidKeySpecException的一个原因之一

最近一个项目要用一个RSA公钥对签名过的文件进行验证。公钥如下:-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtohucPE/IWn+S+nFbMvQL8cGcxltm+AJsSQS1W+o1uMALERPnQt2Xas5zVxiFUCx9IBatkR+l/3yVSFwCfEdmFmIzkR2Y6sgL3...

weixin_30342363的博客 2456

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java RSA 加解密及签名验证

RSA算法是目前非常常见的加密算法,他对应的加解密、签名验签的场景非常常见。因其特性对大字符串加解密效率较低,曾经想对较长字符串加解密,而因其解密过程为分段解密而捣鼓过;这里贴一下代码。

guokm的博客 2061

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java RSA加密解密及签名验证

Java RSA加密解密及签名验证

前路漫漫,少年,继续披荆斩棘! 452

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c# 签名 java 验证_【转】C# RSA 加密,解密与签名,验证签名

这是一篇转载合并文章,主要内容来自一下两篇:使用的库 bouncycastle加密解密加密解密相关的代码,见:签名,验证签名#region 加签/// /// 基于BouncyCastle的RSA签名/// /// /// /// JAVA的和.NET的不一样,如:MD5(.NET)等同于MD5withRSA(JAVA)/// /// public static string RSASignJav...

weixin_42300721的博客 717

java pkcs1 签名_验证Java Golang中生成的rsa.SignPKCS1v15签名

我试图让Java验证签名的SHA-1哈希,但是它一直返回false。我在Go中有以下代码,该代码生成RSA密钥对并签名并返回击中/sign端点的任何消息,以及十六进制编码的哈希,公钥模数和指数:package mainimport ("crypto""crypto/rand""crypto/rsa""encoding/hex""encoding/json""fmt""io""net/http""s...

weixin_39656174的博客 1769

RSA公钥验证签名(Java版)

RSA签名验证,使用公钥验证签名是否正确,含SHA1,SHA256 需要依赖commons-codec <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> 完整代码如下: import org.apac

axe的专栏 2082

java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过

/*** RSA加密工具类* 使用PKCS1_PADDING填充,密钥长度1024* 加解密结果在这里测试通过:http://tool.chacuo.net/cryptrsaprikey* 注意加密内容的编码要一致,统一UTF-8比较好* @author daxi*/public class RSAUtil {public static final String KEY_ALGORTHM="RSA...

weixin_33344952的博客 2584

java rsa sha1,验证与phpseclib在Java中(安卓)产生SHA1withRSA签名

This is what I want to do:Generate a 512 bit RSA keypair in Java/AndroidGenerate a SHA1withRSA signature for some message in JavaSend message, signature and public key to PHP (for testing this will be...

weixin_32200329的博客 286
上一篇: Java Https Token认证,后端处理
下一篇: 如何用 JIRA REST API 创建 Issue
intelrain
博客等级 码龄10年 3936粉丝 216原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值