1 changed files with 307 additions and 0 deletions
@ -0,0 +1,307 @@ |
|||||
|
package cn.chjyj.szwh.utils; |
||||
|
|
||||
|
import org.apache.commons.codec.binary.Base64; |
||||
|
|
||||
|
import javax.crypto.Cipher; |
||||
|
import javax.crypto.SecretKey; |
||||
|
import javax.crypto.SecretKeyFactory; |
||||
|
import javax.crypto.spec.DESedeKeySpec; |
||||
|
import java.security.*; |
||||
|
import java.security.spec.InvalidKeySpecException; |
||||
|
import java.security.spec.PKCS8EncodedKeySpec; |
||||
|
import java.security.spec.X509EncodedKeySpec; |
||||
|
|
||||
|
/** |
||||
|
* RSA 加密工具集合 |
||||
|
*/ |
||||
|
public class RSAUtils { |
||||
|
/** |
||||
|
* 生成公钥私钥对 |
||||
|
* |
||||
|
* @param keySize |
||||
|
* @param secrand |
||||
|
* @return key pair |
||||
|
*/ |
||||
|
public static KeyPair generateKeyPair(int keySize, SecureRandom secrand) { |
||||
|
try { |
||||
|
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); |
||||
|
if (null == secrand) { |
||||
|
keygen.initialize(keySize); |
||||
|
} else { |
||||
|
keygen.initialize(keySize, secrand); |
||||
|
} |
||||
|
return keygen.genKeyPair(); |
||||
|
} catch (NoSuchAlgorithmException e) { |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取公钥对象 |
||||
|
* |
||||
|
* @param publicKey |
||||
|
* @return public key |
||||
|
* @throws NoSuchAlgorithmException |
||||
|
* @throws InvalidKeySpecException |
||||
|
*/ |
||||
|
private static PublicKey getPublicKey(byte[] publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException { |
||||
|
X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKey); |
||||
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); |
||||
|
return keyFactory.generatePublic(spec); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取私钥对象 |
||||
|
* |
||||
|
* @param privateKey |
||||
|
* @return private key |
||||
|
* @throws NoSuchAlgorithmException |
||||
|
* @throws InvalidKeySpecException |
||||
|
*/ |
||||
|
private static PrivateKey getPrivateKey(byte[] privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException { |
||||
|
PKCS8EncodedKeySpec privateKeyPKCS8 = new PKCS8EncodedKeySpec(privateKey); |
||||
|
KeyFactory keyf = KeyFactory.getInstance("RSA"); |
||||
|
return keyf.generatePrivate(privateKeyPKCS8); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 公钥验证签名 |
||||
|
* |
||||
|
* @param publicKey |
||||
|
* @param data |
||||
|
* @param sign |
||||
|
* @return whether public key verify is passed |
||||
|
*/ |
||||
|
public static boolean publicKeyVerify(byte[] publicKey, byte[] data, byte[] sign) { |
||||
|
try { |
||||
|
Signature signature = Signature.getInstance("MD5withRSA"); |
||||
|
signature.initVerify(getPublicKey(publicKey)); |
||||
|
signature.update(data); |
||||
|
return signature.verify(sign); |
||||
|
} catch (Throwable e) { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 私钥签名 |
||||
|
* |
||||
|
* @param privateKey |
||||
|
* @param data |
||||
|
* @return private key sign |
||||
|
*/ |
||||
|
public static byte[] privateKeySign(byte[] privateKey, byte[] data) { |
||||
|
try { |
||||
|
Signature signature = Signature.getInstance("MD5withRSA"); |
||||
|
signature.initSign(getPrivateKey(privateKey)); |
||||
|
signature.update(data); |
||||
|
return signature.sign(); |
||||
|
} catch (Exception e) { |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 公钥加密 |
||||
|
* |
||||
|
* @param publicKey |
||||
|
* @param input |
||||
|
* @return public key encode result |
||||
|
*/ |
||||
|
public static byte[] publicKeyEncode(byte[] publicKey, byte[] input) { |
||||
|
try { |
||||
|
Cipher cipher = Cipher.getInstance("RSA"); |
||||
|
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey)); |
||||
|
return cipher.doFinal(input); |
||||
|
} catch (Exception e) { |
||||
|
return input; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 公钥解密 |
||||
|
* |
||||
|
* @param publicKey |
||||
|
* @param input |
||||
|
* @return public key decode result |
||||
|
*/ |
||||
|
public static byte[] publicKeyDecode(byte[] publicKey, byte[] input) { |
||||
|
try { |
||||
|
Cipher cipher = Cipher.getInstance("RSA"); |
||||
|
cipher.init(Cipher.DECRYPT_MODE, getPublicKey(publicKey)); |
||||
|
return cipher.doFinal(input); |
||||
|
} catch (Exception e) { |
||||
|
return input; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 私钥加密 |
||||
|
* |
||||
|
* @param privateKey |
||||
|
* @param input |
||||
|
* @return private key decode result |
||||
|
*/ |
||||
|
public static byte[] privateKeyDecode(byte[] privateKey, byte[] input) { |
||||
|
try { |
||||
|
Cipher cipher = Cipher.getInstance("RSA"); |
||||
|
cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(privateKey)); |
||||
|
return cipher.doFinal(input); |
||||
|
} catch (Exception e) { |
||||
|
return input; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 私钥解密 |
||||
|
* |
||||
|
* @param privateKey |
||||
|
* @param input |
||||
|
* @return private key encode result |
||||
|
*/ |
||||
|
public static byte[] privateKeyEncode(byte[] privateKey, byte[] input) { |
||||
|
try { |
||||
|
Cipher cipher = Cipher.getInstance("RSA"); |
||||
|
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey)); |
||||
|
return cipher.doFinal(input); |
||||
|
} catch (Exception e) { |
||||
|
return input; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* md5加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return md5 encode result |
||||
|
*/ |
||||
|
public static String md5Encode(String input) { |
||||
|
return encode(input, "MD5"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* sha1加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return sha1 encode result |
||||
|
*/ |
||||
|
public static String sha1Encode(String input) { |
||||
|
return encode(input, "SHA-1"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* base64加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return base64 encode result |
||||
|
*/ |
||||
|
public static String base64Encode(byte[] input) { |
||||
|
return Base64.encodeBase64String(input); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 加密方式,例如md5 sha256 等 |
||||
|
* @param input 待加密字符 |
||||
|
* @param type 加密类型 |
||||
|
* @return |
||||
|
*/ |
||||
|
|
||||
|
private static String encode(String input, String type) { |
||||
|
try { |
||||
|
MessageDigest messageDigest = MessageDigest.getInstance(type); |
||||
|
messageDigest.update(input.getBytes()); |
||||
|
return bypeToHex(messageDigest.digest()); |
||||
|
} catch (NoSuchAlgorithmException e) { |
||||
|
return input; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* base64解密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return base64 decode result |
||||
|
*/ |
||||
|
public static byte[] base64Decode(String input) { |
||||
|
return Base64.decodeBase64(input); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* sha512加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return sha2 encode result |
||||
|
*/ |
||||
|
public static String sha512Encode(String input) { |
||||
|
return encode(input, "SHA-512"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* sha256加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @return sha2 encode result |
||||
|
*/ |
||||
|
public static String sha256Encode(String input) { |
||||
|
return encode(input, "SHA-256"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 3-DES加密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @param key |
||||
|
* @return 3-DES encode result |
||||
|
*/ |
||||
|
|
||||
|
public static byte[] encrypt(String input, String key) { |
||||
|
try { |
||||
|
byte[] sha1Key = sha1Encode(key).getBytes("utf-8"); |
||||
|
DESedeKeySpec dks = new DESedeKeySpec(sha1Key); |
||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); |
||||
|
Cipher cipher = Cipher.getInstance("DESede"); |
||||
|
cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generateSecret(dks)); |
||||
|
return cipher.doFinal(input.getBytes("utf-8")); |
||||
|
} catch (Exception e) { |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* 3-DES解密 |
||||
|
* |
||||
|
* @param input |
||||
|
* @param key |
||||
|
* @return 3-DES decode result |
||||
|
*/ |
||||
|
public static String decrypt(byte[] input, String key) { |
||||
|
try { |
||||
|
byte[] sha1Key = sha1Encode(key).getBytes("utf-8"); |
||||
|
DESedeKeySpec dks = new DESedeKeySpec(sha1Key); |
||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); |
||||
|
SecretKey sKey = keyFactory.generateSecret(dks); |
||||
|
Cipher cipher = Cipher.getInstance("DESede"); |
||||
|
cipher.init(Cipher.DECRYPT_MODE, sKey); |
||||
|
byte ciphertext[] = cipher.doFinal(input); |
||||
|
return new String(ciphertext, "utf-8"); |
||||
|
} catch (Exception e) { |
||||
|
return ""; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 字节转为16进制 |
||||
|
* @param buffer |
||||
|
* @return hex |
||||
|
*/ |
||||
|
public static String bypeToHex(byte buffer[]) { |
||||
|
StringBuilder sb = new StringBuilder(buffer.length * 2); |
||||
|
for (int i = 0; i < buffer.length; i++) { |
||||
|
sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16)); |
||||
|
sb.append(Character.forDigit(buffer[i] & 15, 16)); |
||||
|
} |
||||
|
return sb.toString(); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue