一、概述

非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,一个公开,称为公钥;一个保密,称为私钥。因此,非对称密码算法也称为双钥或公钥加密算法。非对称加密算法解决了对称加密算法密钥分配问题,并极大地提高了算法安全性。多种B2C或B2B应用均使用非对称加密算法作为数据加密的核心算法。

非对称加密算法源于DH算法(Diffie-Hellman,密钥交换算法),DH算法提出后,国际上相继出现了各种实用性更强的非对称加密算法,其构成主要是基于数学问题的求解,主要分为两类:

1、基于因子分解难题。RSA算法是最为典型的非对称加密算法

2、基于离散对数难题。ElGamal算法。

二、RSA

RSA算法实现易于理解,对于RSA算法的测试只需要注意经公钥加密的数据是否可以通过私钥将其解密,反之,经私钥加密的数据是否可以通过公钥将其解密。

就是说公钥和私钥都可用于加密和解密,但是应用场景有些区别。

私钥签名,公钥验签,主要用于签名验签的业务场景。

公钥加密,私钥解密,真正进行加密的业务场景。

与DH算法不同,RSA算法仅需要一套密钥即可完成加密/解密操作,并且公钥的密钥长度明显小于私钥的密钥长度,更便于发送和携带。

抽象类

import org.apache.shiro.codec.Base64;
import org.junit.Test;import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;/**** RSA抽象类*/
public abstract class RSACoder {/*** 算法*/public static final String KEY_ALGORITHM = "RSA";/*** 公钥*/private static final String PUBLIC_KEY = "RSAPublicKey";/*** 私钥*/private static final String PRIVATE_KEY = "RSAPrivateKey";/*** RSA密钥长度* 默认1024位* 密钥长度必须位64的倍数* 范围在512-65536之间*/private static final int KEY_SIZE = 512;/*** 初始化密钥* @return 密钥Map*/public static Map<String, Object> initKey(){try{// 实例化密钥对生成器KeyPairGenerator gen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对生成器gen.initialize(KEY_SIZE);// 生成密钥对KeyPair keyPair = gen.generateKeyPair();// 公钥RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();// 私钥RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();// 封装密钥Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, rsaPublicKey);map.put(PRIVATE_KEY, rsaPrivateKey);return map;}catch(Exception e){}return null;}/*** 取得公钥* @param map* @return*/public static byte[] getPublicKey(Map<String, Object> map){Key key = (Key)map.get(PUBLIC_KEY);return key.getEncoded();}/*** 取得公钥* @param map* @return*/public static byte[] getPrivateKey(Map<String, Object> map){Key key = (Key)map.get(PRIVATE_KEY);return key.getEncoded();}/*** 私钥解密* @param data 待解密数据* @param key  私钥* @return byte[] 解密数据*/public static byte[] decryptByPrivateKey(byte[] data, byte[] key){try{//取得私钥PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs);//对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}catch(Exception e){}return null;}/*** 公钥解密* @param data* @param key* @return*/public static byte[] decryptByPublicKey(byte[] data, byte[] key){try{//取得公钥X509EncodedKeySpec pkcs = new X509EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成公钥PublicKey publicKey = keyFactory.generatePublic(pkcs);//对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}catch(Exception e){}return null;}/*** 公钥加密* @param data* @param key* @return*/public static byte[] encryptByPublicKey(byte[] data, byte[] key){try{//取得公钥X509EncodedKeySpec pkcs = new X509EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成公钥PublicKey publicKey = keyFactory.generatePublic(pkcs);//对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}catch(Exception e){}return null;}/*** 私钥加密* @param data* @param key* @return*/public static byte[] encryptByPrivateKey(byte[] data, byte[] key){try{//取得私钥PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成公钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs);//对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}catch(Exception e){}return null;}
}

测试代码

@Test
public void digest_RSA()
{byte[] publicKey;byte[] privateKey;try{Map<String, Object> map = RSACoder.initKey();publicKey = RSACoder.getPublicKey(map);privateKey = RSACoder.getPrivateKey(map);System.out.println("公钥;"+ org.apache.shiro.codec.Base64.encodeToString(publicKey));System.out.println("私钥;"+ org.apache.shiro.codec.Base64.encodeToString(privateKey));String input = "这是待加密的数据123456";byte[] data = input.getBytes();//私钥加密,公钥解密byte[] edata1 = RSACoder.encryptByPrivateKey(data, privateKey);System.out.println("私钥加密;"+ org.apache.shiro.codec.Base64.encodeToString(edata1));byte[] edata2 = RSACoder.decryptByPublicKey(edata1, publicKey);System.out.println("公钥解密;"+ new String(edata2));//公钥加密,私钥解密byte[] edata3 = RSACoder.encryptByPublicKey(data, publicKey);System.out.println("公钥加密;"+ org.apache.shiro.codec.Base64.encodeToString(edata3));byte[] edata4 = RSACoder.decryptByPrivateKey(edata3, privateKey);System.out.println("私钥解密;"+ new String(edata4));}catch(Exception e){}
}

输出如下

公钥;MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMgmYnp01ghihTnr0F3tHo4Q1HY0TDWr6CStK8HdnKYbnwA09TwQrmT7m0GPgU4Sieh7T0dqTT6oQvkCsVWD9y0CAwEAAQ==
私钥;MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAyCZienTWCGKFOevQXe0ejhDUdjRMNavoJK0rwd2cphufADT1PBCuZPubQY+BThKJ6HtPR2pNPqhC+QKxVYP3LQIDAQABAkBXE1wEqo/zVelgKZedRWvloqzMQDRnpUJ5sl03GpLsMJMcyGPFY9RvlYjMBdYOBqCb8PJtNtf1kHNuaMpSA3wBAiEA5uNuwy3m6mo+5mcJ4EKjkb5VOWinNFiQCMwaidUt+KkCIQDd6xvPq0H0pi0dtea5Sc+p/b6FpzoAE/1tCnZxGe1I5QIgQovgm766JGw07uFZ1lo+nL4YADDqqEqyUObK61kXI+kCIQDRveVyOIXE6c6YVxTzKNz56JZKkgwSiNIsXggly4BmNQIgEihE8cbNJCwcVxOBgYvIDMiaP6j8Pewmre3fXJZ4n7Y=

私钥加密;MCf+L8qCY05j1GLUkkGt65vj2JJg1wxSb2xgUQzwk+RvUQgZaFV4W4HNBKO3jIJ7t6cBz/1FUWlAkwaFBIl/SQ==
公钥解密;这是待加密的数据123456

公钥加密;n+vp/smgaUNzNG8kpc9BerCwa6pmIJUVYkTjRdGdjk7tXn3YEk3Rpa10gm4v5TDeNQ6y88n/cdiQ7D2l0Ox3aA==
私钥解密;这是待加密的数据123456

三、其它参考

上面仅有关于RSA的用法。

Java非对称加密 - EZgod - 博客园非对称加密算法: DH: 实现方JDK Diffie-Hellman)密钥交换算法 非对称算法的基石 仅能用于密钥分配,不能用于加解密数据,一般加密数据用AES 密钥长度:512~1024中的64的整https://www.cnblogs.com/ezgod/p/14447405.html

Java加密:四、非对称加密算法相关推荐

  1. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...

  2. Java 加密 AES 对称加密算法

    版权声明:本文为博主原创文章,未经博主允许不得转载. [AES] 一种对称加密算法,DES的取代者. 加密相关文章见:Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES R ...

  3. 可逆与不可逆算法,对称加密与非对称加密算法总结

    文章目录 1. 加密算法的种类 2. 不可逆加密算法 ①:MD5 ②:HMAC系列 ③:SHA系列 3. 可逆加密算法 1. 对称加密 ①:DES ②:3DES ③:AES 2. 非对称加密 ①:RS ...

  4. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  5. Java | 加密技术 | 摘要加密算法(不含原理)

    一.背景简介 1.1 含义 消息摘要采用单向Hash函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密 ...

  6. 对称加密和非对称加密算法分类,国密算法分类。

    对称加密算法 对称加密算法加密和解密使用的是同一个密钥.常用的对称加密算法包括:DES.3DES.AES.RC4.RC5.RC6. 非对称加密算法 指加密和解密使用不同密钥的加密算法,也称为公私钥加密 ...

  7. 对称加密和非对称加密算法工作过程详解

    非对称加密算法: 加密和解密使用不同的密钥.公钥只能用来加密,而私钥只能用来解密.私钥由用户自己拥有.公钥公开配送,只要有需求即可获得. 优点: 算法安全性高,公钥公开,私钥自己保存 缺点: 加密和解 ...

  8. Java中的非对称加密算法RSA实现

    为什么80%的码农都做不了架构师?>>>    需求: 实现RSA非对称加密算法 实现: public static class RSACoder { public static f ...

  9. openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解

    其实有时候觉得写博客好烦,就个函数就开篇博客.很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷.技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难.. ...

  10. java 加密 encrypt_JAVA Encrypter 加密算法

    Java代码 /** * 加密者 * * @time: 2007-8-29 下午05:45:36 */ public final class Encrypter { private static Ci ...

最新文章

  1. apache php 调优_Apache的性能优化(二)
  2. tar: bzip2:无法 exec: 没有那个文件或目录
  3. SoftReference和WeakReference
  4. Linux中Shell的命令替换用法笔记
  5. asp.net web常用控件FileUpload(文件上传控件)
  6. windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...
  7. 导致Oracle性能抖动的参数提醒
  8. 删除mysql主键语句_MySQL主键添加/删除
  9. 如何使用 SQL Server FILESTREAM 存储非结构化数据?
  10. android AVD 启动时报错
  11. vc编程经典网址推荐
  12. MemoryBarrier方法
  13. Linux下Teamviewer安装、设置及开机启动
  14. java-eclipse-tomcat配置运行发布网站
  15. 学会ipad当作电脑扩展屏方法
  16. 计算机毕设题目设计与实现(论文+源码)_kaic
  17. pwn暑假训练(十) emem这次的测验自己还是太菜
  18. windows系统C盘“已用空间”不断增大
  19. 西门子触摸屏数据历史数据记录_西门子触摸屏mp277历史数据丢失(免费技术支持)...
  20. TIME_WAIT和CLOSE_WAIT的区别

热门文章

  1. matlab变电站仿真,基于Matlab Simulink的110kV变电系统建模及故障仿真分析
  2. 通过 bitbang GPIO来实现i2c总线协议
  3. Qt android 开发环境搭建
  4. [原创]MASM32新手指南
  5. 计算机基础---04ppt篇(world转化为ppt,字体设计,形状,ppt背景,音频,视频动画效果,模板推荐,插件推荐)
  6. 我从Python新手到大师的百天之路(内附学习资源)
  7. 金蝶如何用计算机,金蝶软件要换电脑用,该怎么处理?
  8. 戴尔笔记本电脑 N4010 14R-468 BOIS简单解析
  9. -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 日志分析
  10. 开源控件My97DatePicker的基本用法