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


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. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  2. springboot项目打war包

    spring官方教程地址(包含打war包和打jar包的):https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#b ...

  3. PostCSS All In One

    PostCSS All In One https://postcss.org/ https://www.webpackjs.com/loaders/postcss-loader/ https://gi ...

  4. chmod +x vs chmod 755

    chmod +x vs chmod 755 What is the difference between "chmod +x" and "chmod 755"? ...

  5. .NET 面试题: C# override && overloading (C# 覆写 && 重载)

    1 1 1 .NET 面试题, C# ,override , overloading, 覆写, 重载,.NET,ASP.NET, override (覆写/重写): 方法名相同,参数的个数和类型相同, ...

  6. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  7. 十大排序算法时间复杂度 All In One

    十大排序算法时间复杂度 All In One 排序算法时间复杂度 排序算法对比 Big O O(n) O(n*log(n)) O(n^2) 冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 ...

  8. You Don't Know Chrome Features

    You Don't Know Chrome Features URL auto convert to QR Code click the tab URL address click QRCode ic ...

  9. 在线预览word,excel,ppt

    https://view.officeapps.live.com/op/view.aspx?src=服务器地址微软提供的地址拼接自己的可以预览了拼接自己的服务器地址可以在线预览

  10. 没想到即将上线的NGK生态应用这么厉害?!

    话说这即将上线的NGK公链可不是闹着玩的,这条公链的蛰伏时间长达两年,恐怕这个准备时间,连最初的区块链1.0时代的项目都无法比拟,现在的话那都差太远了. 编程一段代码并不难,难的是耐得住赚快钱的心.人 ...