私钥加密-->公钥解密,反之亦然,但不安全。也可以当做数字签名。


public class RSACoder
{

        //非对称加密算法
        public static final String KEY_ALGORITHM= "RSA";
        //公钥
        private static final String PUBLIC_KEY= "RSAPublicKey";
        //私钥
        private static final String PRIVATE_KEY= "RSAPrivateKey";
        //密钥长度,默认1024位,512~65536位,必须是64的倍数
        private static final int KEY_SIZE=512;
       
        //私钥解密
        public static byte[]
decryptByPrivateKey(byte[] data, byte[]
key) throws KeyException, Exception{
               //取得私钥,
              PKCS8EncodedKeySpec pkcs8KeySpec= new PKCS8EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
              PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
              
               //对数据解密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. DECRYPT_MODE,
privateKey);
               return cipher.doFinal(data);
       }
       
        //公钥解密
        public static byte[]
decryptByPublicKey(byte[] data, byte[]
key) throws Exception{
              X509EncodedKeySpec x509= new X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
              
               //生成公钥
              PublicKey publicKey=keyFactory.generatePublic(x509);
               //对数据解密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. DECRYPT_MODE,
publicKey);
               return cipher.doFinal(data);
       }
       
        //公钥加密
        public static byte[]
encrpytByPublicKey(byte[] data, byte[]
key) throws Exception{
               //取得公钥
              X509EncodedKeySpec x509= new X509EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
              PublicKey pubKey=keyFactory.generatePublic(x509);
               //对数据加密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. ENCRYPT_MODE,
pubKey);
               return cipher.doFinal(data);
       }
       
        //私钥加密
        public static byte[]
encryptByPrivate(byte[] data, byte[]
key) throws Exception, GeneralSecurityException{
               //取得私钥
              PKCS8EncodedKeySpec pkcs8= new PKCS8EncodedKeySpec(key);
              KeyFactory keyFactory=KeyFactory. getInstance(KEY_ALGORITHM);
               //生成私钥
              PrivateKey privateKey=keyFactory.generatePrivate(pkcs8);
               //对数据加密
              Cipher cipher=Cipher. getInstance(keyFactory.getAlgorithm());
              cipher.init(Cipher. ENCRYPT_MODE,
privateKey);
               return cipher.doFinal(data);
       }
       
        //取得私钥
        public static byte[]
getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PRIVATE_KEY);
               return key.getEncoded();
       }
        //取得公钥
        public static byte[]
getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( PUBLIC_KEY);
               return key.getEncoded();
       }
       
        //初始化密钥
        public static Map<String,Object>
initKey() throws Exception{
              KeyPairGenerator keyPairGen=KeyPairGenerator.getInstanceKEY_ALGORITHM);
              keyPairGen.initialize( KEY_SIZE);
              KeyPair keyPair=keyPairGen.generateKeyPair();
              
               //公钥
              RSAPublicKey publicKey=(RSAPublicKey)keyPair.getPublic();
               //私钥
              RSAPrivateKey privateKey=(RSAPrivateKey)keyPair.getPrivate();
              
               //封装密钥
              Map<String,Object> keyMap= new HashMap<String,Object>(2);
              keyMap.put( PRIVATE_KEY,
privateKey);
              keyMap.put( PUBLIC_KEY,
publicKey);
               return keyMap;
       }

}


public class RSATest
{

        private static byte[] privateKey;
        private static byte[] publicKey;
       
        public static void initKey() throws Exception{
               //初始化密钥
              Map<String,Object> keyMap=RSACoder. initKey();
               publicKey=RSACoder.getPublicKey(keyMap);
               privateKey=RSACoder.getPrivateKey(keyMap);
              
              System. out.println("公钥:\n" +Base64.encodeBase64String (publicKey ));
              System. out.println("私钥:\n" +Base64.encodeBase64String (privateKey ));
       }
        public static void main(String[]
args) throws GeneralSecurityException,
Exception {
               // TODO Auto-generated
method stub
               initKey();
              String inputStr1= "RSA加密算法" ;
               byte[]
data1=inputStr1.getBytes();
              System. out.println("原文:\n" +inputStr1);
              
               //私钥加密
               byte[]
encodeData1=RSACoder.encryptByPrivate(data1, privateKey);
              System. err.println("加密后:\n" +Base64.encodeBase64String (encodeData1));
              
               //公钥解密
               byte[]
decodeData1=RSACoder.decryptByPublicKey(encodeData1, publicKey);
              String outputStr1= new String(decodeData1);
              System. err.println("解密后:\n" +outputStr1);
              
               assertEquals(inputStr1,outputStr1);
              
       }

}

RSA典型非对称加密算法的更多相关文章

  1. JAVA实现RSA加密,非对称加密算法

    RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...

  2. 非对称加密算法-RSA算法

    一.概述 1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现 2.java6支持RSA算法 3.RSA算法可以用于数据加密和数字签名 4.RSA算法相对于DES/AES等对 ...

  3. SSH加密原理、RSA非对称加密算法学习与理解

    首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...

  4. 非对称加密算法-RSA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...

  5. 信息加密之非对称加密算法RSA

    前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...

  6. 【Java】聊聊常用的非对称加密算法之一RSA的使用(Java)

    参考的优秀文章 Java加密技术(四)——非对称加密算法RSA RSA算法原理(一).RSA算法原理(二) RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? 简单的介绍 RSA是有名的非对称加密 ...

  7. 第十二章 非对称加密算法-RSA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...

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

    版权声明:本文为博主原创文章,未经博主允许不得转载. [前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及使用方法和例子 [最简单的加密] 1.简单的概念 明文:加密前的 ...

  9. openssl 非对称加密算法RSA命令详解

    1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...

随机推荐

  1. Hexo之更换背景及透明度

    Hexo之更换背景及透明度 引入方式 首先,介绍一下引入方式,外部导入css文件,不影响内部配置. 1.创建css文件 创建一个css文件移动到\themes\butterfly\source\css ...

  2. select用法&原理详解(源码剖析)(转)

    今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...

  3. Leetcode(884)-索引处的解码字符串

    给定一个编码字符串 S.为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: 如果所读的字符是字母,则将该字母写在磁带上. 如果所读的字符是数字(例如 d),则整个当前磁 ...

  4. msfconsole web后门

    一.PHP后门 在meterpreter中有一个名为PHP meterpreter的payload,利用这个可以成功反弹.步骤如下: 1. 使用msfvenom 创建一个webshell.php 2. ...

  5. CNN可视化技术总结(四)--可视化工具与项目

    CNN可视化技术总结(一)-特征图可视化 CNN可视化技术总结(二)--卷积核可视化 CNN可视化技术总结(三)--类可视化 导言: 前面介绍了可视化的三种方法--特征图可视化,卷积核可视化,类可视化 ...

  6. Tensorflow+InternalError: Blas GEMM launch failed

    [参考1:]https://stackoverflow.com/questions/37337728/tensorflow-internalerror-blas-sgemm-launch-failed ...

  7. 如何优雅的阅读 GitHub 上开源 js 框架和库的源码

    如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...

  8. DOM & Node.contains

    DOM & Node.contains Node.contains() https://developer.mozilla.org/en-US/docs/Web/API/Node/contai ...

  9. jest & code testing

    jest jest & code testing https://jestjs.io/zh-Hans/ 24.9 https://jestjs.io/docs/zh-Hans/getting- ...

  10. React LifeCycle API

    React LifeCycle API old API & new API 不可以混用 demo https://codesandbox.io/s/react-parent-child-lif ...