- package test;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.math.BigInteger;
- import java.security.Key;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.PublicKey;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.RSAPrivateKeySpec;
- import java.security.spec.RSAPublicKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- import java.util.HashMap;
- import common.tools.RSAUtil;
- import javax.crypto.Cipher;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- import com.sun.org.apache.xml.internal.security.utils.Base64;
- import mas.Field;
- import mas.MasMain;
- import mas.field.ReturnDataVO;
- import mas.http.TerminalClient;
- public class StorageTest {
- public static final String KEY_ALGORITHM = "RSA";
- public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
- private static final String PUBLIC_KEY = "RSAPublicKey";
- private static final String PRIVATE_KEY = "RSAPrivateKey";
- //RSA加密后的base64
- String serc = "AiX8oIzUDi6mHU+C9o7e8Z9gUoZs54+mH6y8/u0kUdy8pYAOkvn4RMoUKKFJn+VlqS9/s4QS7U2jBZ4wGG68mGmIDBXy2KMfXWDC8W9X2Xi9PvqlTMWGqdJ4LxHf1LUBWS81jjcY6MLTcou15rjlFfLLyAL5enEQ3ZpP3MDV19w=";
- //原串
- String orgStr = "fDdr/Z253xoWArVPy155QOmXDinjAoos";
- private static BouncyCastleProvider bcProvider = new BouncyCastleProvider();
- //其它测试
- public void test0() throws Exception{
- String filePath =System.getProperty("user.dir") + "/mas.properties" ;
- MasMain mm = new MasMain();
- mm.getDataFormater(filePath, "17");
- //ReturnDataVO returnvo = mm.getDataFormater(filePath, "03");
- //HashMap<String, Field> hm = mm.smartAnalysis(returnvo);
- //得到120数据
- //byte[] bData = hm.get("120").bValue;
- }
- public void test4() throws Exception{
- String filePath =System.getProperty("user.dir") + "/mas.properties" ;
- MasMain mm = new MasMain();
- byte[] bData = common.tools.Base64.getByteFromBASE64(serc);
- byte[] pubKeyBytes = mm.getPubKey("D://MX090723092600000034.pub.der");
- byte[] pubRndBytes = mm.getPubKey("D://MX090723092600000034ran.txt");
- RSAPublicKey pubKey =common.tools.RSAUtil.generateRSAPublicKey(pubRndBytes, pubKeyBytes);
- byte[] decrptBytes = common.tools.RSAUtil.decrypt(pubKey, bData);
- String base64 = common.tools.Base64.getBASE64FromByte(decrptBytes);
- System.out.println("解密后:" + base64);
- }
- //私钥加密 -- 公钥解密 方法
- public void test1() throws Exception{
- String filePath =System.getProperty("user.dir") + "/mas.properties" ;
- MasMain mm = new MasMain();
- byte[] bData = common.tools.Base64.getByteFromBASE64(serc);
- byte[] pubKeyBytes = mm.getPubKey("D://MX090723092600000034.pub.der");
- X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKeyBytes);
- KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
- Key publicKey = keyFactory.generatePublic(x509KeySpec);
- // 对数据解密
- byte[] storKeyByte = common.tools.RSAUtil.decrypt(publicKey, bData);
- String base64 = common.tools.Base64.getBASE64FromByte(storKeyByte);
- System.out.println("解密后:" + base64 );
- }
- //RSA ran部分,解密加密串
- public void test2() throws Exception{
- MasMain mm = new MasMain();
- byte[] priRanByte = mm.getPubKey("D://MX090723092600000034ran.txt"); //指数文件
- byte[] pubExpByte =Base64.decode("AQAB");
- RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
- priRanByte), new BigInteger(pubExpByte));
- KeyFactory keyFac = KeyFactory.getInstance("RSA",new BouncyCastleProvider());
- Key pubKey = keyFac.generatePublic(pubKeySpec);
- byte[] storKeyByte = RSAUtil.decrypt(pubKey , common.tools.Base64.getByteFromBASE64(serc));
- String base64 = common.tools.Base64.getBASE64FromByte(storKeyByte);
- System.out.println("解密后:" + base64);
- }
- public void test3() throws Exception{
- KeyPair keyPair=RSAUtil.generateKeyPair();
- RSAPublicKey pub=(RSAPublicKey)keyPair.getPublic();
- RSAPrivateKey pri=(RSAPrivateKey)keyPair.getPrivate();
- byte[] pubByte=pub.getPublicExponent().toByteArray();
- byte[] priByte=pri.getPrivateExponent().toByteArray();
- byte[] priRanByte=pri.getModulus().toByteArray();
- byte[] pubRanByte=pub.getModulus().toByteArray();
- byte[] pubKey=pub.getEncoded();
- byte[] priKey=pri.getEncoded();
- System.out.println(common.tools.Base64.getBASE64FromByte(priRanByte));
- System.out.println(common.tools.Base64.getBASE64FromByte(pubRanByte));
- }
- }
package test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import common.tools.RSAUtil;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import mas.Field;
import mas.MasMain;
import mas.field.ReturnDataVO;
import mas.http.TerminalClient;
public class StorageTest {
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
//RSA加密后的base64
String serc = "AiX8oIzUDi6mHU+C9o7e8Z9gUoZs54+mH6y8/u0kUdy8pYAOkvn4RMoUKKFJn+VlqS9/s4QS7U2jBZ4wGG68mGmIDBXy2KMfXWDC8W9X2Xi9PvqlTMWGqdJ4LxHf1LUBWS81jjcY6MLTcou15rjlFfLLyAL5enEQ3ZpP3MDV19w=";
//原串
String orgStr = "fDdr/Z253xoWArVPy155QOmXDinjAoos";
private static BouncyCastleProvider bcProvider = new BouncyCastleProvider();
//其它测试
public void test0() throws Exception{
String filePath =System.getProperty("user.dir") + "/mas.properties" ;
MasMain mm = new MasMain();
mm.getDataFormater(filePath, "17");
//ReturnDataVO returnvo = mm.getDataFormater(filePath, "03");
//HashMap<String, Field> hm = mm.smartAnalysis(returnvo);
//得到120数据
//byte[] bData = hm.get("120").bValue;
}
public void test4() throws Exception{
String filePath =System.getProperty("user.dir") + "/mas.properties" ;
MasMain mm = new MasMain();
byte[] bData = common.tools.Base64.getByteFromBASE64(serc);
byte[] pubKeyBytes = mm.getPubKey("D://MX090723092600000034.pub.der");
byte[] pubRndBytes = mm.getPubKey("D://MX090723092600000034ran.txt");
RSAPublicKey pubKey =common.tools.RSAUtil.generateRSAPublicKey(pubRndBytes, pubKeyBytes);
byte[] decrptBytes = common.tools.RSAUtil.decrypt(pubKey, bData);
String base64 = common.tools.Base64.getBASE64FromByte(decrptBytes);
System.out.println("解密后:" + base64);
}
//私钥加密 -- 公钥解密 方法
public void test1() throws Exception{
String filePath =System.getProperty("user.dir") + "/mas.properties" ;
MasMain mm = new MasMain();
byte[] bData = common.tools.Base64.getByteFromBASE64(serc);
byte[] pubKeyBytes = mm.getPubKey("D://MX090723092600000034.pub.der");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据解密
byte[] storKeyByte = common.tools.RSAUtil.decrypt(publicKey, bData);
String base64 = common.tools.Base64.getBASE64FromByte(storKeyByte);
System.out.println("解密后:" + base64 );
}
//RSA ran部分,解密加密串
public void test2() throws Exception{
MasMain mm = new MasMain();
byte[] priRanByte = mm.getPubKey("D://MX090723092600000034ran.txt"); //指数文件
byte[] pubExpByte =Base64.decode("AQAB");
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
priRanByte), new BigInteger(pubExpByte));
KeyFactory keyFac = KeyFactory.getInstance("RSA",new BouncyCastleProvider());
Key pubKey = keyFac.generatePublic(pubKeySpec);
byte[] storKeyByte = RSAUtil.decrypt(pubKey , common.tools.Base64.getByteFromBASE64(serc));
String base64 = common.tools.Base64.getBASE64FromByte(storKeyByte);
System.out.println("解密后:" + base64);
}
public void test3() throws Exception{
KeyPair keyPair=RSAUtil.generateKeyPair();
RSAPublicKey pub=(RSAPublicKey)keyPair.getPublic();
RSAPrivateKey pri=(RSAPrivateKey)keyPair.getPrivate();
byte[] pubByte=pub.getPublicExponent().toByteArray();
byte[] priByte=pri.getPrivateExponent().toByteArray();
byte[] priRanByte=pri.getModulus().toByteArray();
byte[] pubRanByte=pub.getModulus().toByteArray();
byte[] pubKey=pub.getEncoded();
byte[] priKey=pri.getEncoded();
System.out.println(common.tools.Base64.getBASE64FromByte(priRanByte));
System.out.println(common.tools.Base64.getBASE64FromByte(pubRanByte));
}
}
不要问,自已看代码。
- package common.tools;
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;ng
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.NoSuchPaddingException;
- import javax.crypto.ShortBufferException;
- import java.security.InvalidKeyException;
- import java.security.Key;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.NoSuchAlgorithmException;
- import java.security.SecureRandom;
- import java.security.spec.RSAPublicKeySpec;
- import java.security.spec.RSAPrivateKeySpec;
- import java.security.spec.InvalidKeySpecException;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.math.BigInteger;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- public class RSAUtil {
- private static BouncyCastleProvider bcProvider = new BouncyCastleProvider();
- /**
- *
- * 生成密钥对
- *
- * @return KeyPair
- *
- * @throws EncryptException
- *
- */
- public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
- KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",bcProvider);
- final int KEY_SIZE = 1024;
- keyPairGen.initialize(KEY_SIZE, new SecureRandom());
- KeyPair keyPair = keyPairGen.genKeyPair();
- return keyPair;
- }
- /**
- *
- * 生成公钥
- *
- * @param modulus
- *
- * @param publicExponent
- *
- * @return RSAPublicKey
- *
- * @throws EncryptException
- *
- */
- public static RSAPublicKey generateRSAPublicKey(byte[] modulus,
- byte[] publicExponent) throws NoSuchAlgorithmException,
- InvalidKeySpecException {
- KeyFactory keyFac = null;
- keyFac = KeyFactory.getInstance("RSA",bcProvider);
- RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
- modulus), new BigInteger(publicExponent));
- return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);
- }
- /**
- *
- * 生成私钥
- *
- * @param modulus
- *
- * @param privateExponent
- *
- * @return RSAPrivateKey
- *
- * @throws EncryptException
- *
- */
- public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,
- byte[] privateExponent) throws NoSuchAlgorithmException,
- InvalidKeySpecException {
- KeyFactory keyFac = null;
- keyFac = KeyFactory.getInstance("RSA",bcProvider);
- RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(
- modulus), new BigInteger(privateExponent));
- return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
- }
- /**
- *
- * 加密
- *
- * @param key
- * 加密的密钥
- *
- * @param data
- * 待加密的明文数据
- *
- * @return 加密后的数据
- *
- * @throws EncryptException
- *
- */
- public static byte[] encrypt(Key key, byte[] data)
- throws NoSuchPaddingException, NoSuchAlgorithmException,
- InvalidKeyException, ShortBufferException, IllegalBlockSizeException,BadPaddingException {
- Cipher cipher = Cipher.getInstance("RSA",bcProvider);
- cipher.init(Cipher.ENCRYPT_MODE, key);
- int blockSize = cipher.getBlockSize();
- //System.out.println(blockSize);
- // 获得加密块大小,如:加密前数据为128个byte,而key_size=1024
- // 加密块大小为127
- // byte,加密后为128个byte;因此共有2个加密块,第一个127
- // byte第二个为1个byte
- int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小
- int leavedSize = data.length % blockSize;
- int blocksSize = leavedSize != 0 ? data.length / blockSize + 1
- : data.length / blockSize;
- byte[] raw = new byte[outputSize * blocksSize];
- int i = 0;
- while (data.length - i * blockSize > 0) {
- if (data.length - i * blockSize > blockSize)
- cipher.doFinal(data, i * blockSize, blockSize, raw, i
- * outputSize);
- else
- cipher.doFinal(data, i * blockSize,
- data.length - i * blockSize, raw, i * outputSize);
- i++;
- }
- return raw;
- }
- /**
- *
- * 解密
- *
- * @param key
- * 解密的密钥
- *
- * @param raw
- * 已经加密的数据
- *
- * @return 解密后的明文
- *
- * @throws EncryptException
- *
- */
- public static byte[] decrypt(Key key, byte[] raw)
- throws NoSuchPaddingException, NoSuchAlgorithmException,
- InvalidKeyException, ShortBufferException,BadPaddingException,IllegalBlockSizeException,IOException {
- Cipher cipher = Cipher.getInstance("RSA",bcProvider);
- cipher.init(cipher.DECRYPT_MODE, key);
- int blockSize = cipher.getBlockSize();
- ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
- int j = 0;
- while (raw.length - j * blockSize > 0) {
- bout.write(cipher.doFinal(raw, j * blockSize, blockSize));
- j++;
- }
- return bout.toByteArray();
- }
- }