import java.io.IOException;

import java.security.InvalidKeyException;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.Signature;

import java.security.SignatureException;

import java.security.spec.EncodedKeySpec;

import java.security.spec.InvalidKeySpecException;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

/**

* RSA 签名、验证、加密、解密帮助类

*

* @author sam

*

*/

public class RsaHelper

{

// 签名对象

private Signature sign;

private static final RsaHelper rsaHelper = new RsaHelper();

private String pubkey;

private String prikey;

private RsaHelper()

{

try

{

sign = Signature.getInstance("SHA1withRSA");

}

catch (NoSuchAlgorithmException nsa)

{

System.out.println("" + nsa.getMessage());

}

}

public static RsaHelper getInstance()

{

return rsaHelper;

}

private PrivateKey getPrivateKey(String privateKeyStr)

{

try

{

byte[] privateKeyBytes = b64decode(privateKeyStr);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);

return keyFactory.generatePrivate(privateKeySpec);

}

catch (InvalidKeySpecException e)

{

System.out.println("Invalid Key Specs. Not valid Key files." + e.getCause());

return null;

}

catch (NoSuchAlgorithmException e)

{

System.out.println("There is no such algorithm. Please check the JDK ver." + e.getCause());

return null;

}

}

private PublicKey getPublicKey(String publicKeyStr)

{

try

{

byte[] publicKeyBytes = b64decode(publicKeyStr);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);

return keyFactory.generatePublic(publicKeySpec);

}

catch (InvalidKeySpecException e)

{

System.out.println("Invalid Key Specs. Not valid Key files." + e.getCause());

return null;

}

catch (NoSuchAlgorithmException e)

{

System.out.println("There is no such algorithm. Please check the JDK ver." + e.getCause());

return null;

}

}

/**

* RSA 数据签名

*

* @param toBeSigned

*            (待签名的原文)

* @param priKey

*            (RSA私钥)

* @return (返回RSA签名后的数据签名数据base64编码)

*/

public String signData(String toBeSigned, String priKey)

{

try

{

PrivateKey privateKey = getPrivateKey(priKey);

byte[] signByte = toBeSigned.getBytes("utf-8");

Signature rsa = Signature.getInstance("SHA1withRSA");

rsa.initSign(privateKey);

rsa.update(signByte);

return b64encode(rsa.sign());

}

catch (NoSuchAlgorithmException ex)

{

System.out.println(ex);

}

catch (InvalidKeyException in)

{

System.out.println("Invalid Key file.Please check the key file path" + in.getCause());

}

catch (Exception se)

{

System.out.println(se);

}

return null;

}

/**

* RSA 数据签名验证

*

* @param signature

*            (RSA签名数据(base64编码)

* @param data

*            (待验证的数据原文)

* @param pubKey

*            (RSA公钥数据)

* @return 返回验证结果(TRUE:验证成功;FALSE:验证失败)

*/

public boolean verifySignature(String signature, String data, String pubKey)

{

try

{

byte[] signByte = b64decode(signature);

byte[] dataByte = data.getBytes("utf-8");

PublicKey publicKey = getPublicKey(pubKey);

sign.initVerify(publicKey);

sign.update(dataByte);

return sign.verify(signByte);

}

catch (SignatureException e)

{

e.printStackTrace();

}

catch (Exception e)

{

e.printStackTrace();

}

return false;

}

/**

* base64编码

*

* @param data

* @return

*/

private String b64encode(byte[] data)

{

return new BASE64Encoder().encode(data);

}

/**

* base64解码

*

* @param data

* @return

*/

private byte[] b64decode(String data)

{

try

{

return new BASE64Decoder().decodeBuffer(data);

}

catch (Exception ex)

{

}

return null;

}

/**

* RSA数据加密

*

* @param data

*            (需要加密的数据)

* @param pubKey

*            (RSA公钥)

* @return 返回加密后的密文(BASE64编码)

*/

public String encryptData(String data, String pubKey)

{

try

{

byte[] dataByte = data.getBytes("utf-8");

PublicKey publicKey = getPublicKey(pubKey);

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

return b64encode(cipher.doFinal(dataByte));

}

catch (Exception e)

{

return null;

}

}

/**

* RSA数据解密

*

* @param encryptedData

*            (需要解密的数据base64编码数据)

* @param priKey

*            (RSA的私钥)

* @return 返回解密后的原始明文

*/

public String decryptData(String encryptedData, String priKey)

{

try

{

byte[] encryData = b64decode(encryptedData);

PrivateKey privateKey = getPrivateKey(priKey);

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return new String(cipher.doFinal(encryData), "utf-8");

}

catch (Exception e)

{

return null;

}

}

/**

* 得到私钥字符串(经过base64编码)

*

* @return

*/

public static String getPriKeyString(PrivateKey key) throws Exception

{

byte[] keyBytes = key.getEncoded();

String s = (new BASE64Encoder()).encode(keyBytes);

return s;

}

/**

* 得到公钥字符串(经过base64编码)

*

* @return

*/

public static String getPubKeyString(PublicKey key) throws Exception

{

byte[] keyBytes = key.getEncoded();

String s = (new BASE64Encoder()).encode(keyBytes);

return s;

}

/**

* 生成密钥 自动产生RSA1024位密钥

*

* @throws NoSuchAlgorithmException

* @throws IOException

*/

public void getAutoCreateRSA() throws NoSuchAlgorithmException, IOException

{

try

{

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

kpg.initialize(1024);

KeyPair kp = kpg.genKeyPair();

PublicKey puk = kp.getPublic();

PrivateKey prk = kp.getPrivate();

pubkey = getPubKeyString(puk);

prikey = getPriKeyString(prk);

System.out.print("pubkey==:"+pubkey.replaceAll("\r", "").replaceAll("\n", ""));

System.out.print("prikey==:"+prikey.replaceAll("\r", "").replaceAll("\n", ""));

}

catch (Exception e)

{

e.printStackTrace();

}

}

public String getPubkey()

{

return pubkey;

}

public void setPubkey(String pubkey)

{

this.pubkey = pubkey;

}

public String getPrikey()

{

return prikey;

}

public void setPrikey(String prikey)

{

this.prikey = prikey;

}

}

RSA 签名、验证、加密、解密帮助类的更多相关文章

  1. php加密解密功能类

    这两天突发奇想想要用php写一个对日常项目加密以及解密的功能,经过努力简单的封装了一个对php代码进行加密解密的类,一些思想也是来自于网络,初步测试用着还行,可以实现对指定项目的加密以及解密(只针对本 ...

  2. C# MD5加密解密帮助类

    /// <summary>    /// MD5加密解密帮助类    /// </summary>    public static class DESHelper    {  ...

  3. php加密解密处理类

    [PHP]代码 <?php /*=========================================================== = 版权协议: = GPL (The GN ...

  4. AES加密解密 助手类 CBC加密模式

    "; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...

  5. .Net(c#)加密解密工具类:

    /// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...

  6. Base64加密解密工具类

    使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...

  7. ios RSA 验签加密解密

    关于公钥和私钥的生成,网上有很多本地生产的方法,我遇到的问题是,按照网上生产的方式生成7个文件,本地使用没有问题,但是和后台交互就不行了. 发现生成公钥和私钥的没有那么麻烦,使用在线生产工具就能使用, ...

  8. C#工具:加密解密帮助类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; //加密字符串,注意strE ...

  9. java使用RSA与AES加密解密

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...

  10. PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密

    目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...

随机推荐

  1. 18.centos7基础学习与积累-004-分区理论

    1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 1.常规分区:数据不是特别重要的业务(集群的某个节点) /boot  引导分区 ...

  2. Java 返回字符串中第一个不重复字符的下标 下标从0开始

    比如abcdefgabdef 其中字符c和g不重复,返回c的小标,下标从0开始,那么是2 package com.example.demo; import org.testng.annotations ...

  3. Linux必知必会--curl

    你有多自律,你就能走多远~ --久节奏.慢读书 Curl命令 学习每个linux命令都该掌握man命令.(可以使用man命令去查看每个命令的使用说明) curl命令是一个利用URL规则在命令行下工作的 ...

  4. admin端的教师管理功能测试

    1  概述 1.1   测试范围 本次所测试的内容是admin端的教师管理功能. 1.2   测试方法 采用黑盒子方法进行集成测试. 1.3   测试环境 (1)   服务器l  操作系统:Windo ...

  5. KClass与函数引用详解

    继续学习Kotlin反射相关的东东. KClass: 在上一次是通过类来获取它的KClass对象: 那如果是一个对象呢?与这个对象对应的类的KClass对象又是如何获取的呢?像Java也是一样有相关机 ...

  6. Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)

    传送门 题目 \[ \begin{aligned} &f_n=c^{2*n-6}f_{n-1}f_{n-2}f_{n-3}&\\ \end{aligned} \] 思路 我们通过迭代发 ...

  7. Please umount the filesystem and rectify the problem(s)

    1.输入命令:ls -l /dev/mapper 2.再输入:xfs_repair /dev/dm-0 3.输入命令:xfs_repair -L /dev/dm-0 4.最后进行重启:init 6 等 ...

  8. 史上最完整promise源码手写实现

    史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺 ...

  9. 《基于 UML 的教务系统设计方法研究》论文笔记(十五)

    标题:基于 UML 的教务系统设计方法研究 时间:2009 来源:太原师范学院 关键词:UML:面向对象:建模:教务管理系统. 二.研究内容 UML 建模 UML 涵盖了面向对象的分析.设计和实现,融 ...

  10. django 进行语言的国际化及在后台进行中英文切换

    项目的部署地为: 中国大陆与美国东海岸, 两个地区的服务器数据不进行同步, 中国地区的服务器页面展示中文, 美国地区的服务器页面展示成英文, 项目后台使用python编程语言进行开发, 并结合djan ...