博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现 数字签名
阅读量:7029 次
发布时间:2019-06-28

本文共 2951 字,大约阅读时间需要 9 分钟。

hot3.png

  1.   生成 公钥 和私钥 对 

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; }}

2. 加密过程(数字签名):利用私钥对传输数据进行数据加密

public class Signaturer { /**  *   * Description:数字签名  *   * @param priKeyText  * @param plainText  * @return    */ 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; }}

3. 校验数字签名, 利用公钥和数据明文进行编码校验 ”数据字签名“的数据 Check。

public class SignProvider { private SignProvider() { } /**  *   * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空  *   * @param pubKeyText  *            公钥,base64编码  * @param plainText  *            明文  * @param signTest  *            数字签名的密文,base64编码  * @return 校验成功返回true 失败返回false    */ 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;  } }}

转载于:https://my.oschina.net/frankies/blog/342768

你可能感兴趣的文章
207. Course Schedule
查看>>
如何优化您的 Android 应用 (Go 版)
查看>>
Trie树实现
查看>>
Opencv无法调用cvCaptureFromCAM无法打开电脑自带摄像头
查看>>
Exception异常处理机制
查看>>
复杂的web---web中B/S网络架构
查看>>
编写文档的时候各种问题
查看>>
Eclipse里maven的project报Unbound classpath variable: 'M2_REPO/**/***/***.jar
查看>>
新旅程CSS 基础篇分享一
查看>>
查看内核函数调用的调试方法【原创】
查看>>
个人项目中遇到的问题
查看>>
byte与base64string的相互转化以及加密算法
查看>>
20145103 《Java程序设计》第3周学习总结
查看>>
ubuntu声音系统
查看>>
哈哈更新资源列表2
查看>>
冲刺第一周第五天
查看>>
Java 接口
查看>>
Android 微信第三方登录
查看>>
硬盘的读写原理
查看>>
实例 centos自动挂载、备份windows共享文件夹,并删除第7日前当天的备份
查看>>