`
daibalusu
  • 浏览: 343044 次
文章分类
社区版块
存档分类
最新评论

java 非对称加密(公钥加密)

 
阅读更多

我夕

在实际的应用中单单只有对称加密是不够的,更多的时候是对称加密与非对称加密结合使用,非对称加密(公钥加密)特点速度慢、加密和解密的钥匙不相同,加密的方式是:
* 公钥加密-私钥解密
* 私钥加密-公钥解密
这两种,这里给大家演示下第一种方式,剩下一种大家自己测试下。
步骤:
得到keyPairGenerator的实例对象,并调用其generateKeyPair()方法创建KeyPair对象。
调用KeyPair对象的getPrivate和getPublic方法,分别得到PrivateKey对象和PublicKey对象。
得到Cipher的实例对象,并调用其init()方法指定PrivateKey对象或PublicKey对象,并指定要进行加密、还是进行解密操作。
调用Cipher对象的doFinal()方法完成加密或解密操作。

代码如下:

package com.study.security;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;

/**
 * 非对称加密-公钥加密
 * 公钥加密-私钥解密
 * 私钥加密-公钥解密
 * @author 我夕
 *
 */
public class PublicSecret {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		publicEncrypt();
		privatecEncrypt();

	}

	/**
	 * 公钥加密
	 * @throws Exception
	 */
	private static void publicEncrypt() throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");
		//产生钥匙对
		KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
		KeyPair keyPair=keyPairGenerator.generateKeyPair();
		PublicKey publicKey= keyPair.getPublic();
		PrivateKey privateKey=keyPair.getPrivate();
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);

		//前面做加密时都是用默认的编码,如果加密的数据是中文会出现乱码,现在改成中文的数据进行测试以下
		byte[] results=cipher.doFinal("我是要被加密的数据!".getBytes("UTF-8"));
		
		//保存密钥,由于是公钥加密,解密时得用私钥,所以这里要对产生的私钥进行存盘
		saveKey(privateKey, "key_public.key");
		saveData(results, "key_pubData.data");
		System.out.println("加密后的数据:"+new String(results));
		
		
	}
	/**
	 * 私钥解密
	 * @throws Exception
	 */
	private static void privatecEncrypt() throws Exception{
		//读取key与data
		Key privateKey=readKey("key_public.key");
		byte[] results=readData("key_pubData.data");
		
		Cipher cipher=Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		//不要忘记了加编码格式,不然乱码
		System.out.println("解密后的数据:"+new String(cipher.doFinal(results),"UTF-8"));
		
		//===================读数据的另一种写法,如以下========================
		
		FileInputStream fis=new FileInputStream("key_pubData.data");
		CipherInputStream cis=new CipherInputStream(fis,cipher);
		ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();
		int len=0;
		byte[] data=new byte[1024];
		while((len=cis.read(data))!=-1){
			arrayOutputStream.write(data, 0, len);
		}
		byte[] result2=arrayOutputStream.toByteArray();
		arrayOutputStream.close();
		cis.close();
		System.out.println("解密后的数据(读取数据的另一种方式):"+new String(result2,"UTF-8"));
		
	}
	/**
	 * 保存数据的方法
	 * @param results
	 * @param dataName
	 * @throws Exception
	 */
	public static void saveData(byte[] results,String dataName)throws Exception{
		FileOutputStream fosData=new FileOutputStream(dataName);
		fosData.write(results);
		fosData.close();
	}
	/**
	 * 读取数据的方法
	 * @param dataName
	 * @return byte[]
	 * @throws Exception
	 */
	public static byte[] readData(String dataName)throws Exception{
		FileInputStream fisDat= new FileInputStream(dataName);
		
		//读二进制数据
		ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();
		int len=0;
		byte[] data=new byte[1024];
		while((len=fisDat.read(data))!=-1){
			arrayOutputStream.write(data, 0, len);
		}
		byte[] result=arrayOutputStream.toByteArray();
		arrayOutputStream.close();
		
		fisDat.close();
		return result;
		
	}
	/**
	 * 保存密钥的方法
	 * @param key
	 * @param keyName
	 * @throws Exception
	 */
	public static void saveKey(Key key,String keyName) throws Exception{
		FileOutputStream foskey=new FileOutputStream(keyName);
		ObjectOutputStream oos=new ObjectOutputStream(foskey);
		oos.writeObject(key);
		oos.close();
		foskey.close();
	}
	/**
	 * 读取密钥的方法
	 * @param keyName
	 * @return Key
	 * @throws Exception
	 */
	public static Key readKey(String keyName) throws Exception{
		FileInputStream fiskey=new FileInputStream(keyName);
		ObjectInputStream oiskey=new ObjectInputStream(fiskey);
		Key key=(Key)oiskey.readObject();
		oiskey.close();
		fiskey.close();
		return key;
	}

}


运行结果:

分享到:
评论

相关推荐

    C# 非对称加密 私钥加密 公钥解密实现

    C# RSA非对称加密 实现私钥加密 公钥解密;可以用于生成授权码。 RSA生成一下随机值,然后都是用BigInteger类字符串跟字节数组互转

    C#-RSA非对称加密公钥加密.rar

    C#-RSA非对称加密公钥加密 这是一个完整的实例,不像一些网站只有局部代码,有的又只有代码,没有库文件等等。真正的拿到COPY下就用

    Java非对称加密解密(RSA)

    非对称加密是公钥加密,私钥来解密.使用的是Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.

    非对称加密和对称加密混合应用

    6.用对方的公钥对称密钥进行加密(加密密钥) 7.将密文(5)和加密密钥(6)一起发给对方 接收方: 1.用自己的私钥对加密密钥进行解密,得到对称密钥--也只有自己才能解密。 2.用对称密钥对密文进行解密,得到...

    前后端RSA非对称加密解密(代码示例).rar

    太不安全,应该加密传输,怎么做呢,对称加密一旦秘钥丢失则形同虚设,最好使用非对称加密的方式,由后端事先生成公钥和私钥,公钥发给前端页面,私钥后端自己保留,前端进行认证时,把密码原文用公钥加密再发给后端...

    Java非对称加密算法演示源码.rar

    一个来自Java非对称加密算法演示源码,通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,将公钥的KeySpec对象转换为公钥,张三用自己的私钥解密从李四处收到的信息,里面对原理的...

    Java生成非对称型加密公钥和私钥的方法

    主要介绍了Java生成非对称型加密公钥和私钥的方法,涉及java非对称加密的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    C#和Java关于RSA非对称加密互通类

    C#和Java关于RSA非对称加密互通类,包括提供RSA加密、解密方法,Java到c#的RSA私钥格式转换,Java到c#的RSA公钥格式转换等,使用PKCS1填充算法

    密码学实验_对称加密算法DES_非对称加密算法RSA.pdf

    完整实验报告,共31页 包括实验目的,实验内容,实验步骤,运行结果,实验总结 附上了源码。 部分内容可见https://blog.csdn.net/guansheng123/article/details/123029969

    非对称加密的案例

    非对称加密java,让你更加明白私钥、公钥

    RSA非对称加密验签参考demo

    RSA非对称加密 通过私钥加密,公钥解密来实现数据的安全交互。公钥私钥存放在单独的文本中,自己替换即可。

    RSA算法JAVA公钥加密,C#私钥解密

    可以直接运行成功的RSA加密解密示例 JAVA端采用公钥加密,服务端C#采用私钥解密。

    OpenSSL RSA 非对称加密(VS2013,C++实现)

    生成密钥及加密解密选择密钥时不支持中文路径 其它都已经实现。 C++代码,VS2013做的mfc程序, 调用openssl库的RSA算法实现非对称加密 公钥加密,私钥解密(私钥解密时需要密码) 支持大文件

    非对称加密算法

    非对称密码技术的实现 (1)熟悉RSA相关函数(公私钥生成...(2)利用公钥加密特定文件(test-1.txt),并用私钥进行解密;反过来,再利用私钥加密特定文件,并用公钥进行解密。对比解密后的文件与原始文件是否一致。

    Java非对称加密源码实例

    摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)...

    RSA加密 非对称加密,有公钥和私钥之分,公钥用于数据加密,私钥用于数据解密 加密结果可逆

    RSA加密 非对称加密,有公钥和私钥之分,公钥用于数据加密,私钥用于数据解密 加密结果可逆

    ASR (Asymmetric Signcryption) 非对称加密(工具类)

    与传统的非对称加密算法不同,ASR 在加密过程中使用对称加密算法对数据进行加密,然后使用公钥对对称密钥进行加密,以确保数据的安全性。 ASR 的特点如下: 安全性高,结合了对称加密和非对称加密的优点,能够提供更...

    RSA非对称性公钥加密代码

    这是写好的C的RSA代码,希望对大家有用

    PHP基于openssl实现的非对称加密操作示例

    使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。 1.安装openssl和php的openssl扩展 2.生成私钥:openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护...

    基于RSA的公钥加密

    主要包括单个文件,功能分别是: ...Enc_RSA.java 非对称加密 3。Dec_RSA.java 非对称解密 用java语言实现的小程序,测试数据已经用字符串的形式定义在加密文件中,若要测试不同组数据,可以把字符串重定义

Global site tag (gtag.js) - Google Analytics