最近开发用到加密解密,整理出来作为平时开发工具集!
Java 加解密工具类代码
pto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;
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;/*** <p>* RSA公钥/私钥/签名工具包* </p>* <p>* 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>* 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>* 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全* </p>* * @version 1.0*/
public class RSAUtils {public static final String ENCODING = "UTF-8";/**** deviceType 是安卓*/public static final String ANDROID = "android";/** *//*** 加密算法RSA*/public static final String KEY_ALGORITHM = "RSA";/** *//*** 签名算法*/
// public static final String SIGNATURE_ALGORITHM = "MD5withRSA";public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";/** *//*** 获取公钥的key*/private static final String PUBLIC_KEY = "RSAPublicKey";/*** 获取公钥的key对应的Encoded值*/public static final String PUBLIC_KEY_VALUE = "publicEncoded";/** *//*** 获取私钥的key*/private static final String PRIVATE_KEY = "RSAPrivateKey";/*** 获取私钥的key对应的Encoded值*/public static final String PRIVATE_KEY_VALUE = "privateEncoded";/** *//*** RSA最大加密明文大小*/private static final int MAX_ENCRYPT_BLOCK = 117;/** *//*** RSA最大解密密文大小*/private static final int MAX_DECRYPT_BLOCK = 128;/** *//*** <p>* 生成密钥对(公钥和私钥)* </p>* * @return* @throws Exception*/public static Map<String, Object> genKeyPair() throws Exception {KeyPairGenerator keyPairGen = Instance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = ateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) Public();RSAPrivateKey privateKey = (RSAPrivateKey) Private();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);keyMap.put(PUBLIC_KEY_VALUE, Encoded()));keyMap.put(PRIVATE_KEY_VALUE, Encoded()));return keyMap;}/** *//*** <p>* 用私钥对信息生成数字签名* </p>* * @param data 已加密数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {byte[] keyBytes = Base64.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);PrivateKey privateK = atePrivate(pkcs8KeySpec);Signature signature = Instance(SIGNATURE_ALGORITHM);signature.initSign(privateK);signature.update(data);de(signature.sign());}/** *//*** <p>* 校验数字签名* </p>* * @param data 已加密数据* @param publicKey 公钥(BASE64编码)* @param sign 数字签名* @return* @throws Exception*/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {byte[] keyBytes = Base64.decode(publicKey);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);PublicKey publicK = atePublic(keySpec);Signature signature = Instance(SIGNATURE_ALGORITHM);signature.initVerify(publicK);signature.update(data);return signature.verify(Base64.decode(sign));}/** *//*** <P>* 私钥解密* </p>* * @param encryptedData 已加密数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)throws Exception {byte[] keyBytes = Base64.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);Key privateK = atePrivate(pkcs8KeySpec);Cipher cipher = Algorithm());cipher.init(Cipher.DECRYPT_MODE, privateK);int inputLen = encryptedData.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(encryptedData, offSet, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = ByteArray();out.close();return decryptedData;}/** *//*** <p>* 公钥解密* </p>* * @param encryptedData 已加密数据* @param publicKey 公钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)throws Exception {byte[] keyBytes = Base64.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);Key publicK = atePublic(x509KeySpec);Cipher cipher = Algorithm());cipher.init(Cipher.DECRYPT_MODE, publicK);int inputLen = encryptedData.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(encryptedData, offSet, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = ByteArray();out.close();return decryptedData;}/** *//*** <p>* 公钥加密* </p>* * @param data 源数据* @param publicKey 公钥(BASE64编码)* @param deviceType 类型(IOS还是android)* @return* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, String publicKey, String deviceType)throws Exception {byte[] keyBytes = Base64.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);Key publicK = atePublic(x509KeySpec);// 对数据加密Cipher cipher = null;LowerCase().equals(ANDROID)){// 如果是安卓机cipher = Instance("RSA/ECB/NoPadding");}else{cipher = Instance("RSA/ECB/PKCS1Padding");}cipher.init(Cipher.ENCRYPT_MODE, publicK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = ByteArray();out.close();return encryptedData;}/** *//*** <p>* 私钥加密* </p>* * @param data 源数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String privateKey)throws Exception {byte[] keyBytes = Base64.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = Instance(KEY_ALGORITHM);Key privateK = atePrivate(pkcs8KeySpec);Cipher cipher = Algorithm());cipher.init(Cipher.ENCRYPT_MODE, privateK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = ByteArray();out.close();return encryptedData;}/** *//*** <p>* 获取私钥* </p>* * @param keyMap 密钥对* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) (PRIVATE_KEY);Encoded());}/** *//*** <p>* 获取公钥* </p>* * @param keyMap 密钥对* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) (PUBLIC_KEY);Encoded());}
}public static void main(String[] args) {String privateKey = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBALweWU/VoFjp2f/r H3qtkbsMHXH/9gulzlt4EOhC1HKFSrin3iASsAWsf09ARaKovZkAfoJ26yATZ01M aeA8inqKJMc8fKrZODon/qG4yr8ege1WgKdlhR6Op1EgyvLIYt47Adv/PqswBEh7 GXF2HRJKTvRi6eNy/fdPj7O2p7kZAgMBAAECgYEAgyKQ1cMwXOrfibPopMcb4I0I dbCdXu89U6v19UKpABAEz4ZNpIQCamId+Svvnv0L9f1PMzkcnKaKC2tqHuN1D9SL SSH/zmpkqQTjekJOAcdzkTHwhSnSm372d082U5i3hETn13UzTuyZ2ftET0VBAdU0 FnhoLImRkHm4q5Vt1EUCQQD5UtJujvNIM6qrYz86C7seCNSimF0cETR4YrfYxyB3 xpd7eODVSSbo5e+Zp8tN/f8+k7cEiAt5+Rxu0wxzf/MXAkEAwSfzZXSh4pPgJyex NE/rG66fvDgXH812rYgPEKGO3T48q6oEkQWGhQ5oReXacM9BogUnJF7HXuiRXN9X 7ocTTwJBALtAleUNHfCbRVJFTuZEiztqfHDFqCB9V4AW/GcmXt82Wu0UAyCNOVjv 4LzxhcLEwh/4hxszJhNsogsmHRLeBO8CQQC4G59Y7gG72N2IFMJILYDYouqoWgJY ktvy7cQGQyfMZB0qNuUhYdXlj2T+cudyLWrOxwCXHywDn8OmdU/4EJHrAkEAxGyn geIIWfNX9DEaQrGmP1nrPJm9mKUJqJo02PH0qshV4A/AGTuPXeSAxStnazLN+tkK SW/Wc8/QIrsSZsWqqQ==";String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8HllP1aBY6dn/6x96rZG7DB1x /*YLpc5beBDoQtRyhUq4p94gErAFrH9PQEWiqL2ZAH6CdusgE2dNTGngPIp6iiTH*/ PHyq2Tg6J/6huMq/HoHtVoCnZYUejqdRIMryyGLeOwHb/z6rMARIexlxdh0SSk70 Yunjcv33T4+ztqe5GQIDAQAB";String planStr = "abc123";System.out.println("加密前:" + planStr);String encodedData = de(privateKey, planStr);System.out.println("加密后:" + encodedData);String encryptData = CryptoUtil.decode(key, encodedData);System.out.println("解密后:" + encryptData);// JSONObject jsonObject=new JSONObject();//jsonObject.put("HX1002Data",encryptData);// String HX1002DataString();}
java加密解密签名及签名校验
package com.wl.wlp2ploansystemmonclients.support;import com.alibaba.fastjson.JSON;
import dec.binary.Base64;
import org.apachemons.lang.StringUtils;import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Map;public class RSASupport {private final static String SIGN_TYPE_RSA = "RSA";private final static String SIGN_ALGORITHMS = "SHA1WithRSA";private final static String CHARSETTING = "UTF-8";public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, String priKey) throws Exception {if (StringUtils.isEmpty(algorithm) || StringUtils.isEmpty(priKey)) {return null;}KeyFactory keyFactory = Instance(algorithm);byte[] encodedKey = adText(new Bytes())).getBytes();encodedKey = dec.binary.Base64.Bytes());atePrivate(new PKCS8EncodedKeySpec(encodedKey));}public static PublicKey getPublicKeyFromX509(String algorithm, String pubKey) throws Exception {if (StringUtils.isEmpty(algorithm) || StringUtils.isEmpty(pubKey)){return null;}KeyFactory keyFactory = Instance(algorithm);StringWriter writer = new StringWriter();StreamUtil.io(new InputStreamReader(new Bytes())), writer);byte[] encodeByte = String().getBytes();encodeByte = dec.binary.Base64.Bytes());atePublic(new X509EncodedKeySpec(encodeByte));}public static String sign(String plain, String prikey) throws Exception {if (StringUtils.isEmpty(plain) || StringUtils.isEmpty(prikey)){return null;}PrivateKey privatekey = getPrivateKeyFromPKCS8(SIGN_TYPE_RSA, prikey);Signature signature = Instance(SIGN_ALGORITHMS);signature.initSign(privatekey);signature.Bytes(CHARSETTING));byte[] signed = signature.sign();return new String(dec.deBase64(signed));}public static boolean virefy(String plain, String sign, String pubkey) throws Exception {if(StringUtils.isEmpty(plain) || StringUtils.isEmpty(sign) || StringUtils.isEmpty(pubkey)){return false;}PublicKey publicKey = getPublicKeyFromX509(SIGN_TYPE_RSA, pubkey);Signature signature = Instance(SIGN_ALGORITHMS);signature.initVerify(publicKey);signature.Bytes(CHARSETTING));return signature.verify(Base64.Bytes()));}public static void main(String[] args) throws Exception {String privateKey ="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALUPBJEw7FRhC1KRCnlen4+SoQ1TW1uVXAJvCYzvaeJS38121k7SYC+Abgb9MCnVS4OR9qgYZ5TidVuUZb/yX2paEZpAFRegHfaS1D49BVJQFRVE0KdxLf3BKfFhLzn03v7OK6ldbBvaia8MlZMp/L5zqn+csaiPS1ZbAnOz2o1nAgMBAAECgYAEM7oGaJ1DhBEQNH+Ku5B2c4+7UHDxWjENeWg+Vhwd/ZBmI1jr8WP8Fj33eY7Rmbqr7gpMcmyM/wh8PKBz6Psf4Z3WnvwU0Hv5pCuxzKowh+hKuOh87wTtWhgLMJcgdLr0aF7u1oVIxtSpeDOACEZd0OzaBDhX8ItGvIuDiUc5qQJBAP87JzB6TWYd5b4t1dMKxLGktZX6MVju8mXKGenUvTI8+Cnr73Hfk2cnEQUd6mAcUVNsE68mF2HGwHbJQuLQxlsCQQC1mqjIH3PJxc8qQ3JIp7YqVay8RGUCjsLPx04ErkxPm5tfhV8f33W/uWo2blzrIo6SE9lRSui31SiwLGKr4brlAkBwEx+QUAQwtSwvKJ1eQLpCb1s1clm8/Z//RpG+diZmKxOmBO5uCIkHoMX+gzZp4cVsZmb2YDmgO9BD2Pi/9IFFAkEAotr97vEdsd0dCaaQTw1vNAm+rNqcxq1lkFUH5vSzZFSEAiYlhvyqqHNLB2LzGr3TorYAFYGarniOU2aKWd9E7QJAPPd1k+m4sl36U4eFbAy3pQb0SfL66m4OSYr2B3NyVMktUlORwUGJO98/JjLI8gQLAlvocthHF2gyZfnMEQV7MA==n";String publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1DwSRMOxUYQtSkQp5Xp+PkqENU1tblVwCbwmM72niUt/NdtZO0mAvgG4G/TAp1UuDkfaoGGeU4nVblGW/8l9qWhGaQBUXoB32ktQ+PQVSUBUVRNCncS39wSnxYS859N7+ziupXWwb2omvDJWTKfy+c6p/nLGoj0tWWwJzs9qNZwIDAQABn";String str = " {n" +"t"CLOUDCHAIN": {n" +"tt"PLAIN": {n" +"ttt"serial": "1225010",n" +"ttt"paySerialNo": "4636",n" +"ttt"partnerId": "zjyj",n" +"ttt"partnerName": "中建一局",n" +"ttt"creditCode": "15827355-94d8-439d-8df6-a24b3215e154",n" +"ttt"corpNamePay": "开立企业全称",n" +"ttt"corpIdCodePay": "2352465484",n" +"ttt"corpNameAccept": "供应商企业全称",n" +"ttt"corpIdCodeAccept": "9766878",n" +"ttt"amount": "100000",n" +"ttt"dueDate": "20200115141920",n" +"ttt"status": "ISSUING",n" +"ttt"issueTime": "20200115151920",n" +"ttt"redeemTime": "20200115181920",n" +"ttt"finance": [{n" +"tttt"corpName": "融资企业全称",n" +"tttt"corpIdCode": "0200003419201226793",n" +"tttt"creditCode": "15827355-94d8-439d-8df6-a24b3215e154",n" +"tttt"amount": "100000",n" +"tttt"tme": "20200115141920"n" +"ttt}, {n" +"tttt"corpName": "融资企业全称2",n" +"tttt"corpIdCode": "02000034192012267932",n" +"tttt"creditCode": "15827355-94d8-439d-8df6-a24b3215e152",n" +"tttt"amount": "100000",n" +"tttt"tme": "20200115141922"n" +"ttt}]n" +"n" +"tt},n" +"tt"sign": "jTbutLG3L05gpUIr0h4ejNHB+Hk8HvgrmsuHl6cLyrG55U47/yAljdfbRECgvjCqkqYzYbihS0Ybw0V3Vkg+qKThGZ4xfzaNR2rhS/vrqCTnPD2niR99kTY5r914J0F/LdlJkvz/MUicB9/jD/0a1W6qJeecwbgIcHG7GnblCyw= "n" +"t}n" +"}";Map iaspdbMap =(Map) JSON.parse(str);String planStr ("CLOUDCHAIN"));Map iaspdbMap_ =(Map) JSON.parse(planStr);String planStr1 = ""PLAIN":"+ JSONString(iaspdbMap_.get("PLAIN"));String signStr = JSONString(iaspdbMap_.get("SIGN")).replace(""", "");;System.out.println("明文:"+planStr1);System.out.println(signStr);String sign_ = sign(planStr1,privateKey);System.out.println("密文:"+sign_);String sign = signStr;System.out.println(sign);System.out.println(virefy(planStr1, sign, publicKey));}
}
本文发布于:2024-02-04 06:56:51,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170701585053383.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |