Coder.java

package com.sign.utils.rsa;

import java.security.MessageDigest;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Coder {

    public static final String KEY_SHA="SHA";
    public static final String KEY_MD5="MD5";

         /**
          * BASE64解密
          * @param key
          * @return
          * @throws Exception
          */
         public static byte[] decryptBASE64(String key) throws Exception{
             return (new BASE64Decoder()).decodeBuffer(key);
        }
         /**
          * BASE64加密
          * @param key
          * @return
          * @throws Exception
          */
         public static String encryptBASE64(byte[] key)throws Exception{
             return (new BASE64Encoder()).encodeBuffer(key);
                     }

         /**
          * MD5加密
          * @param data
          * @return
         * @throws Exception
          */
         public static byte[] encryptMD5(byte[] data)throws Exception{
             MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
             md5.update(data);
             return md5.digest();
         }

         /**
          * SHA加密
          * @param data
          * @return
          * @throws Exception
          */
         public static byte[] encryptSHA(byte[] data)throws Exception{
             MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
             sha.update(data);
             return sha.digest();
         }

}

Rsa.java

package com.sign.utils.rsa;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
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;

import javax.crypto.Cipher;

import org.junit.Test;

public class Rsa extends Coder {

    public static final String KEY_ALGORTHM="RSA";//秘钥算法
    public static final String SIGNATURE_ALGORITHM="MD5withRSA";//签名算法

    public static final String PUBLIC_KEY = "RSAPublicKey";//公钥
    public static final String PRIVATE_KEY = "RSAPrivateKey";//私钥

    /*
     * 初始化密钥
     * @return
     * @throws Exception
     *  RSA加密解密的实现,需要有一对公私密钥,公私密钥的初始化如下:
     */
    public static Map<String,Object> initKey()throws Exception{
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM);
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        //私钥
        RSAPrivateKey privateKey =  (RSAPrivateKey) keyPair.getPrivate();

        Map<String,Object> keyMap = new HashMap<String, Object>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);

        return keyMap;
        }

         /**
          * 取得公钥,并转化为String类型
          * @param keyMap
          * @return
          * @throws Exception
          */
    public static String getPublicKey(Map<String, Object> keyMap)throws Exception{
             Key key = (Key) keyMap.get(PUBLIC_KEY);
             return encryptBASE64(key.getEncoded());
         }

         /**
          * 取得私钥,并转化为String类型
          * @param keyMap
          * @return
          * @throws Exception
          */
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception{
             Key key = (Key) keyMap.get(PRIVATE_KEY);
             return encryptBASE64(key.getEncoded());
         }

         //两种加密形式
         //方法一
         /*
         * 用私钥加密
          * @param data  加密数据
          * @param key   密钥
          * @return
          * @throws Exception
          */
      public static byte[] encryptByPrivateKey(byte[] data,String key)throws Exception{
             //解密密钥
             byte[] keyBytes = decryptBASE64(key);
             //取私钥
             PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

             //对数据加密
             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
             return cipher.doFinal(data);
         }

         /**
          * 私钥解密
          * @param data  加密数据
          * @param key   密钥
          * @return
          * @throws Exception
          */
         public static byte[] decryptByPrivateKey(byte[] data,String key)throws Exception{
             //对私钥解密
             byte[] keyBytes = decryptBASE64(key);

             PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
             //对数据解密
             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
             cipher.init(Cipher.DECRYPT_MODE, privateKey);
             return cipher.doFinal(data);
         }

         //方式二

          /**
          * 用公钥加密
          * @param data  加密数据
          * @param key   密钥
          * @return
          * @throws Exception
          */
         public static byte[] encryptByPublicKey(byte[] data,String key)throws Exception{
             //对公钥解密
             byte[] keyBytes = decryptBASE64(key);
             //取公钥
             X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

             //对数据解密
             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
             cipher.init(Cipher.ENCRYPT_MODE, publicKey);

             return cipher.doFinal(data);
         }

          /**
          * 私钥加密
          * 用公钥解密
          * @param data  加密数据
          * @param key   密钥
          * @return
          * @throws Exception
          */
         public static byte[] decryptByPublicKey(byte[] data,String key)throws Exception{
             //对私钥解密
             byte[] keyBytes = decryptBASE64(key);
             X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

             //对数据解密
             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
             cipher.init(Cipher.DECRYPT_MODE, publicKey);

             return cipher.doFinal(data);
         }

          /**
           * 私钥签名
          *  用私钥对信息生成数字签名
          * @param data  //加密数据
          * @param privateKey    //私钥
          * @return
          * @throws Exception
          */
         public static String sign(byte[] data,String privateKey)throws Exception{
             //解密私钥
             byte[] keyBytes = decryptBASE64(privateKey);
             //构造PKCS8EncodedKeySpec对象
             PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
             //指定加密算法
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             //取私钥匙对象
             PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
              //用私钥对信息生成数字签名
             Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
             signature.initSign(privateKey2);
             signature.update(data);

             return encryptBASE64(signature.sign());
         }

          /**
           * 公钥校验
          * 校验数字签名
          * @param data  加密数据
          * @param publicKey 公钥
          * @param sign  数字签名
          * @return
          * @throws Exception
          */
         public static boolean verify(byte[] data,String publicKey,String sign)throws Exception{
             //解密公钥
             byte[] keyBytes = decryptBASE64(publicKey);
             //构造X509EncodedKeySpec对象
             X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
             //指定加密算法
             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
             //取公钥匙对象
             PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);

             Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
             signature.initVerify(publicKey2);
             signature.update(data);
             //验证签名是否正常
             return signature.verify(decryptBASE64(sign));

         }

         @Test
         public void testRsa(){
              try {
                //test();
                testSign();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

         }

        public  void test() throws Exception {
             Map<String, Object> keyMap = initKey();
             String publicKey =getPublicKey(keyMap);
            String privateKey = getPrivateKey(keyMap);
             System.err.println("公钥加密——私钥解密");
             String source = "这是一行没有任何意义的文字,你看完了等于没看,不是吗?";
             System.out.println("\r加密前文字:\r\n" + source);
             byte[] data = source.getBytes();
             byte[] encodedData = encryptByPublicKey(data, publicKey);
             System.out.println("加密后文字:\r\n" + new String(encodedData));
             byte[] decodedData =decryptByPrivateKey(encodedData, privateKey);
             String target = new String(decodedData);
             System.out.println("解密后文字: \r\n" + target);
         }

        public void testSign() throws Exception {
             Map<String, Object> keyMap = initKey();
             String publicKey =getPublicKey(keyMap);
             System.out.println(publicKey+"===================================");
            String privateKey = getPrivateKey(keyMap);
             System.err.println("私钥加密——公钥解密");
             String source = "这是一行测试RSA数字签名的无意义文字";
             System.out.println("原文字:\r\n" + source);
             byte[] data = source.getBytes();
             byte[] encodedData = encryptByPrivateKey(data, privateKey);
             System.out.println("加密后:\r\n" + new String(encodedData));
             byte[] decodedData = decryptByPublicKey(encodedData, publicKey);
             String target = new String(decodedData);
             System.out.println("解密后: \r\n" + target);
             System.err.println("私钥签名——公钥验证签名");
             String sign = sign(encodedData, privateKey);
             System.err.println("签名:\r" + sign);
             boolean status = verify(encodedData, publicKey, sign);
             System.err.println("验证结果:\r" + status);
         }

}

上面生成秘钥对的时候每次都生成的不一样,一般后台和app或其他设备交互只需要两对,写在配置文件中。

java rsa加密解密的更多相关文章

  1. 【转】 java RSA加密解密实现

    [转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...

  2. C#-java RSA加密解密

    using Org.BouncyCastle.Math; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Securi ...

  3. java RSA加密解密--转载

    原文地址:http://www.blogjava.net/icewee/archive/2012/05/19/378570.html 该工具类中用到了BASE64,需要借助第三方类库:javabase ...

  4. java RSA加密解密实现(含分段加密)

    该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detail/centralperk/50255 ...

  5. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  6. java RSA 加密解密

    package com.rsa; import java.security.KeyFactory; import java.security.KeyPair; import java.security ...

  7. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  8. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  9. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

随机推荐

  1. Myeclipse学习总结(1)——Myeclipse优化配置

    作为企业级开发最流行的工具,用Myeclipse开发java web程序无疑是最合适的,java web前端采用jsp来显示,myeclipse默认打开jsp的视图有卡顿的现象,那么如何更改jsp默认 ...

  2. ansible使用jinja2管理配置文件以及jinja2语法简介

    一.Jinja2介绍 Jinja2是基于python的模板引擎,功能比较类似于PHP的smarty,J2ee的Freemarker和velocity.它能完全支持unicode,并具有集成的沙箱执行环 ...

  3. 使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

    使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoD ...

  4. noip模拟赛 排序

    分析:因为序列是不严格单调的,所以挪动一个数其实就相当于把这个数给删了.如果a[i] < a[i-1],那么可以删掉a[i],也可以删掉a[i-1](!如果没考虑到这一点就只有90分),删后判断 ...

  5. Sencha Touch 2.1学习图表Chart概述

    Extjs.chart提供了可视化展现数据的能力,每个图表可以绑定到数据模型Ext.data.Store上, 并随着数据的变换可以自动的更新图表 一个图表对象包括图标风格.坐标(axes).序列(se ...

  6. 《高性能MySQL》笔记-BLOB与TEXT

    BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储. 实际上,它们分别属于两组不同的数据类型家族: 字符类型是TINYTEXT,SMALLTEXT,TEXT,M ...

  7. 同开三本DJANGO,需要提升一下本职工作的能力啦

    慢慢将一些概念固化到基因内,才有可能和SPRING MVC,MEAN之类的好好作比较吧. 全都是基于1.8版本的教材,爽!!!

  8. 51Nod——T 1113 矩阵快速幂

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 ...

  9. GDB 调试 PHP文件

    http://www.bo56.com/%E5%9C%A82016%E7%9A%84phpcon%E5%A4%A7%E4%BC%9A%E4%B8%8A%E7%9A%84%E5%88%86%E4%BA% ...

  10. 关于Openstack的浅层次认知

    Openstack浅析 英文好的应该直接跳到官方文档去看相关的介绍,以下是具体介绍的连接,包含Openstack的具体架构: http://docs.openstack.org/kilo/instal ...