通过OpenSSL生成公私钥文件(如果没有OpenSSL工具建议下载Cmder工具自带OpenSSL指令)

1、生成RSA密钥的方法

genrsa -out private-rsa.key 2048

2、获取客户端公钥文件

openssl  req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cer

3、获取服务器私钥文件

openssl pkcs12 -export -name zhangsan -in public-rsa.cer -inkey private-rsa.key -out user-rsa.pfx

4、获取密钥文件的5元组数据

openssl rsa -in private-rsa.key -noout -text

Java实现私钥签名、公钥验签、私钥加密数据、公钥解密数据

import javax.crypto.Cipher;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory; public class Sha1withRSAUtil {
private static final String publicKeyFileName = System.getProperty("user.dir") + File.separator + "pubkey.cer";
private static final String privateKeyFileName = System.getProperty("user.dir") + File.separator + "private.pfx";
private static final String pfxPassword = "123";//私钥文件获取时设置的密钥
private static String aliasName = "003";//alias名称 /**
* 签名
*
* @return 签名后经过base64处理的字符串
* @throws Exception
*/
public static String sign(String str) {
String base64Sign = "";
InputStream fis = null;
try {
fis = new FileInputStream(privateKeyFileName);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
char[] pscs = pfxPassword.toCharArray();
keyStore.load(fis, pscs);
PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs));
// 签名
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(priKey);
byte[] bysData = str.getBytes("UTF-8");
sign.update(bysData);
byte[] signByte = sign.sign();
BASE64Encoder encoder = new BASE64Encoder();
base64Sign = encoder.encode(signByte);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return base64Sign;
} /**
* 数据验证
*
* @param signStr 加密后的数据
* @param verStr 原始字符
* @return
*/
public static boolean verify(String signStr, String verStr)
throws Exception {
boolean verfy = false;
InputStream fis = null;
try {
fis = new FileInputStream(publicKeyFileName);
CertificateFactory cf = CertificateFactory.getInstance("x509");
Certificate cerCert = cf.generateCertificate(fis);
PublicKey pubKey = cerCert.getPublicKey();
BASE64Decoder decoder = new BASE64Decoder();
byte[] signed = decoder.decodeBuffer(signStr);
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initVerify(pubKey);
sign.update(verStr.getBytes("UTF-8"));
verfy = sign.verify(signed);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return verfy;
} /**
* 通过公钥文件进行加密数据
*
* @return 加密后经过base64处理的字符串
*/
public static String encrypt(String source) throws Exception {
InputStream fis = null;
try {
fis = new FileInputStream(publicKeyFileName);
CertificateFactory cf = CertificateFactory.getInstance("x509");
Certificate cerCert = cf.generateCertificate(fis);
PublicKey pubKey = cerCert.getPublicKey();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] sbt = source.getBytes();
byte[] epByte = cipher.doFinal(sbt);
BASE64Encoder encoder = new BASE64Encoder();
String epStr = encoder.encode(epByte);
return epStr;
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 通过私钥文件进行解密数据
*
* @return 解密后的明文字符串
*/
public static String decode(String source) throws Exception {
BASE64Decoder b64d = new BASE64Decoder();
byte[] keyByte = b64d.decodeBuffer(source);
InputStream fis = null;
try {
fis = new FileInputStream(privateKeyFileName);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
char[] pscs = pfxPassword.toCharArray();
keyStore.load(fis, pscs);
PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
byte[] epByte = cipher.doFinal(keyByte);
return new String(epByte, "UTF-8");
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

使用方法

import com.util.rsa.Sha1withRSAUtil;

public class Main {

    public static void main(String[] args) {
String data = "name123456789";
String signData = Sha1withRSAUtil.sign(data);
System.out.println(signData); try {
boolean flag = Sha1withRSAUtil.verify(signData, data);
System.out.println(flag); String eData = Sha1withRSAUtil.encrypt(data);
System.out.println(eData);
String dData = Sha1withRSAUtil.decode(eData);
System.out.println(dData);
} catch (Exception e) {
e.printStackTrace();
}
}
}

java RSA实现私钥签名、公钥验签、私钥加密数据、公钥解密数据的更多相关文章

  1. Java & PHP RSA 互通密钥、签名、验签、加密、解密

    RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Le ...

  2. RSA/RSA2 进行签名和验签

    package com.byttersoft.hibernate.erp.szmy.util; import java.io.ByteArrayInputStream; import java.io. ...

  3. RSA签名、验签、加密、解密

    最近在做一个项目,与一个支付渠道进行连接进行充值,为了安全,每个接口访问时,都要先登陆(调用登陆接口),拿到一个sessionKey,后续业务接口内容用它来进行3DES加密处理.而登陆需要用到RSA进 ...

  4. java使用Cipher进行签名和验签

    public static void main(String[] args) { try { String plainText = "duwenlei"; KeyPairGener ...

  5. PHP 之用证书对数据进行签名、验签、加密、解密

    /** * 对数据进行签名 * $data = 'If you are still new to things, we’ve provided a few walkthroughs to get yo ...

  6. RSA后台签名前台验签的应用(前台采用jsrsasign库)

    写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...

  7. RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

    Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...

  8. RSA公钥、私钥、签名和验签

    1 RSA加密算法介绍 RSA又叫非对称加密算法,这类加密算法有一对秘钥,其中一个用来加密一个用来解密.这一对秘钥中你可以选择一个作为私钥(自己保存),另一个作为公钥(对外公开).用私钥加密的内容只能 ...

  9. SHA256withRSA证书签名,私钥签名/公钥验签

    证书签名 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundE ...

随机推荐

  1. __x__(14)0906第三天__<iframe> 内联框架 引入有一个外部html页面

    在现实开发中,不推荐使用内联框架,因为<iframe></iframe>中的内容不会被搜索引擎检索. 在特殊情况中,如内网项目,不用放在互联网上时,可以使用<iframe ...

  2. (68)Wangdao.com第十一天_JavaScript 数组的常用方法

    数组的常用方法: 向数组末尾添加一个或多个元素,返回新长度 var arr = new Array(); arr.push("唐僧"); // 返回 1 删除数组最后一个元素,返回 ...

  3. vue 项目界面绘制_stylus_iconfont_swiper

    stylus 兼容 less 的大部分语法 <link rel="stylesheet" href="stylus/index.css"> less ...

  4. SQL - 1.区分login、user、schema和role

        Login Login 是Server一级的概念,表示登录Server的凭证,比如在Server_A上有一个数据库DA,那么想要访问数据库DA,第一步要做的事情就是先登录到Hosting该数据 ...

  5. 华大单片机开发板HC32F030上手入门

    HC32F030开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...

  6. linux CentOS YUM 安装 nginx+tomcat+java+mysql运行环境

    Java环境配置 1 安装JDK 查看CentOS自带JDK是否已安装 1 [root@test ~]# yum list installed |grep java 若有自带安装的JDK,应如下操作进 ...

  7. 《ABCD组团队》第二次作业

    ABCD组:二手车价格预测系统 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.c ...

  8. 2018-2019-2 网络对抗技术 20165225 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165225 Exp4 恶意代码分析 实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp ...

  9. python smtp 发邮件 添加附件

    # -*- coding:utf-8 -*- # __author__ = 'justing' import os import smtplib from email.mime.multipart i ...

  10. MUI 返回顶部

    //绑定滚动到顶部按钮事件 if ($("#scroll-up").length > 0) { var scrollToTopBox = $("#scroll-up ...