1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.InputStream;
  4. import java.security.KeyFactory;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import java.security.spec.PKCS8EncodedKeySpec;
  8. import java.security.spec.X509EncodedKeySpec;
  9.  
  10. import javax.crypto.Cipher;
  11.  
  12. public class RSA{
  13.  
  14. public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
  15.  
  16. /**
  17. * RSA签名
  18. * @param content 待签名数据
  19. * @param privateKey 商户私钥
  20. * @param input_charset 编码格式
  21. * @return 签名值
  22. */
  23. public static String sign(String content, String privateKey, String input_charset)
  24. {
  25. try
  26. {
  27. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
  28. KeyFactory keyf = KeyFactory.getInstance("RSA");
  29. PrivateKey priKey = keyf.generatePrivate(priPKCS8);
  30.  
  31. java.security.Signature signature = java.security.Signature
  32. .getInstance(SIGN_ALGORITHMS);
  33.  
  34. signature.initSign(priKey);
  35. signature.update( content.getBytes(input_charset) );
  36.  
  37. byte[] signed = signature.sign();
  38.  
  39. return Base64.encode(signed);
  40. }
  41. catch (Exception e)
  42. {
  43. e.printStackTrace();
  44. }
  45.  
  46. return null;
  47. }
  48.  
  49. /**
  50. * RSA验签名检查
  51. * @param content 待签名数据
  52. * @param sign 签名值
  53. * @param ali_public_key 支付宝公钥
  54. * @param input_charset 编码格式
  55. * @return 布尔值
  56. */
  57. public static boolean verify(String content, String sign, String ali_public_key, String input_charset)
  58. {
  59. try
  60. {
  61. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  62. byte[] encodedKey = Base64.decode(ali_public_key);
  63. PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
  64.  
  65. java.security.Signature signature = java.security.Signature
  66. .getInstance(SIGN_ALGORITHMS);
  67.  
  68. signature.initVerify(pubKey);
  69. signature.update( content.getBytes(input_charset) );
  70.  
  71. boolean bverify = signature.verify( Base64.decode(sign) );
  72. return bverify;
  73.  
  74. }
  75. catch (Exception e)
  76. {
  77. e.printStackTrace();
  78. }
  79.  
  80. return false;
  81. }
  82.  
  83. /**
  84. * 解密
  85. * @param content 密文
  86. * @param private_key 商户私钥
  87. * @param input_charset 编码格式
  88. * @return 解密后的字符串
  89. */
  90. public static String decrypt(String content, String private_key, String input_charset) throws Exception {
  91. PrivateKey prikey = getPrivateKey(private_key);
  92.  
  93. Cipher cipher = Cipher.getInstance("RSA");
  94. cipher.init(Cipher.DECRYPT_MODE, prikey);
  95.  
  96. InputStream ins = new ByteArrayInputStream(Base64.decode(content));
  97. ByteArrayOutputStream writer = new ByteArrayOutputStream();
  98. //rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密
  99. byte[] buf = new byte[128];
  100. int bufl;
  101.  
  102. while ((bufl = ins.read(buf)) != -1) {
  103. byte[] block = null;
  104.  
  105. if (buf.length == bufl) {
  106. block = buf;
  107. } else {
  108. block = new byte[bufl];
  109. for (int i = 0; i < bufl; i++) {
  110. block[i] = buf[i];
  111. }
  112. }
  113.  
  114. writer.write(cipher.doFinal(block));
  115. }
  116.  
  117. return new String(writer.toByteArray(), input_charset);
  118. }
  119.  
  120. /**
  121. * 得到私钥
  122. * @param key 密钥字符串(经过base64编码)
  123. * @throws Exception
  124. */
  125. public static PrivateKey getPrivateKey(String key) throws Exception {
  126.  
  127. byte[] keyBytes;
  128.  
  129. keyBytes = Base64.decode(key);
  130.  
  131. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
  132.  
  133. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  134.  
  135. PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  136.  
  137. return privateKey;
  138. }
  139. }

  

java SHA1WithRSA 算法的更多相关文章

  1. iOS下使用SHA1WithRSA算法加签源码

    首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...

  2. 史上最全的java随机数生成算法分享(转)

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...

  3. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  4. 使用Java练习算法常用的基本操作

    一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...

  5. JAVA经典算法40题及解答

    JAVA经典算法40题 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...

  6. Java基础算法集50题

    最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...

  7. Java经典算法四十例编程详解+程序实例

    JAVA经典算法40例 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1.程 ...

  8. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  9. JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

随机推荐

  1. java知识巩固

    1.从控制台读取一个字符: public static void main(String args[]) throws java.io.IOException{ char c=(char)System ...

  2. HDFS读写数据块--${dfs.data.dir}选择策略

    最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...

  3. 用Runtime.getRuntime().exec()需要注意的地方

    有时候我们可能需要调用系统外部的某个程序,此时就可以用Runtime.getRuntime().exec()来调用,他会生成一个新的进程去运行调用的程序. 此方法返回一个java.lang.Proce ...

  4. 分析自定义view的实现过程-实现雪花飞舞效果(转载有改动)

    声明:本文源码出自实现雪花飞舞效果(有改动)主要通过这篇文来分析自定义view的实现过程. 没事时,比较喜欢上网看看一些新的东西,泡在网上的日子就是一个很不错的网站. 下面开始了,哈哈.^_^ 大家都 ...

  5. delphi Syntax check、 build、 run、 compile的区别

    delphi Syntax check. build.  run. compile的区别 Build是从新编译所有和生成exe有关的文件,无论.pas文件是否修改过,它都会重新生成新的.dcu,并从新 ...

  6. centos上libreoffice+unoconv安装步骤,实现word转pdf

    一.libreoffice安装 1.yum search  libreoffice查询一下系统自带的安装包 安装libreoffice.x86_64这个就可以了   2.yum install lib ...

  7. 数据类型int、bigint、smallint 和 tinyint范围

      bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. int ...

  8. mysql 同一IP 产生太多终端的数据库连接导致阻塞

    问题:null, message from server: "Host 'ip' is blocked because of many connection errors; unblock ...

  9. matlab初学之句柄

    文章出处:http://www.cnblogs.com/CBDoctor/archive/2012/04/06/2434072.html 在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每 ...

  10. C#与Java在继承静态类上的区别

    interface ITest { int Get(); } abstract class Test : ITest //此处会出现错误:Programe.Test不实现接口成员Program.ITe ...