俩个雷体。公钥加密,私钥解密。客户端服务端各有一套公钥私钥。客户端的公钥加密,使用服务端的私钥解密。代码是一样的。就是秘钥不同。 package com.pcitc.aims.project.common; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.nio.charset.Charset; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateCrtKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.RSAPrivateCrtKeySpec; import java.security.spec.RSAPublicKeySpec; import java.util.Base64; public class RSA { public final static String publicKey =""; public final static String privateKey =""; public static void main(String[] args) { String javaPublicKey = publicKeyFromXml(publicKey); String javaPrivateKey = privateKeyFromXml(privateKey); System.out.println("公钥.java: \n\r" + javaPublicKey); System.out.println("私钥.java: \n\r" + javaPrivateKey); String token1 = URLDecoderString(ticket); String userInfo = RSAUtil.privateDecrypt(token1.trim(),javaPrivateKey); System.out.println("88888------------"+userInfo); try { String miyao ="D15693F7-9ECA-4144-B41D-400E0963E967"; String token = RSAUtil.publicEncrypt(miyao, RSAUtil.getPublicKey(javaPublicKey)); System.out.println("token============"+getURLEncoderString(token)); } catch (Exception e) { e.printStackTrace(); } // System.out.println("解析後:" + a); // System.out.println("解析後:" + a.length()); // System.out.println("解析後:qujiabaogege"); } /** * 解码 * @param str * @return */ public static String URLDecoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLDecoder.decode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } /** * 转码 * @param str * @return */ public static String getURLEncoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } /** * java私钥转换成C#私钥 */ public static String privateKeyToXml(RSAPrivateCrtKey privateKey) { String modulusBase64 = Base64.getEncoder().encodeToString(privateKey.getModulus().toByteArray()); String modulus = modulusBase64.replace("\r", "").replace("\n", ""); String exponentBase64 = Base64.getEncoder() .encodeToString(privateKey.getPublicExponent().toByteArray()); String exponent = exponentBase64.replace("\r", "").replace("\n", ""); String pBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeP().toByteArray()); String p = pBase64.replace("\r", "").replace("\n", ""); String qBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeQ().toByteArray()); String q = qBase64.replace("\r", "").replace("\n", ""); String dpBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeExponentP().toByteArray()); String dp = dpBase64.replace("\r", "").replace("\n", ""); String dqBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeExponentQ().toByteArray()); String dq = dqBase64.replace("\r", "").replace("\n", ""); String dBase64 = Base64.getEncoder().encodeToString(privateKey.getPrivateExponent().toByteArray()); String d = dBase64.replace("\r", "").replace("\n", ""); String inverseQBase64 = Base64.getEncoder() .encodeToString(privateKey.getCrtCoefficient().toByteArray()); String inverseQ = inverseQBase64.replace("\r", "").replace("\n", ""); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("<RSAKeyValue>\n"); stringBuilder.append("<Modulus>").append(modulus).append("</Modulus>\n"); stringBuilder.append("<Exponent>").append(exponent).append("</Exponent>\n"); stringBuilder.append("<P>").append(p).append("</P>\n"); stringBuilder.append("<Q>").append(q).append("</Q>\n"); stringBuilder.append("<DP>").append(dp).append("</DP>\n"); stringBuilder.append("<DQ>").append(dq).append("</DQ>\n"); stringBuilder.append("<InverseQ>").append(inverseQ).append("</InverseQ>\n"); stringBuilder.append("<D>").append(d).append("</D>\n"); stringBuilder.append("</RSAKeyValue>"); return stringBuilder.toString(); } /** * java公钥转换成C#公钥 */ public static String publicKeyToXml(RSAPublicKey publicKey) { String modulusBase64 = Base64.getEncoder().encodeToString(publicKey.getModulus().toByteArray()); String modulus = modulusBase64.replace("\r", "").replace("\n", ""); String exponentBase64 = Base64.getEncoder() .encodeToString(publicKey.getPublicExponent().toByteArray()); String exponent = exponentBase64.replace("\r", "").replace("\n", ""); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("<RSAKeyValue>\n"); stringBuilder.append("<Modulus>").append(modulus).append("</Modulus>\n"); stringBuilder.append("<Exponent>").append(exponent).append("</Exponent>\n"); stringBuilder.append("</RSAKeyValue>"); return stringBuilder.toString(); } /** * C#私钥转换成java私钥 */ public static String privateKeyFromXml(String privateKeyXml) { privateKeyXml = privateKeyXml.replaceAll("\r", "").replaceAll("\n", ""); KeyFactory keyFactory; try { String modulusXml = privateKeyXml.substring(privateKeyXml.indexOf("<Modulus>") + 9, privateKeyXml.indexOf("</Modulus>")); BigInteger modulus = new BigInteger(1, Base64.getDecoder().decode(modulusXml)); String publicExponentXml = privateKeyXml.substring(privateKeyXml.indexOf("<Exponent>") + 10, privateKeyXml.indexOf("</Exponent>")); BigInteger publicExponent = new BigInteger(1, Base64.getDecoder().decode(publicExponentXml)); String privateExponentXml = privateKeyXml.substring(privateKeyXml.indexOf("<D>") + 3, privateKeyXml.indexOf("</D>")); BigInteger privateExponent = new BigInteger(1, Base64.getDecoder().decode(privateExponentXml)); String primePXml = privateKeyXml.substring(privateKeyXml.indexOf("<P>") + 3, privateKeyXml.indexOf("</P>")); BigInteger primeP = new BigInteger(1, Base64.getDecoder().decode(primePXml)); String primeQXml = privateKeyXml.substring(privateKeyXml.indexOf("<Q>") + 3, privateKeyXml.indexOf("</Q>")); BigInteger primeQ = new BigInteger(1, Base64.getDecoder().decode(primeQXml)); String primeExponentPXml = privateKeyXml.substring(privateKeyXml.indexOf("<DP>") + 4, privateKeyXml.indexOf("</DP>")); BigInteger primeExponentP = new BigInteger(1, Base64.getDecoder().decode(primeExponentPXml)); String primeExponentQXml = privateKeyXml.substring(privateKeyXml.indexOf("<DQ>") + 4, privateKeyXml.indexOf("</DQ>")); BigInteger primeExponentQ = new BigInteger(1, Base64.getDecoder().decode(primeExponentQXml)); String crtCoefficientXml = privateKeyXml.substring(privateKeyXml.indexOf("<InverseQ>") + 10, privateKeyXml.indexOf("</InverseQ>")); BigInteger crtCoefficient = new BigInteger(1, Base64.getDecoder().decode(crtCoefficientXml)); RSAPrivateCrtKeySpec rsaPriKey = new RSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, primeP, primeQ, primeExponentP, primeExponentQ, crtCoefficient); keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(rsaPriKey); byte[] bytes = Base64.getEncoder().encode(privateKey.getEncoded()); return new String(bytes, Charset.forName("utf-8")); } catch (Exception e) { System.err.println(e.toString()); } return null; } /** * C#公钥转换成java公钥 */ public static String publicKeyFromXml(String publicKeyXml) { KeyFactory keyFactory; publicKeyXml = publicKeyXml.replaceAll("\r", "").replaceAll("\n", ""); try { String modulusXml = publicKeyXml.substring(publicKeyXml.indexOf("<Modulus>") + 9, publicKeyXml.indexOf("</Modulus>")); BigInteger modulus = new BigInteger(1, Base64.getDecoder().decode(modulusXml)); String exponentXml = publicKeyXml.substring(publicKeyXml.indexOf("<Exponent>") + 10, publicKeyXml.indexOf("</Exponent>")); BigInteger publicExponent = new BigInteger(1, Base64.getDecoder().decode(exponentXml)); RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, publicExponent); keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(rsaPubKey); byte[] bytes = Base64.getEncoder().encode(publicKey.getEncoded()); return new String(bytes, Charset.forName("utf-8")); } catch (Exception e) { System.err.println(e.toString()); return null; } } }
===================================================================================================
package com.pcitc.aims.project.common; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; public class RSAUtil { public static final String CHARSET = "UTF-8"; public static final String RSA_ALGORITHM = "RSA"; // ALGORITHM ['ælgərɪð(ə)m] 算法的意思 public static Map<String, String> createKeys(int keySize) { // 为RSA算法创建一个KeyPairGenerator对象 KeyPairGenerator kpg; try { kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]"); } // 初始化KeyPairGenerator对象,密钥长度 kpg.initialize(keySize); // 生成密匙对 KeyPair keyPair = kpg.generateKeyPair(); // 得到公钥 Key publicKey = keyPair.getPublic(); String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded()); // 得到私钥 Key privateKey = keyPair.getPrivate(); String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded()); // map装载公钥和私钥 Map<String, String> keyPairMap = new HashMap<String, String>(); keyPairMap.put("publicKey", publicKeyStr); keyPairMap.put("privateKey",privateKeyStr); // 返回map return keyPairMap; } /** * 得到公钥 * @param publicKey 密钥字符串(经过base64编码) * @throws Exception */ public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException { // 通过X509编码的Key指令获得公钥对象 KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey)); RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec); return key; } /** * 得到私钥 * @param privateKey 密钥字符串(经过base64编码) * @throws Exception */ public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException { // 通过PKCS#8编码的Key指令获得私钥对象 KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)); RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec); return key; } /** * 公钥加密 * @param data * @param publicKey * @return */ public static String publicEncrypt(String data, RSAPublicKey publicKey) { try { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength())); } catch (Exception e) { throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e); } } /** * 私钥解密 * @param * @param privateKey * @return */ public static String privateDecrypt(String str, String privateKey) { try{ byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); //base64编码的私钥 byte[] decoded = Base64.decodeBase64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA解密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; } catch (Exception e) { return ""; } } /** * 私钥加密 * @param data * @param privateKey * @return */ public static String privateEncrypt(String data, RSAPrivateKey privateKey) { try { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); //每个Cipher初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。 cipher.init(Cipher.ENCRYPT_MODE, privateKey); return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength())); } catch (Exception e) { throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e); } } /** * 公钥解密 * @param data * @param publicKey * @return */ public static String publicDecrypt(String data, RSAPublicKey publicKey) { try { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, publicKey); return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET); } catch (Exception e) { throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e); } } //rsa切割解码 , ENCRYPT_MODE,加密数据 ,DECRYPT_MODE,解密数据 private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) { int maxBlock = 0; //最大块 if (opmode == Cipher.DECRYPT_MODE) { maxBlock = keySize / 8; } else { maxBlock = keySize / 8 - 11; } ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] buff; int i = 0; try { while (datas.length > offSet) { if (datas.length - offSet > maxBlock) { //可以调用以下的doFinal()方法完成加密或解密数据: buff = cipher.doFinal(datas, offSet, maxBlock); } else { buff = cipher.doFinal(datas, offSet, datas.length - offSet); } out.write(buff, 0, buff.length); i++; offSet = i * maxBlock; } } catch (Exception e) { throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e); } byte[] resultDatas = out.toByteArray(); return resultDatas; } }