RSA密钥生成、加密解密、签名验签
RSA 非对称加密
公钥加密,私钥解密
私钥签名,公钥验签
下面是生成随机密钥对:
- //随机生成密钥对
- KeyPairGenerator keyPairGen = null;
- try {
- keyPairGen = KeyPairGenerator.getInstance("RSA");
- } catch (NoSuchAlgorithmException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 初始化密钥对生成器,密钥大小为96-1024位
- keyPairGen.initialize(1024, new SecureRandom());
- // 生成一个密钥对,保存在keyPair中
- KeyPair keyPair = keyPairGen.generateKeyPair();
- // 得到私钥
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- // 得到公钥
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- String publicKeyString = Base64.encode(publicKey.getEncoded());
- // 得到私钥字符串
- String privateKeyString = Base64.encode(privateKey.getEncoded());
加密解密:
- /**
- * Bestpay.com.cn Inc.
- * Copyright (c) 2011-2016 All Rights Reserved.
- */
- package com.bestpay.posprouter.utils;/**
- * Created by lxn on 2016/7/21.
- */
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.security.InvalidKeyException;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.NoSuchAlgorithmException;
- import java.security.SecureRandom;
- 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 javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.NoSuchPaddingException;
- public class RSAEncrypt {
- /**
- * 字节数据转字符串专用集合
- */
- private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6',
- '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
- /**
- * 随机生成密钥对
- */
- public static void genKeyPair(String filePath) {
- // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
- KeyPairGenerator keyPairGen = null;
- try {
- keyPairGen = KeyPairGenerator.getInstance("RSA");
- } catch (NoSuchAlgorithmException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 初始化密钥对生成器,密钥大小为96-1024位
- keyPairGen.initialize(1024,new SecureRandom());
- // 生成一个密钥对,保存在keyPair中
- KeyPair keyPair = keyPairGen.generateKeyPair();
- // 得到私钥
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- // 得到公钥
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- try {
- // 得到公钥字符串
- String publicKeyString = Base64.encode(publicKey.getEncoded());
- // 得到私钥字符串
- String privateKeyString = Base64.encode(privateKey.getEncoded());
- // 将密钥对写入到文件
- FileWriter pubfw = new FileWriter(filePath + "/publicKey.keystore");
- FileWriter prifw = new FileWriter(filePath + "/privateKey.keystore");
- BufferedWriter pubbw = new BufferedWriter(pubfw);
- BufferedWriter pribw = new BufferedWriter(prifw);
- pubbw.write(publicKeyString);
- pribw.write(privateKeyString);
- pubbw.flush();
- pubbw.close();
- pubfw.close();
- pribw.flush();
- pribw.close();
- prifw.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 从文件中输入流中加载公钥
- *
- * @param in
- * 公钥输入流
- * @throws Exception
- * 加载公钥时产生的异常
- */
- public static String loadPublicKeyByFile(String path) throws Exception {
- try {
- BufferedReader br = new BufferedReader(new FileReader(path
- + "/publicKey.keystore"));
- String readLine = null;
- StringBuilder sb = new StringBuilder();
- while ((readLine = br.readLine()) != null) {
- sb.append(readLine);
- }
- br.close();
- return sb.toString();
- } catch (IOException e) {
- throw new Exception("公钥数据流读取错误");
- } catch (NullPointerException e) {
- throw new Exception("公钥输入流为空");
- }
- }
- /**
- * 从字符串中加载公钥
- *
- * @param publicKeyStr
- * 公钥数据字符串
- * @throws Exception
- * 加载公钥时产生的异常
- */
- public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr)
- throws Exception {
- try {
- byte[] buffer = Base64.decode(publicKeyStr);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
- return (RSAPublicKey) keyFactory.generatePublic(keySpec);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此算法");
- } catch (InvalidKeySpecException e) {
- throw new Exception("公钥非法");
- } catch (NullPointerException e) {
- throw new Exception("公钥数据为空");
- }
- }
- /**
- * 从文件中加载私钥
- *
- * @param keyFileName
- * 私钥文件名
- * @return 是否成功
- * @throws Exception
- */
- public static String loadPrivateKeyByFile(String path) throws Exception {
- try {
- BufferedReader br = new BufferedReader(new FileReader(path
- + "/privateKey.keystore"));
- String readLine = null;
- StringBuilder sb = new StringBuilder();
- while ((readLine = br.readLine()) != null) {
- sb.append(readLine);
- }
- br.close();
- return sb.toString();
- } catch (IOException e) {
- throw new Exception("私钥数据读取错误");
- } catch (NullPointerException e) {
- throw new Exception("私钥输入流为空");
- }
- }
- public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)
- throws Exception {
- try {
- byte[] buffer = Base64.decode(privateKeyStr);
- PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此算法");
- } catch (InvalidKeySpecException e) {
- throw new Exception("私钥非法");
- } catch (NullPointerException e) {
- throw new Exception("私钥数据为空");
- }
- }
- /**
- * 公钥加密过程
- *
- * @param publicKey
- * 公钥
- * @param plainTextData
- * 明文数据
- * @return
- * @throws Exception
- * 加密过程中的异常信息
- */
- public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)
- throws Exception {
- if (publicKey == null) {
- throw new Exception("加密公钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
- byte[] output = cipher.doFinal(plainTextData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此加密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("加密公钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("明文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("明文数据已损坏");
- }
- }
- /**
- * 私钥加密过程
- *
- * @param privateKey
- * 私钥
- * @param plainTextData
- * 明文数据
- * @return
- * @throws Exception
- * 加密过程中的异常信息
- */
- public static byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData)
- throws Exception {
- if (privateKey == null) {
- throw new Exception("加密私钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, privateKey);
- byte[] output = cipher.doFinal(plainTextData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此加密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("加密私钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("明文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("明文数据已损坏");
- }
- }
- /**
- * 私钥解密过程
- *
- * @param privateKey
- * 私钥
- * @param cipherData
- * 密文数据
- * @return 明文
- * @throws Exception
- * 解密过程中的异常信息
- */
- public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)
- throws Exception {
- if (privateKey == null) {
- throw new Exception("解密私钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.DECRYPT_MODE, privateKey);
- byte[] output = cipher.doFinal(cipherData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此解密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("解密私钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("密文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("密文数据已损坏");
- }
- }
- /**
- * 公钥解密过程
- *
- * @param publicKey
- * 公钥
- * @param cipherData
- * 密文数据
- * @return 明文
- * @throws Exception
- * 解密过程中的异常信息
- */
- public static byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)
- throws Exception {
- if (publicKey == null) {
- throw new Exception("解密公钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.DECRYPT_MODE, publicKey);
- byte[] output = cipher.doFinal(cipherData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此解密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("解密公钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("密文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("密文数据已损坏");
- }
- }
- /**
- * 字节数据转十六进制字符串
- *
- * @param data
- * 输入数据
- * @return 十六进制内容
- */
- public static String byteArrayToString(byte[] data) {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < data.length; i++) {
- // 取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移
- stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
- // 取出字节的低四位 作为索引得到相应的十六进制标识符
- stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
- if (i < data.length - 1) {
- stringBuilder.append(' ');
- }
- }
- return stringBuilder.toString();
- }
- }
签名验签:
- /**
- * Bestpay.com.cn Inc.
- * Copyright (c) 2011-2016 All Rights Reserved.
- */
- package com.bestpay.posprouter.utils;/**
- * Created by lxn on 2016/7/21.
- */
- import java.security.KeyFactory;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- /**
- * @author lxn
- * @version Id: RSASignature.java, v 0.1 2016/7/21 16:14 lxn Exp $$
- */
- public class RSASignature {
- /**
- * 签名算法
- */
- public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
- /**
- * RSA签名
- * @param content 待签名数据
- * @param privateKey 商户私钥
- * @param encode 字符集编码
- * @return 签名值
- */
- public static String sign(String content, String privateKey, String encode)
- {
- try
- {
- PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
- KeyFactory keyf = KeyFactory.getInstance("RSA");
- PrivateKey priKey = keyf.generatePrivate(priPKCS8);
- java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
- signature.initSign(priKey);
- signature.update( content.getBytes(encode));
- byte[] signed = signature.sign();
- return Base64.encode(signed);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return null;
- }
- public static String sign(String content, String privateKey)
- {
- try
- {
- PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
- KeyFactory keyf = KeyFactory.getInstance("RSA");
- PrivateKey priKey = keyf.generatePrivate(priPKCS8);
- java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
- signature.initSign(priKey);
- signature.update( content.getBytes());
- byte[] signed = signature.sign();
- return Base64.encode(signed);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * RSA验签名检查
- * @param content 待签名数据
- * @param sign 签名值
- * @param publicKey 分配给开发商公钥
- * @param encode 字符集编码
- * @return 布尔值
- */
- public static boolean doCheck(String content, String sign, String publicKey,String encode)
- {
- try
- {
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- byte[] encodedKey = Base64.decode(publicKey);
- PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
- java.security.Signature signature = java.security.Signature
- .getInstance(SIGN_ALGORITHMS);
- signature.initVerify(pubKey);
- signature.update( content.getBytes(encode) );
- boolean bverify = signature.verify( Base64.decode(sign) );
- return bverify;
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return false;
- }
- public static boolean doCheck(String content, String sign, String publicKey)
- {
- try
- {
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- byte[] encodedKey = Base64.decode(publicKey);
- PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
- java.security.Signature signature = java.security.Signature
- .getInstance(SIGN_ALGORITHMS);
- signature.initVerify(pubKey);
- signature.update( content.getBytes() );
- boolean bverify = signature.verify( Base64.decode(sign) );
- return bverify;
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return false;
- }
- }
BASE64:
- /**
- * Bestpay.com.cn Inc.
- * Copyright (c) 2011-2016 All Rights Reserved.
- */
- package com.bestpay.posprouter.utils;/**
- * Created by lxn on 2016/7/21.
- */
- /**
- * @author lxn
- * @version Id: Base64.java, v 0.1 2016/7/21 16:19 lxn Exp $$
- */
- public final class Base64 {
- static private final int BASELENGTH = 128;
- static private final int LOOKUPLENGTH = 64;
- static private final int TWENTYFOURBITGROUP = 24;
- static private final int EIGHTBIT = 8;
- static private final int SIXTEENBIT = 16;
- static private final int FOURBYTE = 4;
- static private final int SIGN = -128;
- static private final char PAD = '=';
- static private final boolean fDebug = false;
- static final private byte[] base64Alphabet = new byte[BASELENGTH];
- static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
- static {
- for (int i = 0; i < BASELENGTH; ++i) {
- base64Alphabet[i] = -1;
- }
- for (int i = 'Z'; i >= 'A'; i--) {
- base64Alphabet[i] = (byte) (i - 'A');
- }
- for (int i = 'z'; i >= 'a'; i--) {
- base64Alphabet[i] = (byte) (i - 'a' + 26);
- }
- for (int i = '9'; i >= '0'; i--) {
- base64Alphabet[i] = (byte) (i - '0' + 52);
- }
- base64Alphabet['+'] = 62;
- base64Alphabet['/'] = 63;
- for (int i = 0; i <= 25; i++) {
- lookUpBase64Alphabet[i] = (char) ('A' + i);
- }
- for (int i = 26, j = 0; i <= 51; i++, j++) {
- lookUpBase64Alphabet[i] = (char) ('a' + j);
- }
- for (int i = 52, j = 0; i <= 61; i++, j++) {
- lookUpBase64Alphabet[i] = (char) ('0' + j);
- }
- lookUpBase64Alphabet[62] = (char) '+';
- lookUpBase64Alphabet[63] = (char) '/';
- }
- private static boolean isWhiteSpace(char octect) {
- return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
- }
- private static boolean isPad(char octect) {
- return (octect == PAD);
- }
- private static boolean isData(char octect) {
- return (octect < BASELENGTH && base64Alphabet[octect] != -1);
- }
- /**
- * Encodes hex octects into Base64
- *
- * @param binaryData Array containing binaryData
- * @return Encoded Base64 array
- */
- public static String encode(byte[] binaryData) {
- if (binaryData == null) {
- return null;
- }
- int lengthDataBits = binaryData.length * EIGHTBIT;
- if (lengthDataBits == 0) {
- return "";
- }
- int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
- int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
- int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
- char encodedData[] = null;
- encodedData = new char[numberQuartet * 4];
- byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
- int encodedIndex = 0;
- int dataIndex = 0;
- if (fDebug) {
- System.out.println("number of triplets = " + numberTriplets);
- }
- for (int i = 0; i < numberTriplets; i++) {
- b1 = binaryData[dataIndex++];
- b2 = binaryData[dataIndex++];
- b3 = binaryData[dataIndex++];
- if (fDebug) {
- System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
- }
- l = (byte) (b2 & 0x0f);
- k = (byte) (b1 & 0x03);
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
- byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
- if (fDebug) {
- System.out.println("val2 = " + val2);
- System.out.println("k4 = " + (k << 4));
- System.out.println("vak = " + (val2 | (k << 4)));
- }
- encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
- }
- // form integral number of 6-bit groups
- if (fewerThan24bits == EIGHTBIT) {
- b1 = binaryData[dataIndex];
- k = (byte) (b1 & 0x03);
- if (fDebug) {
- System.out.println("b1=" + b1);
- System.out.println("b1<<2 = " + (b1 >> 2));
- }
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
- encodedData[encodedIndex++] = PAD;
- encodedData[encodedIndex++] = PAD;
- } else if (fewerThan24bits == SIXTEENBIT) {
- b1 = binaryData[dataIndex];
- b2 = binaryData[dataIndex + 1];
- l = (byte) (b2 & 0x0f);
- k = (byte) (b1 & 0x03);
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
- encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
- encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
- encodedData[encodedIndex++] = PAD;
- }
- return new String(encodedData);
- }
- /**
- * Decodes Base64 data into octects
- *
- * @param encoded string containing Base64 data
- * @return Array containind decoded data.
- */
- public static byte[] decode(String encoded) {
- if (encoded == null) {
- return null;
- }
- char[] base64Data = encoded.toCharArray();
- // remove white spaces
- int len = removeWhiteSpace(base64Data);
- if (len % FOURBYTE != 0) {
- return null;//should be divisible by four
- }
- int numberQuadruple = (len / FOURBYTE);
- if (numberQuadruple == 0) {
- return new byte[0];
- }
- byte decodedData[] = null;
- byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
- char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
- int i = 0;
- int encodedIndex = 0;
- int dataIndex = 0;
- decodedData = new byte[(numberQuadruple) * 3];
- for (; i < numberQuadruple - 1; i++) {
- if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
- || !isData((d3 = base64Data[dataIndex++]))
- || !isData((d4 = base64Data[dataIndex++]))) {
- return null;
- }//if found "no data" just return null
- b1 = base64Alphabet[d1];
- b2 = base64Alphabet[d2];
- b3 = base64Alphabet[d3];
- b4 = base64Alphabet[d4];
- decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
- }
- if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
- return null;//if found "no data" just return null
- }
- b1 = base64Alphabet[d1];
- b2 = base64Alphabet[d2];
- d3 = base64Data[dataIndex++];
- d4 = base64Data[dataIndex++];
- if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
- if (isPad(d3) && isPad(d4)) {
- if ((b2 & 0xf) != 0)//last 4 bits should be zero
- {
- return null;
- }
- byte[] tmp = new byte[i * 3 + 1];
- System.arraycopy(decodedData, 0, tmp, 0, i * 3);
- tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
- return tmp;
- } else if (!isPad(d3) && isPad(d4)) {
- b3 = base64Alphabet[d3];
- if ((b3 & 0x3) != 0)//last 2 bits should be zero
- {
- return null;
- }
- byte[] tmp = new byte[i * 3 + 2];
- System.arraycopy(decodedData, 0, tmp, 0, i * 3);
- tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- return tmp;
- } else {
- return null;
- }
- } else { //No PAD e.g 3cQl
- b3 = base64Alphabet[d3];
- b4 = base64Alphabet[d4];
- decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
- decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
- decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
- }
- return decodedData;
- }
- /**
- * remove WhiteSpace from MIME containing encoded Base64 data.
- *
- * @param data the byte array of base64 data (with WS)
- * @return the new length
- */
- private static int removeWhiteSpace(char[] data) {
- if (data == null) {
- return 0;
- }
- // count characters that's not whitespace
- int newSize = 0;
- int len = data.length;
- for (int i = 0; i < len; i++) {
- if (!isWhiteSpace(data[i])) {
- data[newSize++] = data[i];
- }
- }
- return newSize;
- }
- }
RSA密钥生成、加密解密、签名验签的更多相关文章
- RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密
原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...
- js rsa sign使用笔记(加密,解密,签名,验签)
你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...
- C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...
- Java RSA 加密 解密 签名 验签
原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...
- 支付接口中常用的加密解密以及验签rsa,md5,sha
一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...
- C# Pkcs8 1024位 加密 解密 签名 解签
部分代码来至 https://www.cnblogs.com/dj258/p/6049786.html using System; using System.Collections.Generic; ...
- java使用RSA与AES加密解密
首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...
- [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome
Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...
- IdentityServer4之JWT签名(RSA加密证书)及验签
一.前言 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢? 二.JWT与Reference Token ...
随机推荐
- Orchard之Module升级
在上一篇中,我们提到了 Migrations,这一篇稍微衍生一下. 1:Migrations 是什么 Orchard 提供了模块升级的功能,即,如果我们模块发布后,需要进行升级,我们可以通过编码来实现 ...
- codeforce 192 div2解题报告
今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...
- 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- Python collections.OrderedDict解决dict元素顺序问题
编程中遇到个问题,python json.loads时元素顺序可能会发生变化. 这个对于一些需要使用元素顺序来做一些策略的代码来说是致命的. 在网上查了查,结合自己的知识总结一下. 使用dict时,K ...
- 一种模块化开发的目录结构和部署tips
开发环境 开发态目录结构类似: 然后用express的static,将上下文映射到static那级目录上,比如访问: http://ip:5000/employee/employeeList.html ...
- 5.数字拆分成4段,怎样使得4段的乘积最小【dp】
题目是:给出一个数字(10,000-100,000,000),把这个数字拆分成4段,怎样使得4段的乘积最小.比如12345拆分成1*2*3*45=270, 10000=1*00*0*0=0. 解题分析 ...
- "Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."
用一个普通的域帐号玩私有云的时候,遇到了如下的报错. "Your computer could not be joined to the domain. You have exceeded ...
- 大智慧专业财务PFFIN(N,M)函数N的取值一览表
每股指标 1001 摊薄每股收益 1002 净资产收益率 1003 每股经营活动现金流量 1004 每股净资产 1005 每股资本公积金 1006 每股未分配利润 1007 每股主营收入 1008 扣 ...
- mac 苹果鼠标 magic mouse2 当触摸代替点击当触摸板教程
本文解决 mac 苹果鼠标 magic mouse2 触摸代替点击,鼠标当触摸板教程 买了magic mouse2之后,发现官方不推荐使用触摸代替点击,我感觉很不爽,这不就是一个触摸板嘛,于是各种搜软 ...
- 一次jdbc乱码解决
今天我做了一个小实验,从sqlserver 2010中将一张表转移到mysql中,使用的是基本的jdbc,前面复制的好好地,不知道怎么了,到了第三万行,突然出现了下面的异常 Incorrect str ...