package com.sharetronic.util;
import android.text.TextUtils;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import javax.crypto.Cipher;
/**
* Created by Administrator on 2018/8/13.
*/
public class RSAUtils {
/**
* RSA算法
*/
public static final String RSA = "RSA";
public static final String RSA_PUBLICE = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOxwTtyaIcJ9gjSRhbfgcb3xI\n" +
"j+huKQ7riOIauEs5JhUBrT+uoETV/YTkXPwUIPNg6+t0n1yS30S9CgcJRQkqyr8C\n" +
"pha45emMyWoiU781c/yJmar70HhhcLv08dzLgYYKUFohvqF3LNZ9AiMyEQeWGMM9\n" +
"dG3FoMyttuCf1111XwIDAQAB";
/**
* 加密方式,android的
*/
// public static final String TRANSFORMATION = "RSA/ECB/PKCS1Padding";
public static final String TRANSFORMATION = "RSA/None/NoPadding";
public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";
/**加密方式,标准jdk的*/
// public static final String TRANSFORMATION = "RSA/None/PKCS1Padding";
/** *//**
* RSA最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/** *//**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/*
public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes(); // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密
public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数
* */
/**
* 随机生成RSA密钥对
*
* @param keyLength 密钥长度,范围:512~2048
* 一般1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
kpg.initialize(keyLength);
return kpg.genKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
/**
* 得到公钥
*
* @param algorithm
* @param bysKey
* @return
*/
private static PublicKey getPublicKeyFromX509(String algorithm,
String bysKey) throws Exception {
byte[] decodedKey = Base64.decode(bysKey, Base64.DEFAULT);
X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodedKey);
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
return keyFactory.generatePublic(x509);
}
/**
* 使用公钥加密
*
* @param content 要加密的字符串
* @return
*/
public static String encryptByPublic(String content) {
try {
PublicKey pubkey = getPublicKeyFromX509(RSA, RSA_PUBLICE);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubkey);
byte plaintext[] = content.getBytes("UTF-8");
byte[] output = cipher.doFinal(plaintext);
String s = Base64.encodeToString(output,Base64.NO_WRAP);
return s;
} catch (Exception e) {
return null;
}
}
/**
* 先base64解码,再RSA公密解密
* content 要解密的字符串
* */
public static String decryptByPublicKey(String content){
try {
PublicKey pubkey = getPublicKeyFromX509(RSA, RSA_PUBLICE);
// 数据解密
Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, pubkey);
byte[] plaintext = Base64.decode(content, Base64.DEFAULT);
// byte[] plaintext = content.getBytes("UTF-8");
int inputLen = plaintext.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(plaintext, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(plaintext, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
// byte[] output = cipher.doFinal(plaintext);
return new String(decryptedData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 用公钥对字符串进行加密
*
* @param data 原文
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 得到公钥
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
KeyFactory kf = KeyFactory.getInstance(RSA);
PublicKey keyPublic = kf.generatePublic(keySpec);
// 加密数据
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(data);
}
/**
* 对Map的key进行排序
* @param map 要排序的map
* @return
*/
public static ArrayList<Map.Entry<String,String>> sort(Map<String, String> map){
ArrayList<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Map.Entry<String, String> o1,
Map.Entry<String, String> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
return list;
}
/**
* md5加密
* */
public static String md5(String string) {
if (TextUtils.isEmpty(string)) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(string.getBytes());
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}