精华内容
下载资源
问答
  • JAVA RSA

    千次阅读 2019-04-02 16:42:23
    java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217) at java.security...

     

    java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
    	at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
    	at com.xxx.Util.RsaUtil.decrypt(RsaUtil.java:146)
    	at com.xxx.Util.RsaUtil.test3(RsaUtil.java:50)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    Caused by: java.security.InvalidKeyException: invalid key format
    	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:331)
    	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:357)
    	at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91)
    	at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
    	at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
    	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)
    	... 25 more

    原因: key格式错误

    解决:在读取时去掉开头为"-"的行

    即去掉:

    -----BEGIN PRIVATE KEY-----
    -----END PRIVATE KEY-----
    
    java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
    	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
    	at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
    	at com.xxx.Util.RsaUtil.decrypt(RsaUtil.java:146)
    	at com.xxx.Util.RsaUtil.test3(RsaUtil.java:50)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
    	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:352)
    	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:357)
    	at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91)
    	at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
    	at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
    	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)
    	... 25 more

    原因:rsa私钥的格式不是pkcs8格式

    解决:执行

    openssl pkcs8 -topk8 -inform PEM -in 源文件 -outform pem -nocrypt -out 目标文件
    //例:
    openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem

    后,从原来的

    -----BEGIN RSA PRIVATE KEY-----
    -----END RSA PRIVATE KEY-----
    

    -----BEGIN PRIVATE KEY-----
    -----END PRIVATE KEY-----
    

    内容也有变化

    展开全文
  • JAVA RSA 加密算法 RSA.java RSA公钥加解密,RSA私钥加解密,MD5withRSA 签名 MD5withRSA签名较验
  • java RSA加密解密

    2017-04-10 11:50:30
    java RSA加密解密
  • Java RSA 加密解密

    2017-11-18 16:31:49
    Java RSA 加密 解密 完整代码 适合 字符 及文件加解密
  • Java RSA算法

    2015-07-08 11:54:18
    Java RSA算法加密解密,用JAVA编写的RSA.其中包括利用私钥进行解密,利用公钥进行加密,生成密钥对,以及测试数据。
  • java RSA加密 解密

    2014-04-25 14:34:56
    java RSA加密解密
  • JavaRSA加密签名

    2018-01-23 09:58:46
    实现Java RSA加密及签名的,作为博文的Dome存在,代码很简单,但是分设置较高,主要是希望大家能自己去写,而不是直接下载Demo使用,博文:http://blog.csdn.net/MicrosoftDesigner/article/details/79133359
  • Js Java Rsa 加密解密

    2018-02-01 12:19:34
    Js Java Rsa 加密解密,具体用法请看blog,里面包含js库,java jar包,和一个别人写的可以完成加密解密的demo
  • Java RSA 加密/解密/签名 工具类 Java RSA 加密/解密/签名 工具类 Java RSA 加密/解密/签名 工具类
  • Java RSA私钥 pkcs1转pkcs8;适用于Java与C#程序交互时使用
  • 完整的实现java rsa密匙格式 转c#格式,实现真正的 java rsa加密与.net 互通,目前已在公司APP项目中使用。
  • javaRSA加密C++RSA解密

    2017-11-28 16:32:04
    Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍 项目: JAVA生成的RSA的密文,通过C++来解密。 RSA这里就不多介绍了大家自己去看。 JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的...
  • C# JavaRSA加密解密的交互 JAVA产生秘钥 C#加密
  • Java RSA 数据加密组件

    2012-04-26 09:19:35
    提供了工业化强度的Java RSA数据加密组件包的设计,并提供了源代码。 -- RSACoder.java:主类,提供了数据加密、解密、签名、签名验证、密钥对生成、密钥对保存和密钥对加载等API; -- RSACoderTestCase.java:JUnit...
  • 主要介绍了Java RSA加密解密实现方法,结合实例形式分析了java基于第三方类库javabase64-1.3.1.jar实现RSA加密解密功能的具体步骤与相关操作技巧,需要的朋友可以参考下
  • Java RSA数据加密组件

    2012-04-26 09:15:09
    提供了一个完全可用的,工业化强度的Java RSA数据加密组件设计,并提供了源代码。 -- RSACoder.java:主类,提供了加密解密、数字签名、数字签名验证、密钥对生成、密钥对保存、密钥对加载等API,可方便地调用。 --...
  • 完全可用的Java RSA数据加密组件包,提供了源代码
  • Android RSA算法与Java RSA算法不同标准

    千次阅读 2016-03-04 16:48:23
    开始在网上找到一份很普通的Java RSA加密算法,直接引入到项目中发现在客户端(Android)加密后,在服务器端(Java)解不开;但是在客户端单独加解密并没有问题,在服务端单独加解密也是没有问题的。最后在网上查找...

    最近项目中遇到了RSA数据加密的问题。客户端为Android App,服务端使用Java开发。

    开始在网上找到一份很普通的Java RSA加密算法,直接引入到项目中发现在客户端(Android)加密后,在服务器端(Java)解不开;但是在客户端单独加解密并没有问题,在服务端单独加解密也是没有问题的。

    最后在网上查找才发现,是由于Android RSA与Java RSA标准并不完全一样,主要问题在与以下代码段:
    这里写图片描述

    Cipher.getInstance(param);
    1.在Java 中使用时,param:“RSA”;
    2.在Android中使用时,param:”RSA/ECB/PKCS1Padding”;

    另外,需要注意的是:经过RSA加密后的字符串中会有一些特殊字符,在网络传输时,会发生变化,导致解密失败。因此,在传输之前需要双方约定,对特殊字符进行处理。

    展开全文
  • JAVA RSA 加密解密、签名验签 详解 JAVA RSA 加密使用的库是Cipher 和DES一样,更改一下算法就可以了 可以参考:https://blog.csdn.net/qq_21271511/article/details/110529177 javax.crypto.Cipher 是java原生的...

    JAVA RSA 加密解密、签名验签 详解

    JAVA RSA 加密使用的库是Cipher 和DES一样,更改一下算法就可以了
    可以参考:https://blog.csdn.net/qq_21271511/article/details/110529177

    javax.crypto.Cipher 是java原生的类库,用来做加密解密的。

    官网描述
    https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html#method.detail/

    此类提供用于加密和解密的密码算法的功能。它构成了Java加密扩展(JCE)框架的核心。

    RSA加密解密

    因为过程和DES差不多,这里就直接贴代码了,KeyPair 可以直接查一下api就好。

    /**
     * @ClassName: RSAUtil
     * @Description: RSA加密解密,加签解签工具类
     * @author 忙碌的菠萝
     * @date 2020年11月27日 下午1:19:55
     *
     */
    public class RSAUtil {
    
    /* 
    	 * 常见异常对照 
    	 * NoSuchAlgorithmException 无此算法,一般是环境问题,编译环境或者运行环境
    	 * InvalidKeyException 秘钥非法,秘钥数据或者格式有问题,---begin--- 这种不需要
    	 * IllegalBlockSizeException 明文长度非法,秘钥大小决定了可加密明文的长度,长度不符合会报出该异常
    	 * BadPaddingException,NoSuchPaddingException 明文数据非法
    	 * UnsupportedEncodingException 不支持的编码方式
    	 * */
    
    /**
    	 * @Fields RSA : RSA算法
    	 */
    	public static final String RSA = "RSA";
    	/**
    	 * @Fields SIGN_ALGORITHMS : 签名算法类型
    	 */
    	public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
    
    	/**
    	 * @Fields KEY_SIZE : 密钥长度 于原文长度对应 以及越长速度越慢
    	 */
    	public static final int KEY_SIZE = 1024;
    
    	/**
    	 * @Fields keyMap : 随机产生的公钥与私钥 0-公钥 1-私钥
    	 */
    	public static Map<Integer, String> keyMap = new HashMap<Integer, String>();
    
    	/**
    	 * @Title: genKeyPair
    	 * @Description: Generator KeyPair
    	 * @param getPrivate() 得到私钥 getPublic() 得到公钥
    	 * @return KeyPair
    	 * @throws NoSuchAlgorithmException 无此算法
    	 */
    	public static KeyPair genKeyPair() throws NoSuchAlgorithmException {
    		// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
    		KeyPairGenerator keyPairGen = null;
    		keyPairGen = KeyPairGenerator.getInstance(RSA);
    		// 初始化密钥对生成器,密钥大小为96-1024位
    		keyPairGen.initialize(KEY_SIZE, new SecureRandom());
    		// 生成一个密钥对,保存在keyPair中
    		KeyPair keyPair = keyPairGen.generateKeyPair();
    		return keyPair;
    	}
    
    	/**
    	 * @Title: GeneratorKey
    	 * @Description: 随机生成密钥对
    	 * @param
    	 * @return Map<Integer, String> keyMap 秘钥对 0-公钥 1-私钥
    	 * @throws Exception
    	 */
    	public static void GeneratorKey() throws Exception {
    		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);
    		keyPairGen.initialize(KEY_SIZE, new SecureRandom());
    		KeyPair keyPair = keyPairGen.generateKeyPair();
    		// 生成秘钥对
    		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
    		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
    		// base64转码
    		String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
    		String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
    		keyMap.put(0, publicKeyString); // 0表示公钥
    		keyMap.put(1, privateKeyString); // 1表示私钥
    	}
    
    /**
    	 * @Title: encrypt 
    	 * @Description: RSA公钥加密 
    	 * @param encryptData 待加密数据
    	 * @param publicKey base64编码的公钥 
    	 * @return String 加密后的数据 
    	 * @throws
    	 */
    	public static String encrypt(String encryptData, String publicKey) throws Exception {
    		try {
    			// base64编码的公钥,需要先decode
    			byte[] decoded = Base64.decodeBase64(publicKey);
    			RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(RSA)
    					.generatePublic(new X509EncodedKeySpec(decoded));
    			// RSA加密
    			Cipher cipher = Cipher.getInstance(RSA);
    			cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    			String outStr = Base64.encodeBase64String(cipher.doFinal(encryptData.getBytes("UTF-8")));
    			return outStr;
    		} catch (NoSuchAlgorithmException e) {
    			throw new NoSuchAlgorithmException("无此加密算法,请检查环境");
    		} catch (NoSuchPaddingException e) {
    			throw new NoSuchPaddingException("明文数据未找到");
    		} catch (InvalidKeyException e) {
    			throw new InvalidKeyException("加密秘钥非法,请检查");
    		} catch (IllegalBlockSizeException e) {
    			throw new IllegalBlockSizeException("明文长度非法");
    		} catch (BadPaddingException e) {
    			throw new BadPaddingException("明文数据已损坏");
    		} catch (Exception e) {
    			e.printStackTrace();
    			throw new Exception("其他错误:", e);
    		}
    	}
    
     /**
    	* @Title: decrypt
    	* @Description: RSA私钥解密
    	* @param privateKey base64编码的私钥
    	* @return String
    	* @throws Exception 解密过程中的异常信息
    	*/
    	public static String decrypt(String decryptData, String privateKey) throws Exception {
    		// 64位解码 加密后的字符串
    		byte[] inputByte = Base64.decodeBase64(decryptData.getBytes("utf-8"));
    		byte[] decoded = Base64.decodeBase64(privateKey);
    		RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(RSA)
    				.generatePrivate(new PKCS8EncodedKeySpec(decoded));
    		Cipher cipher = Cipher.getInstance(RSA);
    		cipher.init(Cipher.DECRYPT_MODE, priKey);
    	
    		String decryptStr = new String(cipher.doFinal(inputByte));
    		return decryptStr;
    	}
    

    RSA签名验签

    RSA签名验签使用的是 java.security.Signature类

    可参考:
    https://docs.oracle.com/javase/8/docs/api/java/security/Signature.html

    过程也是:获得秘钥 -> getInstance获得实例 -> initSign初始化 -> update数据 -> sign签名

    /**
    	* @Title: sign
    	* @Description: RSA签名
    	* @param signData 待签名数据
    	* @param privateKey 私钥字符串
    	* @return String 签名域
    	* @throws
    	*/
    	public static String sign(String content, String privateKey) throws Exception {
    		PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(BASE64.decode(privateKey));
    		KeyFactory keyf = KeyFactory.getInstance(RSA);
    		PrivateKey priKey = keyf.generatePrivate(priPKCS8);
    		java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
    		signature.initSign(priKey);
    		signature.update(content.getBytes());
    		byte[] signed = signature.sign();
    		return BASE64.encode(signed);
    	}
    
    /**
    	* @Title: verify
    	* @Description: RSA验签名检查
    	* @param content   待签名数据
    	* @param sign      签名域
    	* @param publicKey base64后的公钥字符串
    	* @return boolean 验签结果
    	* @throws
    	*/
    	public static boolean verify(String content, String sign, String publicKey) throws Exception {
    		KeyFactory keyFactory = KeyFactory.getInstance(RSA);
    		byte[] encodedKey = BASE64.decode(publicKey);
    		if (encodedKey == null) {
    			return false;
    		}
    		PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
    		// 用私钥对信息生成数字签名
    		java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
    		signature.initVerify(pubKey);
    		signature.update(content.getBytes());
    		// 验证方法 返回true则为比对成功
    		boolean bverify = signature.verify(BASE64.decode(sign));
    		return bverify;
    	}
    
    展开全文
  • java RSA加密

    2016-11-24 16:33:24
    公司最近在用RSA加密,所以写了个demo 给大家分享一下, 麻烦大家好评哦! -------赠人玫瑰,手有余香。
  • java rsa非对称加密算法3个实例源代码
  • 简单安全 带有 java rsa 、 des 、 md5 算法的简单项目。
  • javaRSA 加解密实现

    2009-05-31 00:17:59
    java rsa 加解密 包含界面,随机生成密钥
  • java非对称加密RSA的工具类及其源代码
  • 问题1: javaRsa 会生成一个公钥 和密钥,那么我如果作为接口提供方,我是把两个:密药都 给客户还是? 我觉得是两个都给,一个用来签名,一个人用来解密和加密 问题2:当客户发来签名 ! 由我验签的时候,要用公钥...
  • java RSA生成明文公钥私钥,对文件进行加密解密 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

    java RSA生成明文公钥私钥,对文件进行加密解密

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.math.BigInteger;
    import java.security.GeneralSecurityException;
    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.RSAPrivateKeySpec;
    import java.security.spec.RSAPublicKeySpec;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    public class Test {
    	//RSA算法对文件加密
    	public void encryptByRSA(String fileName, String saveFileName, String keyFileName) throws Exception {
    		long start = System.currentTimeMillis();
    		try {
    			KeyGenerator keygen = KeyGenerator.getInstance("AES");
    			SecureRandom random = new SecureRandom();
    			keygen.init(random);
    			SecretKey key = keygen.generateKey();
    			String[] result = readKeyUtil(new File(keyFileName));
    			RSAPublicKey key2 = getPublicKey(result[0],result[1]);
    			Cipher cipher = Cipher.getInstance("RSA");
    			cipher.init(Cipher.WRAP_MODE, key2);
    			byte[] wrappedKey = cipher.wrap(key);
    			DataOutputStream out = new DataOutputStream(new FileOutputStream(saveFileName));
    			out.writeInt(wrappedKey.length);
    			out.write(wrappedKey);
    			InputStream in = new FileInputStream(fileName);
    			cipher = Cipher.getInstance("AES");
    			cipher.init(Cipher.ENCRYPT_MODE, key);
    			crypt(in, out, cipher);
    			in.close();
    			out.close();
    		} catch (GeneralSecurityException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		long end = System.currentTimeMillis();
    		System.out.println("总共耗时:"+(end-start));
    	}
    	//RSA算法对文件解密
    	public void decryptByRSA(String fileName, String saveFileName, String keyFileName) throws Exception {
    		try {
    			DataInputStream in = new DataInputStream(new FileInputStream(fileName));
    			int length = in.readInt();
    			byte[] wrappedKey = new byte[length];
    			in.read(wrappedKey, 0, length);
    			String[] result = readKeyUtil(new File(keyFileName));
    			RSAPrivateKey key2 = getPrivateKey(result[0],result[1]);
    		
    		Cipher cipher = Cipher.getInstance("RSA");
    		cipher.init(Cipher.UNWRAP_MODE, key2);
    		Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
    		
    		OutputStream out = new FileOutputStream(saveFileName);
    		cipher = Cipher.getInstance("AES");
    		cipher.init(Cipher.DECRYPT_MODE, key);
    		
    		crypt(in, out, cipher);
    		in.close();
    		out.close();
    	} catch (GeneralSecurityException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    
    //对数据块加密
    public void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException, GeneralSecurityException {
    	int blockSize = cipher.getBlockSize();
    	int outputSize = cipher.getOutputSize(blockSize);
    	byte[] inBytes = new byte[blockSize];
    	byte[] outBytes = new byte[outputSize];
    	
    	int inLength = 0;
    	boolean next = true;
    	while (next) {
    		inLength = in.read(inBytes);
    		System.out.println(inLength);
    		if (inLength == blockSize) {
    			int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
    			out.write(outBytes, 0, outLength);
    		} else {
    			next = false;
    		}
    	}
    	if (inLength > 0) {
    		outBytes = cipher.doFinal(inBytes, 0, inLength);
    	} else {
    		outBytes = cipher.doFinal();
    	}
    	out.write(outBytes);
    }
    
    //生成RSA密钥对
    public void generateRSAKey(String savePath) throws Exception {
    	try {
    		KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
    		SecureRandom random = new SecureRandom();
    		keygen.initialize(RSA_KEYSIZE, random);
    		KeyPair keyPair = keygen.generateKeyPair();
    		RSAPublicKey puk=(RSAPublicKey) keyPair.getPublic();
    		createXmlFile(puk.getModulus().toString(), puk.getPublicExponent().toString(),savePath + "\\public.xml");
    		RSAPrivateKey prk=(RSAPrivateKey) keyPair.getPrivate();
    		createXmlFile(prk.getModulus().toString(), prk.getPrivateExponent().toString(),savePath + "\\private.xml");
    		/*OutputStreamWriter osw  = new OutputStreamWriter(new FileOutputStream(savePath + "\\public.xml"));
    		// 得到公钥字符串 
    		System.out.println(puk.getModulus());
    		System.out.println(puk.getPublicExponent());
    		System.out.println(prk.getModulus());
    		System.out.println(prk.getPrivateExponent());
            // 得到私钥字符串 
    		osw.write(createXmlFile(puk.getModulus().toString(), puk.getPublicExponent().toString()));
    		osw.close();
    		osw = new OutputStreamWriter(new FileOutputStream(savePath + "\\private.xml"));
    		osw.write(createXmlFile(prk.getModulus().toString(), prk.getPrivateExponent().toString()));
    		osw.close();*/
    	} catch (NoSuchAlgorithmException e) {
    		e.printStackTrace();
    	}
    }
    
       /**
      * 使用模和指数生成RSA公钥
      * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA
      * /None/NoPadding】
      * 
      * @param modulus
      *            模
      * @param exponent
      *            指数
      * @return
      */
     public static RSAPublicKey getPublicKey(String modulus, String exponent) {
         try {
             BigInteger b1 = new BigInteger(modulus);
             BigInteger b2 = new BigInteger(exponent);
             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
             RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
             return (RSAPublicKey) keyFactory.generatePublic(keySpec);
         } catch (Exception e) {
             e.printStackTrace();
             return null;
         }
     }
    
     /**
      * 使用模和指数生成RSA私钥
      * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA
      * /None/NoPadding】
      * 
      * @param modulus
      *            模
      * @param exponent
      *            指数
      * @return
      */
     public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {
         try {
             BigInteger b1 = new BigInteger(modulus);
             BigInteger b2 = new BigInteger(exponent);
             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
             RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);
             return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
         } catch (Exception e) {
             e.printStackTrace();
             return null;
         }
     }
    
    /**
     * 生成xml字符串
     * @return
     * @throws Exception 
     */
    public static void createXmlFile(String Modulus,String Exponent,String filepath) throws Exception{
    	 Document document = DocumentHelper.createDocument();
         Element root = document.addElement( "root" );
         Element supercarElement= root.addElement("Modulus");
    
         supercarElement.addText(Modulus);
         Element supercarElement2= root.addElement("Exponent");
    
         supercarElement2.addText(Exponent);
         // 写入到一个新的文件中 
         writer(document,filepath);
    }
    /** 
     * 把document对象写入新的文件 
     *  
     * @param document 
     * @throws Exception 
     */  
    public static void writer(Document document,String path) throws Exception {  
        // 紧凑的格式  
        // 排版缩进的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 设置编码  
        format.setEncoding("UTF-8");  
        // 创建XMLWriter对象,指定了写出文件及编码格式  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
                new FileOutputStream(new File(path)), "UTF-8"), format);  
        // 写入  
        writer.write(document);  
        // 立即写入  
        writer.flush();  
        // 关闭操作  
        writer.close();  
    }
    
    public String[] readKeyUtil(File file) throws DocumentException{
    	 // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        // 通过read方法读取一个文件 转换成Document对象  
        Document document = reader.read(file);  
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        Element ele = node.element("Modulus");
        String Modulus = ele.getTextTrim();
        Element ele1 = node.element("Exponent");
        String Exponent = ele1.getTextTrim();
    	return new String[]{Modulus,Exponent};
    }
    
    private static final int RSA_KEYSIZE = 1024;
    public static void main(String[] args) throws Exception {
    	//生成xml格式的公钥和私钥
    	new Test().generateRSAKey("C://ZJY//1//");
    	//对文件进行加密
    	new Test().encryptByRSA("C://ZJY//12345.txt", "C://ZJY//123456.txt", "C:/ZJY/1/public.xml");
    	//对文件进行解密
    	new Test().decryptByRSA("C://ZJY//123456.txt", "C://ZJY//1234567.txt", "C:/ZJY/1/private.xml");
    	
    }
    

    }

    展开全文
  • java RSA 加密签名工具包(开发)

    热门讨论 2013-09-22 17:33:23
    java RSA加密工具包 相关说明:http://blog.csdn.net/joe_storm/article/details/11477297 工具包可以从某个路径下读取密钥并进行加密解密签名验签。密钥以UTF-8编码的字符串格式存储。密文经过sun 内部的Base64...
  • javarsa工具类

    2017-03-24 09:21:22
    集合百度大多案例,整理汇总

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,750
精华内容 36,700
关键字:

javarsa

java 订阅