Package com.bj58.spat.gaea.server.secure

Source Code of com.bj58.spat.gaea.server.secure.RSAHelper

/*
*  Copyright Beijing 58 Information Technology Co.,Ltd.
*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*
*        http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/
package com.bj58.spat.gaea.server.secure;

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
* RSAHelper
*
* @author Service Platform Architecture Team (spat@58.com)
*/
@SuppressWarnings("restriction")
public class RSAHelper {

  private PublicKey pubKey;
  private PrivateKey priKey;
  private Cipher pubDecryptCipher;
  private Cipher priDecryptCipher;
  private Cipher pubEncryptCipher;
  private Cipher priEncryptCipher;
  private String pubModulus;
  private String pubExponent;

  /**
   * 获取实例
   *
   * @return
   * @throws Exception
   */
  public static RSAHelper getInstance() throws Exception {
    return new RSAHelper();
  }
 
  /**
   *
   * @param pubModulus
   * @param pubExponent
   * @return
   * @throws Exception
   */
  public static RSAHelper getInstance(String pubModulus, String pubExponent) throws Exception {
    return new RSAHelper(pubModulus, pubExponent);
  }
 
  /**
   *
   * @throws Exception
   */
  private RSAHelper() throws Exception {
    // 生成公私钥对
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    keyPairGen.initialize(1024);
    KeyPair keyPair = keyPairGen.generateKeyPair();
    this.pubKey = keyPair.getPublic();
    this.priKey = keyPair.getPrivate();
   
    this.pubEncryptCipher = Cipher.getInstance("RSA");
    this.pubEncryptCipher.init(Cipher.ENCRYPT_MODE, this.pubKey);
    this.priEncryptCipher = Cipher.getInstance("RSA");
    this.priEncryptCipher.init(Cipher.ENCRYPT_MODE, this.priKey);

    this.pubDecryptCipher = Cipher.getInstance("RSA");
    this.pubDecryptCipher.init(Cipher.DECRYPT_MODE, this.pubKey);
    this.priDecryptCipher = Cipher.getInstance("RSA");
    this.priDecryptCipher.init(Cipher.DECRYPT_MODE, this.priKey);
   
    // 将公钥和模进行Base64编码
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKeySpec publicSpec = keyFactory.getKeySpec(this.pubKey, RSAPublicKeySpec.class);
    BigInteger modulus = publicSpec.getModulus();
    BigInteger exponent = publicSpec.getPublicExponent();
    BASE64Encoder base64Encoder = new BASE64Encoder();
    this.pubModulus = base64Encoder.encodeBuffer(modulus.toByteArray());
    this.pubExponent = base64Encoder.encodeBuffer(exponent.toByteArray());
  }

  /**
   *
   * @param pubModulus
   * @param pubExponent
   * @throws Exception
   */
  private RSAHelper(String pubModulus, String pubExponent) throws Exception {
    BASE64Decoder base64Decoder = new BASE64Decoder();
   
    // 创建公钥
    byte[] exponentBuf = base64Decoder.decodeBuffer(pubExponent);
    byte[] modulusBuf = base64Decoder.decodeBuffer(pubModulus);
    BigInteger big_exponent = new BigInteger(1, exponentBuf);
    BigInteger big_modulus = new BigInteger(1, modulusBuf);
    RSAPublicKeySpec keyspec = new RSAPublicKeySpec(big_modulus, big_exponent);
   
    KeyFactory keyfac = KeyFactory.getInstance("RSA");
    this.pubKey = keyfac.generatePublic(keyspec);
   
    this.pubEncryptCipher = Cipher.getInstance("RSA");
    this.pubEncryptCipher.init(Cipher.ENCRYPT_MODE, this.pubKey);
    this.pubDecryptCipher = Cipher.getInstance("RSA");
    this.pubDecryptCipher.init(Cipher.DECRYPT_MODE, this.pubKey);
   
    this.pubModulus = pubModulus;
    this.pubExponent = pubExponent;
  }

  /**
   * 公钥加密
   *
   * @param key 密钥
   * @param source 原文
   * @return 密文
   * @throws Exception
   */
  public byte[] encryptByPublicKey(byte[] source) throws Exception {
    return pubEncryptCipher.doFinal(source);
  }

  /**
   * 公钥解密
   *
   * @param key 密钥
   * @param dest 密文
   * @return 原文
   * @throws Exception
   */
  public byte[] decryptByPublicKey(byte[] dest) throws Exception {
    return pubDecryptCipher.doFinal(dest);
  }
 
  /**
   * 私钥加密
   *
   * @param key 密钥
   * @param source 原文
   * @return 密文
   * @throws Exception
   */
  public byte[] encryptByPrivateKey(byte[] source) throws Exception {
    if(priEncryptCipher == null) {
      throw new Exception("私钥不存在,加密失败");
    }
    return priEncryptCipher.doFinal(source);
  }

  /**
   * 私钥解密
   *
   * @param key 密钥
   * @param dest 密文
   * @return 原文
   * @throws Exception
   */
  public byte[] decryptByPrivateKey(byte[] dest) throws Exception {
    if(priDecryptCipher == null) {
      throw new Exception("私钥不存在,解密失败");
    }
    return priDecryptCipher.doFinal(dest);
  }

 
  public String getPubModulus() {
    return pubModulus;
  }

  public String getPubExponent() {
    return pubExponent;
  }
}
TOP

Related Classes of com.bj58.spat.gaea.server.secure.RSAHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.