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


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. CGI & FastCGI 协议

    目录 CGI 是什么 CGI 特点 CGI 的流程 FastCGI 是什么 CGI & FastCGI(转载) 推荐Blog: CGI是什么,FastCGI是什么 CGI 是什么 公共网关接口 ...

  2. C - dlopen dlsym

    -----------------------------------------------------------------------------dlsym------------------ ...

  3. ArcGIS处理栅格数据(一)

    一.建立影像金字塔 ArcToolbox--数据管理工具--栅格--栅格属性--构建金字塔(pyramid) 说明:该方式一次只能为一张影像数据建立影像金字塔. ArcToolbox--数据管理工具- ...

  4. 读写 LED 作业 台灯的 频闪研究1

    读写 LED 作业 台灯的 频闪研究: 核心提示: 随着科技的持续发展,目前已经商业化的照明产品从第一代的白炽灯: 第二代的荧光灯.卤灯: 第三代的高强度气体放电灯; 以及当下主流的, 第四代的发光二 ...

  5. MongoDB Manually config

    MongoDB Manually config macOS 10.15.x path error exception in initAndListen: NonExistentPath: Data d ...

  6. Web Animations API & SVG & requestAnimationFrame

    Web Animations API WWAPI https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API https:/ ...

  7. NGK.IO的智能合约是炒作还是未来商业的主流?

    随着NGK主网的上线,NGK市场也备受关注.目前,NGK代币价格已经由初始价格0.0215美元涨到现在的0.86美元,代币价格上涨40倍!数字货币市场也已经将重点目光放到了NGK代币上,相信在不久的将 ...

  8. NGK.IO超级节点是我们掌握的下一个财富密码吗?

    从日前NGK.IO发布的新闻中,我们捕捉到了一个非常重要的信息,那就是反复被提到的"超级节点".很多人都对这个"超级节点"一头雾水,这个"超级节点&q ...

  9. 离场定高转弯DF与CF的对比

    也许是刚学会CAD的缘故,配合风螺旋插件,画图的感觉真是蛮爽的,忍不住画了一张又一张. 接着昨天的离场保护区,我们来聊一下PBN指定高度转弯保护区的画法.指定高度转弯的计算本身没有太多复杂的地方,真正 ...

  10. 04、数组与Arrays工具类

    目录 前言 一.一维数组 基本认识 内存空间 二.二维数组 基本认识 三.工具类Arrays 前言 去年四月份大一下半学期正式开始学习Java,一路从java基础.数据库.jdbc.javaweb.s ...