java 实现RSA实现数据的私钥加密以及公钥解密

原创 2015年11月21日 10:32:17

1.第一个类KeyGenerate.java生成RSA公钥与私钥并保存到文件中

package signature;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;


import org.junit.Test;


import sun.misc.BASE64Encoder;


/**
 * @author numb-tangsi
 */
public class KeyGenerate {


    public static final String PUBLIC_KEY_FILE_PATH = "d:/publickey.keystore";
    
    public static final String PRIVATE_KEY_FILE_PATH = "d:/privatekey.keystore";
    

@Test
public void test1() throws NoSuchAlgorithmException, IOException {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
generator.initialize(1024, random);
KeyPair keyPair = generator.generateKeyPair();
PrivateKey privateKey =  keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//将生成的私钥及公钥base64编码
String privateKeyStr = new BASE64Encoder().encode(privateKey.getEncoded());
String publicKeyStr = new BASE64Encoder().encode(publicKey.getEncoded());

System.out.println("privateKeyStr = " + privateKeyStr);
System.out.println("publicKeyStr = " + publicKeyStr);

//将公钥以及私钥写入文件保存
File privateFile = new File(PRIVATE_KEY_FILE_PATH);
writeStr2File(privateFile, privateKeyStr);

File publicFile = new File(PUBLIC_KEY_FILE_PATH);
writeStr2File(publicFile, publicKeyStr);

}

public  static void writeStr2File(File file, String content) throws IOException
{
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(content);
writer.flush();
writer.close();
}


}



2.第二个类 SignatureData.java将元数据用私钥生成签名

package signature;


import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;


import org.junit.Test;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


/**
 * @author numb-tangsi
 */
public class SignatureData {


/**
* 私钥加密
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws SignatureException
*/
@Test
public void test1() throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException, InvalidKeyException, SignatureException {


//base64后的私钥串,这个串实际上应该从上一步的私钥文件privatekey.keystore中读取
String privateKeyStr = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKmtw5lgEY0BRYEs9VNuoXIDjRo/"
+ "T5TqWrNJY7tIiObVtgS0+dTx2kaZIL2TuOe+naDSyzlVlqYlzOx0UpID9sD3Pmr8NR5y0Xxu+IDM"
+ "Yo0HO0H2Xl7E9FLyOUCL0uurLgNx14Fl9iDBu4JWY42h0eEuYVsGuOye3YOBdMlaCKuDAgMBAAEC"
+ "gYEAmXdTYUaVuS38OlB6dwKpvOBfX+0BQpQQgvYO4RZC1F1Y6rrw99vja1UWWsDgTaKHGS1up6W0"
+ "wwOPbBHtmKlDJF20DZdvWSGLcyuhX779W1s+NMFC9fn1KP6MAqEYfYcY5rClQX2Zi+/NvrvUjIqq"
+ "MyQjZncs+FW8tlD6XhbsHPkCQQDSVP3IbrsWs7pFkTcB3ATC32pAB71Bnn/rEJM66UE1gw1Sw81F"
+ "ZR+fKRcV4eds4RXRvCr3rlRUDZyZOlqYEMHvAkEAzoUetHoeepm7eukr+xcvu3Yu7fHiTggIijFf"
+ "2kgwnRak8APA5hAmLj9HWeeGajBY3h4pFweFoJ5vARE9OB0zrQJBALKDri2aRbHb8uGugThTy7q1"
+ "slEMAIYcB0ez9rHOXSkUxI8VXjhivnbwggZxiGDxnPo4sWMsE6iPMPUgANoFhwMCQQCqpZLmnFXd"
+ "BnTFLjDaTKFzbEeA9DMEOV0dG4lRq/8HfrORY/ib4dI6uqzxm/8UdZipCRD4541CWEfvANiuKmsN"
+ "AkAmPXJN+idylhtk2sh8pJbYWozKBGZOslaejpCLFGaDSuUFMS+DxuMl0rAGb2kbhkZybxEc4xjr"
+ "P9fm1ywStLgq";
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(
new BASE64Decoder().decodeBuffer(privateKeyStr));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(encodedKeySpec);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(privateKey);

String toBeSignedData = "tangsi"; //需要生产签名的元数据
signature.update(toBeSignedData.getBytes("utf-8"));
byte[] signedData = signature.sign();
String sign = new BASE64Encoder().encode(signedData);
System.out.println("元数据生成的签名: " + sign);


}


}



3.第三个类VerifyData.java实现用公钥来对第二个类生成的签名对元数据进行验签

package signature;


import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;


import org.junit.Test;


import sun.misc.BASE64Decoder;




/**
 * @author numb-tangsi
 */
public class VerifyData {


/**
* 公钥解密

* @throws IOException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws SignatureException
*/
@Test
public void test1() throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException, InvalidKeyException, SignatureException {
// base64后的公钥串,这个串实际上应该从上一步的公钥文件publickey.keystore中读取
String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCprcOZYBGNAUWBLPVTbqFyA40aP0+U6lqzSWO7"
+ "SIjm1bYEtPnU8dpGmSC9k7jnvp2g0ss5VZamJczsdFKSA/bA9z5q/DUectF8bviAzGKNBztB9l5e"
+ "xPRS8jlAi9Lrqy4DcdeBZfYgwbuCVmONodHhLmFbBrjsnt2DgXTJWgirgwIDAQAB";
X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(
new BASE64Decoder().decodeBuffer(publicKeyStr));
KeyFactory keFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keFactory.generatePublic(encodedKeySpec);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initVerify(publicKey);// 初始化公钥
String toBeVerifyData = "tangsi"; // 待验签的数据
signature.update(toBeVerifyData.getBytes("utf-8"));
String sign = "Maz4PvoJtJBf/jWWoROy56Tc9zz+ok/2BoMDY+yBtL2EclEsWp3DsW9rCUHoAevrI/zF2nNt/XfA"
+ "x1hTvm63c401Wh/gvL4/bNXQAfyxT/WvRMIMprmlRY3Opbq/0TBT+eCdggZwok3VMOje4cgUV1sr"
+ "ixFT63xCfSmDc0OrN2M=";
boolean verify = signature.verify(new BASE64Decoder()
.decodeBuffer(sign)); // 用签名来验证待验证数据的合法性,如果待验签的数据被修改过则会验证失败
System.out.println(verify);


}
}

关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解

在项目中遇到的问题百度了许久总结出来的 私钥加密公钥解密和公钥加密私钥解密。 一般为了安全采用的是私钥加密,公钥解密(公钥可以用Base64转换后公开) package com.paic.eban...
  • df331009
  • df331009
  • 2016年04月19日 17:14
  • 4019

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

 一个比较简单的实现:一个三个类KeyGenerater生成公钥私钥对,Signaturer类使用私钥签名,SignProvider用公钥验证。公钥和私钥使用Base64加密Base64这个类也在博客...
  • sunyujia
  • sunyujia
  • 2008年01月01日 23:19
  • 26478

Java中使用OpenSSL生成的RSA公私钥进行数据加解密

本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在...
  • chaijunkun
  • chaijunkun
  • 2012年02月20日 16:09
  • 94075

2.Java安全之公钥与私钥-非对称加密

公钥与私钥机制属于非对称加密的范畴,非对称是相对于对称加密而言的,对称加密用于加密与解密的密钥是同一把,而非对称加密则用于加密与解密的密钥不相同,一个公开,称为公钥;一个保密,称为私钥,公钥与私钥必须...
  • jingqiang521
  • jingqiang521
  • 2015年09月28日 15:14
  • 986

java实现字符串非对称加密(私钥加密,公钥解密并对比)

/** * @author cyw  创建日期: 2010-11-25 */package com.bean;import java.security.InvalidKeyException;impo...
  • cyw8998
  • cyw8998
  • 2010年11月26日 09:00
  • 3307

java中RSA加解密的实现

关于加密数据长度和解密数据长度大家可以看一下我前一篇文章内的介绍: 关于RSA算法密钥长度/密文长度/明文长度的介绍   public static void main(String[] arg...
  • centralperk
  • centralperk
  • 2013年01月31日 10:46
  • 123822

RSA基于Java Web的前台公钥加密后台私钥解密

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密...
  • kerryzb
  • kerryzb
  • 2016年05月26日 12:25
  • 5114

Java使用RSA加密解密签名及校验

由于项目要用到非对称加密解密签名校验什么的,于是参考《Java加密解密的艺术》写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享!RSA加密解密类:package com.ihep; ...
  • wangqiuyun
  • wangqiuyun
  • 2014年12月25日 11:37
  • 114176

公钥加密,私钥解密示例程序(JAVA)

最近再研究JAVA安全方面的东西,总结一下,大家有用到的可以参考下。         1.证书生成                 前提:JDK已安装且正确配置环境变量         首先在C...
  • sunguangran
  • sunguangran
  • 2011年09月02日 10:59
  • 4157

Java加密算法-公钥加密私钥解密

  • 2009年02月17日 20:30
  • 9KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 实现RSA实现数据的私钥加密以及公钥解密
举报原因:
原因补充:

(最多只允许输入30个字)