Java安全之公钥与私钥

公钥与私钥机制属于非对称加密的范畴,非对称是相对于对称加密而言的,对称加密用于加密与解密的密钥是同一把,而非对称加密则用于加密与解密的密钥不相同,一个公开,称为公钥;一个保密,称为私钥,公钥与私钥必须成对出现,只有是配对的公钥与私钥才能用于加解密。公钥通过非安全通道发放,私钥则由发放者保留,公钥加密的数据,只能使用其配对的私钥对其解密;反之,私钥加密的数据,只可使用公钥对其解密。

对称加密出现后有效地提升的数据的安全性,但是由于加密与解密用的是同一把密钥,这样除了通信双方需要约定加密算法之外,数据发送方还需要将密钥发送给接收方,这为密钥的管理带来很大不便,为了弥补这一弱势,非对称加密算法就运而生。对于非对称加密来说,其公钥本身就是公开的,大家都知道,所以就不存在公钥管理的问题,只需要将私钥安全保存即可,这就为安全通信带来了极大的便利。

非对称加密算法与对象加密算法相比,密钥管理不复存在,在安全性上有着无法逾越的高度,但其加/解密效率却要比对称加密低得多,因此非对象加密算法往往应用在一些安全性要深圳市相当高的领域,如电子商务平台、银行网关、支付系统等。针对非对称加密算法低效的问题,很多情况下是将对称加密算法与非对称加密算法相结合,使用对称加密算法为数据加/解密,使用公钥与私钥为对象加密算法密钥加/解蜜。利用对称加密算法的高效性,加之非对象加密算法的密钥管理,提升整体加密系统的安全性。而且在算法的设计上,非对象加密算法对待加密数据长度还有着极为严苛的要求。例如,RSA算法要求待加密数据不得超过53个字节。基于上述原因,非对称加密算法主要用于交换对称加密算法与秘密密钥,而非数据交换。

下面是一个Java中使用公钥与私钥的例子:

package com.xtayfjpk.security;

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 org.junit.Test;

public class KeyPairTest {
	private static final String ALGOGRITHM = "RSA";
	private static final String PUBLIC_KEY_PATH = "public.key";
	private static final String PRIVATE_KEY_PATH = "private.key";

	@Test
	public void testGenerate() throws Exception {
		//KeyPairGenerator引擎类用于产生密钥对,JDK(7)默认支持的算法有,DiffieHellman、DSA、RSA、EC
		KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGOGRITHM);
		//产生密钥对
		KeyPair keyPair = generator.generateKeyPair();
		//获取公钥
		PublicKey publicKey = keyPair.getPublic();
		//获取私钥
		PrivateKey privateKey = keyPair.getPrivate();

		//将公钥与私钥写入文件,以备后用
		writeKey(PUBLIC_KEY_PATH, publicKey);
		writeKey(PRIVATE_KEY_PATH, privateKey);
	}

	@Test
	public void testEncryptAndDecrypt() throws Exception {
		Cipher cipher = Cipher.getInstance(ALGOGRITHM);
		//读取私钥,进行加密
		PrivateKey privateKey = (PrivateKey) readKey(PRIVATE_KEY_PATH);
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		//加密
		String sendInfo = "我的明文";
		byte[] results = cipher.doFinal(sendInfo.getBytes());

		//读取公钥,进行解密
		PublicKey publicKey = (PublicKey) readKey(PUBLIC_KEY_PATH);
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		//解密
		byte[] deciphered = cipher.doFinal(results);
		//得到明文
		String recvInfo = new String(deciphered);
		System.out.println(recvInfo);
	}

	public void writeKey(String path, Key key) throws Exception {
		FileOutputStream fos = new FileOutputStream(path);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(key);
		oos.close();
	}

	public Key readKey(String path) throws Exception {
		FileInputStream fis = new FileInputStream(path);
		ObjectInputStream bis = new ObjectInputStream(fis);
		Object object = bis.readObject();
		bis.close();
		return (Key) object;
	}
}

在上面的例子中,保存公钥与私钥是直接通过对象序列化机制完成的,与秘密密钥一样,也可以获取编码后的二进制数据(Key.getEncoded())保存,具体可参看:Java安全之秘密密钥

时间: 2024-10-29 10:19:44

Java安全之公钥与私钥的相关文章

公钥和私钥的区别[小白学java]

一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥.我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用 数字2,就是我的私钥,来解密.这样我就可以保护数据了. 我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上.别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥, 只有我才能解密,解密后就得到a.这样,我们就可以传

使用keytool生成公钥、私钥、证书并且读取出来,使用私钥签名jar并验证(转)

参考链接:http://happyqing.iteye.com/blog/2139504 :https://blog.csdn.net/arjelarxfc/article/details/52461828 :https://blog.csdn.net/yangxt/article/details/1796965 在看书的时候涉及到了Java的安全加密技术,然后发现生成私钥公钥证书用的是keytool这个jdk自带插件 keytool的主要用法: keytool的几个常用的命令. 1.创建证书

公钥,私钥和数字签名这样最好理解

http://blog.csdn.net/21aspnet/article/details/7249401 一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密.这样我就可以保护数据了. 我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上.别人偷到了

公钥与私钥

公钥和私钥就是俗称的不对称加密方式,是从以前的对称加密(使用用户名与密码)方式的提高.用电子邮件的方式说明一下原理.      使用公钥与私钥的目的就是实现安全的电子邮件,必须实现如下目的:      1. 我发送给你的内容必须加密,在邮件的传输过程中不能被别人看到.      2. 必须保证是我发送的邮件,不是别人冒充我的.      要达到这样的目标必须发送邮件的两人都有公钥和私钥.      公钥,就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章用的

RSA公钥加密—私钥解密&私钥加密—公钥解密&私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

详解公钥、私钥、数字证书的概念

详解公钥.私钥.数字证书的概念 加密和认证 首先我们需要区分加密和认证这两个基本概念. 加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击.其重点在于数据的安全 性.身份认证是用来判断某个身份的真实性,确认身份后,系统才可以依不同的身份给予不同的权限.其重点在于用户的真实性.两者的侧重点是不同的. 公钥和私钥      公钥和私钥就是俗称的不对称加密方式,是从以前的对称加密(使用用户名与密码)方式的提高. 在现代密码体制中加密

CentOS下生成密钥对(公钥、私钥)

1.公钥.私钥(双钥加密技术)简述: 假设数据传输方A向数据接收方B传输数据(以A为服务器,B为客户端为例).现在B有一对密钥对(公钥和私钥),B将公钥发送给A,A通过公钥加密后将数据传给B,B收到数据后利用手里的私钥进行数据解密(公钥和私钥是成对存在的,即只有拥有与该公钥匹配的私钥,才能解密通过公钥加密的数据),这样即保证了数据传输的相对安全. 2.产生密钥对: #ssh-keygen -C"[email protected]" -t rsa 执行完这个命令后,在/root/.ssh

密码学——公钥与私钥

这里不讨论数学原理,只说明其实现和传输过程. 我们先假定一个数据的发送方和一个数据的接收方(就叫小红和小明好了!) 发送方小红拥有一对密钥:一个公钥和一个私钥. 接收方小明也同样拥有一对密钥:一个公钥和私钥. 注意:这四把钥匙(密码)各不相同! 公钥的概念:公钥是可以在网络上传输的,也就是说接收发送双方都可以知道彼此的公钥,当然,如果你用网络嗅探等技术,也可以在网络上嗅探的公钥的内容,但你仅有公钥是无法解密文件的. 私钥的概念:私钥是用户各自私有的,不会在网络中传输(也就是说不需要接收发送双方彼

公钥,私钥和数字签名这样最好理解 【转】

from http://blog.csdn.net/21aspnet/article/details/7249401# 一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密.这样我就可以保护数据了. 我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上