java中的使用RSA算法进行公钥加密私钥解密

来源:互联网 发布:数据库模型设计 编辑:程序博客网 时间:2024/05/18 02:21

 一个比较简单的实现:一个三个类KeyGenerater生成公钥私钥对,Signaturer类使用私钥签名,SignProvider用公钥验证。公钥和私钥使用Base64加密Base64这个类也在博客里面

public class KeyGenerater {
 private byte[] priKey;
 private byte[] pubKey;

 public void generater() {
  try {
   java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
     .getInstance("RSA");
   SecureRandom secrand = new SecureRandom();
   secrand.setSeed("syj".getBytes()); // 初始化随机产生器
   keygen.initialize(1024, secrand);
   KeyPair keys = keygen.genKeyPair();

   PublicKey pubkey = keys.getPublic();
   PrivateKey prikey = keys.getPrivate();

   pubKey = Base64.encodeToByte(pubkey.getEncoded());
   priKey = Base64.encodeToByte(prikey.getEncoded());

   System.out.println("pubKey = " + new String(pubKey));
   System.out.println("priKey = " + new String(priKey));
  } catch (java.lang.Exception e) {
   System.out.println("生成密钥对失败");
   e.printStackTrace();
  }
 }

 public byte[] getPriKey() {
  return priKey;
 }

 public byte[] getPubKey() {
  return pubKey;
 }
}

 

public class Signaturer {
 /**
  *
  * Description:数字签名
  *
  * @param priKeyText
  * @param plainText
  * @return
  * @author 孙钰佳
  * @since:2007-12-27 上午10:51:48
  */
 public static byte[] sign(byte[] priKeyText, String plainText) {
  try {
   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64
     .decode(priKeyText));
   KeyFactory keyf = KeyFactory.getInstance("RSA");
   PrivateKey prikey = keyf.generatePrivate(priPKCS8);

   // 用私钥对信息生成数字签名
   java.security.Signature signet = java.security.Signature
     .getInstance("MD5withRSA");
   signet.initSign(prikey);
   signet.update(plainText.getBytes());
   byte[] signed = Base64.encodeToByte(signet.sign());
   return signed;
  } catch (java.lang.Exception e) {
   System.out.println("签名失败");
   e.printStackTrace();
  }
  return null;
 }
}

public class SignProvider {
 private SignProvider() {

 }

 /**
  *
  * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空
  *
  * @param pubKeyText
  *            公钥,base64编码
  * @param plainText
  *            明文
  * @param signTest
  *            数字签名的密文,base64编码
  * @return 校验成功返回true 失败返回false
  * @author 孙钰佳
  * @since:2007-12-27 上午09:33:55
  */
 public static boolean verify(byte[] pubKeyText, String plainText,
   byte[] signText) {
  try {
   // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
   java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
     Base64.decode(pubKeyText));
   // RSA对称加密算法
   java.security.KeyFactory keyFactory = java.security.KeyFactory
     .getInstance("RSA");
   // 取公钥匙对象
   java.security.PublicKey pubKey = keyFactory
     .generatePublic(bobPubKeySpec);
   // 解密由base64编码的数字签名
   byte[] signed = Base64.decode(signText);
   java.security.Signature signatureChecker = java.security.Signature
     .getInstance("MD5withRSA");
   signatureChecker.initVerify(pubKey);
   signatureChecker.update(plainText.getBytes());
   // 验证签名是否正常
   if (signatureChecker.verify(signed))
    return true;
   else
    return false;
  } catch (Throwable e) {
   System.out.println("校验签名失败");
   e.printStackTrace();
   return false;
  }
 }
}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 vivo手机突然开不了机怎么办 苹果六关不了机怎么办 微信老是无响应怎么办 打游戏被骂了怎么办 微信运动跳转排行榜失败怎么办 小恩爱账号忘了怎么办 华为账号更换后游戏账号怎么办 注册游戏账号需要身份证怎么办 英雄联盟被裁决了怎么办 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办