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

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

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

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

package net.itxm.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())保存.

转载请注明来源网站:www.itxm.cn谢谢!

java公钥加密私钥解密_公钥加密,私钥解密示例程序(JAVA)详解相关推荐

  1. java docker 持续集成_最佳实战Docker持续集成图文详解

    前言 关于Docker的文章铺天盖地,但精品文章往往翻译居多.都说Docker天生适合持续集成/持续部署,但同样,可落地.实际可操作性的文章也很罕见. 基于这些情况,虽然我们专栏定位为运维管理性文字, ...

  2. java 正则 单个字符_正则表达式教程之匹配单个字符详解

    本文实例讲述了正则表达式教程之匹配单个字符.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的 ...

  3. java 服务端渲染_基于vue-ssr服务端渲染入门详解

    第一部分 基本介绍 1.前言 服务端渲染实现原理机制:在服务端拿数据进行解析渲染,直接生成html片段返回给前端.然后前端可以通过解析后端返回的html片段到前端页面,大致有以下两种形式: 1.服务器 ...

  4. java adt入门教程_【教程】【多图详解】如何在Eclipse中离线安装ADT(Android Development Tools)...

    背景 本来正常情况的话,去下载集成好ADT的Eclipse,就可以直接使用了: 但是呢,(有人)有时候,是本身已经有了Eclipse了,是需要(通过Eclipse)在线下载和安装ADT的. 结果就遇到 ...

  5. java中move用法_【MFC】MoveWindow();函数使用详解

    CWnd::MoveWindow void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE ); voi ...

  6. java正则表达式判断问号_正则表达式问号的四种用法详解

    原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次. 非贪婪匹配 贪婪匹配 在满足匹配时 ...

  7. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  8. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  9. java.exe 安装程序_java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格 ...

  10. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

最新文章

  1. mysql的acid_什么是数据库ACID?
  2. ch341a编程和ttl刷机区别_土豪金CH341a编程器 开箱晒物
  3. 【总结】C语言实用算法系列之知识点梳理_附学生管理系统各模块代码
  4. php.ini配置详解 号,php INI配置文件的解析实现分析
  5. 没有已启用的仓库。 执行 “yum repolist all“ 查看您拥有的仓库。
  6. 6099元!华为Mate 40 Pro 4G版开放现货
  7. [译]如何成为一个优秀的前端工程师
  8. 设计模式之GOF23装饰模式
  9. Visio Professional 2016 破解教程
  10. 毕设系统之网上订餐管理系统
  11. 带电检测必要性_GIS的概念和定期局部放电检测的重要性
  12. HTTP协议-报文解析
  13. indesign安装包.exe 自动简繁互转for_InDesign 简繁互换插件
  14. 商用密码产品认证-智能IC卡
  15. nginx uwsgi_pass方式传递真实IP
  16. Flask框架初学-03-模板
  17. 图解数组计算模块NumPy下(三角函数、四舍五入函数(around)、取整、将弧度转化为角度、统计分析函数、中位数、数组的排序、argsort()、lexsort())
  18. 解决'python -m pip install --upgrade pip',显示“'python' 不是内部或外部命令,也不是可运行的程序”
  19. 【U8+】用友U8数据卸出提示“更改卸载业务单据关闭日期删除后处理出错,错误描述,存储过程没有任何参数”
  20. Win2012 R2 安装Exchange Server2016

热门文章

  1. 仿微信导航网站源码 小程序商店商城系统 PHPCMS
  2. 从内容违规方面剖析抖音播放量上不去的关键原因
  3. Android 制作简易浏览器源码
  4. 多玩游戏网创始人李学凌:如何穷创业
  5. 2021最新 SpringBoot面试题精选(附刷题小程序)
  6. 从中心走向边缘——解读边缘计算解决方案!
  7. 转贴:生活中几招省钱的小窍门
  8. 业界首个声纹识别与音频检索系统上线,10分钟搭建产业级应用
  9. vim配置入门,到豪华版vim配置
  10. 重置root用户密码