1.使用openssl生成私钥和公钥

openssl下载地址:http://www.openssl.org/source

openssl生成私钥命令:  genrsa -out rsa_private_key.pem 1024

openssl生成公钥命令:  rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

2.此时在openssl安装目录下的bin文件夹可以看到 rsa_private_key.pem 和 rsa_public_key.pem 两个文件。这时候的私钥是不能直接使用的,需要进行 pkcs8 编码

openssl的pkcs8编码命令:pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt

那么在bin文件夹可以看到 pkcs8_rsa_private_key.pem 文件。至此,可用的密钥对已经生成好了,私钥使用pkcs8_rsa_private_key.pem,公钥采用rsa_public_key.pem。

3.使用密钥对进行签名、加解密

public class RSAPemCoder {
public static final String KEY_SHA = "SHA";
public static final String KEY_MD5 = "MD5";
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; /**
* 用私钥对信息生成数字签名
*
* @param data 加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static String sign(byte[] data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateKey);
signature.update(data);
return encryptBASE64(signature.sign());
} /**
* 校验数字签名
*
* @param data 加密数据
* @param publicKey 公钥
* @param sign 数字签名
* @return 校验成功返回true 失败返回false
* @throws Exception
*/
public static boolean verify(byte[] data, PublicKey publicKey, String sign) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(decryptBASE64(sign));
} /**
* 私钥解密
*
* @param data 密文
* @param PrivateKey 私钥
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
} /**
* 用公钥解密
*
* @param data 密文
* @param publicKey 公钥
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, PublicKey publicKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
} /**
* 用公钥加密
*
* @param data 明文
* @param PublicKey 公钥
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, PublicKey publicKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
} /**
* 用私钥加密
*
* @param data 明文
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
} public static PrivateKey getPrivateKeyFromPem() throws Exception {
BufferedReader br = new BufferedReader(new FileReader("e:/pkcs8_privatekey.pem"));
String s = br.readLine();
String str = "";
s = br.readLine();
while (s.charAt() != '-') {
str += s + "\r";
s = br.readLine();
}
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] b = base64decoder.decodeBuffer(str); // 生成私匙
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);
PrivateKey privateKey = kf.generatePrivate(keySpec);
return privateKey;
} public static PublicKey getPublicKeyFromPem() throws Exception {
BufferedReader br = new BufferedReader(new FileReader("e:/publickey.pem"));
String s = br.readLine();
String str = "";
s = br.readLine();
while (s.charAt() != '-') {
str += s + "\r";
s = br.readLine();
}
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] b = base64decoder.decodeBuffer(str);
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
PublicKey pubKey = kf.generatePublic(keySpec);
return pubKey;
} public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
} public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
} public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data); return md5.digest(); } public static byte[] encryptSHA(byte[] data) throws Exception { MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data); return sha.digest(); }
}

最新文章

  1. C++ 系列:多线程编程基础知识
  2. PHP面向对象中的重要知识点(二)
  3. Java如何将html转以后的字符转化成正常显示的字符
  4. The Cow Lineup_找规律
  5. android中“下次不再提示”的对话框(修改自某大神)
  6. 翻译:深入 AngularUI Router
  7. [Java] SSH框架笔记_Struts2配置问题
  8. Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境
  9. Oracle存储过程和函数使用方法
  10. uniq 命令详解
  11. 公司外网测试服务器 redis 被攻击复盘
  12. Java作业十(2017-11-8)
  13. 020、搭建本地Registry(2019-01-11 周五)
  14. 【Spark深入学习 -16】官网学习SparkSQL
  15. Action属性接收参数
  16. Benchmark简介
  17. [翻译] M13BadgeView
  18. JavaScript高级 面向对象(7)--深拷贝与浅拷贝
  19. 128th LeetCode Weekly Contest Pairs of Songs With Total Durations Divisible by 60
  20. 插入mysql语句报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

热门文章

  1. jQuery插件开发入门
  2. 基于VMware的eCos应用程序测试(hello wold)
  3. Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)
  4. wine下汉字方块解决
  5. c++基础五个题(一)
  6. information_schema.key_column_usage 学习
  7. Linux下find与grep指令的相关用法
  8. OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
  9. ffmpeg参数解释 <第三篇>
  10. Mysql.Data的连接驱动 .net 的源码竟然在git了