zoukankan      html  css  js  c++  java
  • RSA 的加密 解密

    RSA加密解密类:

      1 package me.hao0.trace.order;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.BufferedWriter;
      5 import java.io.FileReader;
      6 import java.io.FileWriter;
      7 import java.io.IOException;
      8 import java.security.InvalidKeyException;
      9 import java.security.KeyFactory;
     10 import java.security.KeyPair;
     11 import java.security.KeyPairGenerator;
     12 import java.security.NoSuchAlgorithmException;
     13 import java.security.SecureRandom;
     14 import java.security.interfaces.RSAPrivateKey;
     15 import java.security.interfaces.RSAPublicKey;
     16 import java.security.spec.InvalidKeySpecException;
     17 import java.security.spec.PKCS8EncodedKeySpec;
     18 import java.security.spec.X509EncodedKeySpec;
     19 import javax.crypto.BadPaddingException;
     20 import javax.crypto.Cipher;
     21 import javax.crypto.IllegalBlockSizeException;
     22 import javax.crypto.NoSuchPaddingException;
     23 
     24 
     25 
     26 public class RSAEncrypt {
     27     /**
     28      * 字节数据转字符串专用集合
     29      */
     30     private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6',
     31             '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
     32 
     33     /**
     34      * 随机生成密钥对
     35      */
     36     public static void genKeyPair(String filePath) {
     37         // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
     38         KeyPairGenerator keyPairGen = null;
     39         try {
     40             keyPairGen = KeyPairGenerator.getInstance("RSA");
     41         } catch (NoSuchAlgorithmException e) {
     42             // TODO Auto-generated catch block
     43             e.printStackTrace();
     44         }
     45         // 初始化密钥对生成器,密钥大小为96-1024位
     46         keyPairGen.initialize(1024,new SecureRandom());
     47         // 生成一个密钥对,保存在keyPair中
     48         KeyPair keyPair = keyPairGen.generateKeyPair();
     49         // 得到私钥
     50         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
     51         // 得到公钥
     52         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
     53         try {
     54             // 得到公钥字符串
     55             String publicKeyString = Base64.encode(publicKey.getEncoded());
     56             // 得到私钥字符串
     57             String privateKeyString = Base64.encode(privateKey.getEncoded());
     58             // 将密钥对写入到文件
     59             FileWriter pubfw = new FileWriter(filePath + "/publicKey.keystore");
     60             FileWriter prifw = new FileWriter(filePath + "/privateKey.keystore");
     61             BufferedWriter pubbw = new BufferedWriter(pubfw);
     62             BufferedWriter pribw = new BufferedWriter(prifw);
     63             pubbw.write(publicKeyString);
     64             pribw.write(privateKeyString);
     65             pubbw.flush();
     66             pubbw.close();
     67             pubfw.close();
     68             pribw.flush();
     69             pribw.close();
     70             prifw.close();
     71         } catch (Exception e) {
     72             e.printStackTrace();
     73         }
     74     }
     75 
     76     /**
     77      * 从文件中输入流中加载公钥
     78      * @param path  公钥输入流
     79      * @throws Exception 加载公钥时产生的异常
     80      */
     81     public static String loadPublicKeyByFile(String path) throws Exception {
     82         try {
     83             BufferedReader br = new BufferedReader(new FileReader(path+ "/publicKey.keystore"));
     84             String readLine = null;
     85             StringBuilder sb = new StringBuilder();
     86             while ((readLine = br.readLine()) != null) {
     87                 sb.append(readLine);
     88                 System.out.println( "得到的公钥 = "+sb);
     89             }
     90             br.close();
     91             return sb.toString();
     92         } catch (IOException e) {
     93             throw new Exception("公钥数据流读取错误");
     94         } catch (NullPointerException e) {
     95             throw new Exception("公钥输入流为空");
     96         }
     97     }
     98 
     99     /**
    100      * 从字符串中加载公钥
    101      *
    102      * @param publicKeyStr
    103      *            公钥数据字符串
    104      * @throws Exception
    105      *             加载公钥时产生的异常
    106      */
    107     public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr)
    108             throws Exception {
    109         try {
    110             byte[] buffer = Base64.decode(publicKeyStr);
    111             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    112             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
    113             return (RSAPublicKey) keyFactory.generatePublic(keySpec);
    114         } catch (NoSuchAlgorithmException e) {
    115             throw new Exception("无此算法");
    116         } catch (InvalidKeySpecException e) {
    117             throw new Exception("公钥非法");
    118         } catch (NullPointerException e) {
    119             throw new Exception("公钥数据为空");
    120         }
    121     }
    122 
    123     /**
    124      * 从文件中加载私钥
    125      * @param path 私钥文件名
    126      * @return 是否成功
    127      * @throws Exception
    128      */
    129     public static String loadPrivateKeyByFile(String path) throws Exception {
    130         try {
    131             BufferedReader br = new BufferedReader(new FileReader(path + "/privateKey.keystore"));
    132             String readLine = null;
    133             StringBuilder sb = new StringBuilder();
    134             while ((readLine = br.readLine()) != null) {
    135                 sb.append(readLine);
    136             }
    137             br.close();
    138             return sb.toString();
    139         } catch (IOException e) {
    140             throw new Exception("私钥数据读取错误");
    141         } catch (NullPointerException e) {
    142             throw new Exception("私钥输入流为空");
    143         }
    144     }
    145 
    146     public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)
    147             throws Exception {
    148         try {
    149             byte[] buffer = Base64.decode(privateKeyStr);
    150             PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
    151             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    152             return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
    153         } catch (NoSuchAlgorithmException e) {
    154             throw new Exception("无此算法");
    155         } catch (InvalidKeySpecException e) {
    156             throw new Exception("私钥非法");
    157         } catch (NullPointerException e) {
    158             throw new Exception("私钥数据为空");
    159         }
    160     }
    161 
    162     /**
    163      * 公钥加密过程
    164      * @param publicKey 公钥
    165      * @param plainTextData 明文数据
    166      * @return
    167      * @throws Exception 加密过程中的异常信息
    168      */
    169     public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)throws Exception {
    170         if (publicKey == null) {
    171             throw new Exception("加密公钥为空, 请设置");
    172         }
    173         Cipher cipher = null;
    174         try {
    175             // 使用默认RSA
    176             cipher = Cipher.getInstance("RSA");
    177             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
    178             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    179             byte[] output = cipher.doFinal(plainTextData);
    180             return output;
    181         } catch (NoSuchAlgorithmException e) {
    182             throw new Exception("无此加密算法");
    183         } catch (NoSuchPaddingException e) {
    184             e.printStackTrace();
    185             return null;
    186         } catch (InvalidKeyException e) {
    187             throw new Exception("加密公钥非法,请检查");
    188         } catch (IllegalBlockSizeException e) {
    189             throw new Exception("明文长度非法");
    190         } catch (BadPaddingException e) {
    191             throw new Exception("明文数据已损坏");
    192         }
    193     }
    194 
    195     /**
    196      * 私钥加密过程     *
    197      * @param privateKey 私钥
    198      * @param plainTextData 明文数据
    199      * @return
    200      * @throws Exception 加密过程中的异常信息
    201      */
    202     public static byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData)throws Exception {
    203         if (privateKey == null) {
    204             throw new Exception("加密私钥为空, 请设置");
    205         }
    206         Cipher cipher = null;
    207         try {
    208             // 使用默认RSA
    209             cipher = Cipher.getInstance("RSA");
    210             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    211             byte[] output = cipher.doFinal(plainTextData);
    212             return output;
    213         } catch (NoSuchAlgorithmException e) {
    214             throw new Exception("无此加密算法");
    215         } catch (NoSuchPaddingException e) {
    216             e.printStackTrace();
    217             return null;
    218         } catch (InvalidKeyException e) {
    219             throw new Exception("加密私钥非法,请检查");
    220         } catch (IllegalBlockSizeException e) {
    221             throw new Exception("明文长度非法");
    222         } catch (BadPaddingException e) {
    223             throw new Exception("明文数据已损坏");
    224         }
    225     }
    226 
    227     /**
    228      * 私钥解密过程
    229      *
    230      * @param privateKey 私钥
    231      * @param cipherData 密文数据(八进制)
    232      * @return 明文
    233      * @throws Exception 解密过程中的异常信息
    234      */
    235     public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {
    236         if (privateKey == null) {
    237             throw new Exception("解密私钥为空, 请设置");
    238         }
    239         Cipher cipher = null;
    240         try {
    241             // 使用默认RSA
    242             cipher = Cipher.getInstance("RSA");
    243             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
    244             cipher.init(Cipher.DECRYPT_MODE, privateKey);
    245             byte[] output = cipher.doFinal(cipherData);
    246             return output;
    247         } catch (NoSuchAlgorithmException e) {
    248             throw new Exception("无此解密算法");
    249         } catch (NoSuchPaddingException e) {
    250             e.printStackTrace();
    251             return null;
    252         } catch (InvalidKeyException e) {
    253             throw new Exception("解密私钥非法,请检查");
    254         } catch (IllegalBlockSizeException e) {
    255             throw new Exception("密文长度非法");
    256         } catch (BadPaddingException e) {
    257             throw new Exception("密文数据已损坏");
    258         }
    259     }
    260 
    261     /**
    262      * 公钥解密过程
    263      * @param publicKey 公钥
    264      * @param cipherData 密文数据
    265      * @return 明文
    266      * @throws Exception 解密过程中的异常信息
    267      */
    268     public static byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)
    269             throws Exception {
    270         if (publicKey == null) {
    271             throw new Exception("解密公钥为空, 请设置");
    272         }
    273         Cipher cipher = null;
    274         try {
    275             // 使用默认RSA
    276             cipher = Cipher.getInstance("RSA");
    277             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
    278             cipher.init(Cipher.DECRYPT_MODE, publicKey);
    279             byte[] output = cipher.doFinal(cipherData);
    280             return output;
    281         } catch (NoSuchAlgorithmException e) {
    282             throw new Exception("无此解密算法");
    283         } catch (NoSuchPaddingException e) {
    284             e.printStackTrace();
    285             return null;
    286         } catch (InvalidKeyException e) {
    287             throw new Exception("解密公钥非法,请检查");
    288         } catch (IllegalBlockSizeException e) {
    289             throw new Exception("密文长度非法");
    290         } catch (BadPaddingException e) {
    291             throw new Exception("密文数据已损坏");
    292         }
    293     }
    294 
    295     /**
    296      * 字节数据转十六进制字符串
    297      * @param data 输入数据
    298      * @return 十六进制内容
    299      */
    300     public static String byteArrayToString(byte[] data) {
    301         StringBuilder stringBuilder = new StringBuilder();
    302         for (int i = 0; i < data.length; i++) {
    303             // 取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移
    304             stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
    305             // 取出字节的低四位 作为索引得到相应的十六进制标识符
    306             stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
    307             if (i < data.length - 1) {
    308                 stringBuilder.append(' ');
    309             }
    310         }
    311         return stringBuilder.toString();
    312     }
    313 }

    签名及校验类:

      1 package me.hao0.trace.order;
      2 
      3 import java.security.KeyFactory;
      4 import java.security.PrivateKey;
      5 import java.security.PublicKey;
      6 import java.security.Signature;
      7 import java.security.spec.PKCS8EncodedKeySpec;
      8 import java.security.spec.X509EncodedKeySpec;
      9 
     10 
     11 
     12 /**
     13  * RSA签名验签类
     14  */
     15 public class RSASignature{
     16 
     17     /**
     18      * 签名算法
     19      */
     20     public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
     21 
     22     /**
     23      * RSA签名
     24      * @param content 待签名数据
     25      * @param privateKey 商户私钥
     26      * @param encode 字符集编码
     27      * @return 签名值
     28      */
     29     public static String sign(String content, String privateKey, String encode){
     30         try{
     31             PKCS8EncodedKeySpec priPKCS8     = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
     32 
     33             KeyFactory keyf                 = KeyFactory.getInstance("RSA");
     34             PrivateKey priKey                 = keyf.generatePrivate(priPKCS8);
     35 
     36             Signature signature = Signature.getInstance(SIGN_ALGORITHMS);
     37             signature.initSign(priKey);
     38             signature.update( content.getBytes(encode));
     39 
     40             byte[] signed = signature.sign();
     41 
     42             return Base64.encode(signed);
     43         }catch (Exception e){
     44             e.printStackTrace();
     45         }
     46 
     47         return null;
     48     }
     49 
     50     public static String sign(String content, String privateKey){
     51         try{
     52             PKCS8EncodedKeySpec  priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
     53             KeyFactory keyf = KeyFactory.getInstance("RSA");
     54             PrivateKey priKey = keyf.generatePrivate(priPKCS8);
     55             Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
     56             signature.initSign(priKey);
     57             signature.update( content.getBytes());
     58             byte[] signed = signature.sign();
     59             return Base64.encode(signed);
     60         }
     61         catch (Exception e){
     62             e.printStackTrace();
     63         }
     64         return null;
     65     }
     66 
     67     /**
     68      * RSA验签名检查
     69      * @param content 待签名数据
     70      * @param sign 签名值
     71      * @param publicKey 分配给开发商公钥
     72      * @param encode 字符集编码
     73      * @return 布尔值
     74      */
     75     public static boolean doCheck(String content, String sign, String publicKey,String encode){
     76         try{
     77             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
     78             byte[] encodedKey = Base64.decode(publicKey);
     79             PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
     80 
     81             Signature signature = Signature.getInstance(SIGN_ALGORITHMS);
     82             signature.initVerify(pubKey);
     83             signature.update( content.getBytes(encode) );
     84 
     85             boolean bverify = signature.verify( Base64.decode(sign) );
     86             return bverify;
     87 
     88         }catch (Exception e){
     89             e.printStackTrace();
     90         }
     91         return false;
     92     }
     93 
     94     public static boolean doCheck(String content, String sign, String publicKey){
     95         try{
     96             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
     97             byte[] encodedKey = Base64.decode(publicKey);
     98             PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
     99 
    100 
    101             Signature signature = Signature.getInstance(SIGN_ALGORITHMS);
    102             signature.initVerify(pubKey);
    103             signature.update( content.getBytes() );
    104 
    105             boolean bverify = signature.verify( Base64.decode(sign) );
    106             return bverify;
    107 
    108         }catch (Exception e){
    109             e.printStackTrace();
    110         }
    111 
    112         return false;
    113     }
    114 
    115 }

    再来一个Base64的类,当然你也可以用commons-codec-1.9.jar

      1 package me.hao0.trace.order;
      2 
      3 public final class Base64 {
      4 
      5     static private final int     BASELENGTH           = 128;
      6     static private final int     LOOKUPLENGTH         = 64;
      7     static private final int     TWENTYFOURBITGROUP   = 24;
      8     static private final int     EIGHTBIT             = 8;
      9     static private final int     SIXTEENBIT           = 16;
     10     static private final int     FOURBYTE             = 4;
     11     static private final int     SIGN                 = -128;
     12     static private final char    PAD                  = '=';
     13     static private final boolean fDebug               = false;
     14     static final private byte[]  base64Alphabet       = new byte[BASELENGTH];
     15     static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];
     16 
     17     static {
     18         for (int i = 0; i < BASELENGTH; ++i) {
     19             base64Alphabet[i] = -1;
     20         }
     21         for (int i = 'Z'; i >= 'A'; i--) {
     22             base64Alphabet[i] = (byte) (i - 'A');
     23         }
     24         for (int i = 'z'; i >= 'a'; i--) {
     25             base64Alphabet[i] = (byte) (i - 'a' + 26);
     26         }
     27 
     28         for (int i = '9'; i >= '0'; i--) {
     29             base64Alphabet[i] = (byte) (i - '0' + 52);
     30         }
     31 
     32         base64Alphabet['+'] = 62;
     33         base64Alphabet['/'] = 63;
     34 
     35         for (int i = 0; i <= 25; i++) {
     36             lookUpBase64Alphabet[i] = (char) ('A' + i);
     37         }
     38 
     39         for (int i = 26, j = 0; i <= 51; i++, j++) {
     40             lookUpBase64Alphabet[i] = (char) ('a' + j);
     41         }
     42 
     43         for (int i = 52, j = 0; i <= 61; i++, j++) {
     44             lookUpBase64Alphabet[i] = (char) ('0' + j);
     45         }
     46         lookUpBase64Alphabet[62] = (char) '+';
     47         lookUpBase64Alphabet[63] = (char) '/';
     48 
     49     }
     50 
     51     private static boolean isWhiteSpace(char octect) {
     52         return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
     53     }
     54 
     55     private static boolean isPad(char octect) {
     56         return (octect == PAD);
     57     }
     58 
     59     private static boolean isData(char octect) {
     60         return (octect < BASELENGTH && base64Alphabet[octect] != -1);
     61     }
     62 
     63     /**
     64      * 将十六进制点编码成Base64
     65      * @param binaryData  二进制数据的数组
     66      * @return Encoded Base64 array
     67      */
     68     public static String encode(byte[] binaryData) {
     69 
     70         if (binaryData == null) {
     71             return null;
     72         }
     73 
     74         int lengthDataBits = binaryData.length * EIGHTBIT;
     75         if (lengthDataBits == 0) {
     76             return "";
     77         }
     78 
     79         int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
     80         int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
     81         int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
     82         char encodedData[] = null;
     83 
     84         encodedData = new char[numberQuartet * 4];
     85 
     86         byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
     87 
     88         int encodedIndex = 0;
     89         int dataIndex = 0;
     90         if (fDebug) {
     91             System.out.println("number of triplets = " + numberTriplets);
     92         }
     93 
     94         for (int i = 0; i < numberTriplets; i++) {
     95             b1 = binaryData[dataIndex++];
     96             b2 = binaryData[dataIndex++];
     97             b3 = binaryData[dataIndex++];
     98 
     99             if (fDebug) {
    100                 System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
    101             }
    102 
    103             l = (byte) (b2 & 0x0f);
    104             k = (byte) (b1 & 0x03);
    105 
    106             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
    107             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
    108             byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
    109 
    110             if (fDebug) {
    111                 System.out.println("val2 = " + val2);
    112                 System.out.println("k4   = " + (k << 4));
    113                 System.out.println("vak  = " + (val2 | (k << 4)));
    114             }
    115 
    116             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
    117             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
    118             encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
    119             encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
    120         }
    121 
    122         // form integral number of 6-bit groups
    123         if (fewerThan24bits == EIGHTBIT) {
    124             b1 = binaryData[dataIndex];
    125             k = (byte) (b1 & 0x03);
    126             if (fDebug) {
    127                 System.out.println("b1=" + b1);
    128                 System.out.println("b1<<2 = " + (b1 >> 2));
    129             }
    130             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
    131             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
    132             encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
    133             encodedData[encodedIndex++] = PAD;
    134             encodedData[encodedIndex++] = PAD;
    135         } else if (fewerThan24bits == SIXTEENBIT) {
    136             b1 = binaryData[dataIndex];
    137             b2 = binaryData[dataIndex + 1];
    138             l = (byte) (b2 & 0x0f);
    139             k = (byte) (b1 & 0x03);
    140 
    141             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
    142             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
    143 
    144             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
    145             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
    146             encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
    147             encodedData[encodedIndex++] = PAD;
    148         }
    149 
    150         return new String(encodedData);
    151     }
    152 
    153     /**
    154      * 将BASE64数据解码为八进制
    155      * @param encoded  Base64数据的字符串
    156      * @return 数组包含解码数据。
    157      */
    158     public static byte[] decode(String encoded) {
    159 
    160         if (encoded == null) {
    161             return null;
    162         }
    163 
    164         char[] base64Data = encoded.toCharArray();
    165         //移除空字符
    166         int len = removeWhiteSpace(base64Data);
    167 
    168         //应该被4整除
    169         if (len % FOURBYTE != 0) {
    170             return null;
    171         }
    172 
    173         int numberQuadruple = (len / FOURBYTE);
    174 
    175         if (numberQuadruple == 0) {
    176             return new byte[0];
    177         }
    178 
    179         byte decodedData[] = null;
    180         byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
    181         char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
    182 
    183         int i = 0;
    184         int encodedIndex = 0;
    185         int dataIndex = 0;
    186         decodedData = new byte[(numberQuadruple) * 3];
    187 
    188         for (; i < numberQuadruple - 1; i++) {
    189 
    190             // 如果找到“没有数据”,只返回空
    191             if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
    192                     || !isData((d3 = base64Data[dataIndex++]))
    193                     || !isData((d4 = base64Data[dataIndex++]))) {
    194                 return null;
    195             }
    196 
    197             b1 = base64Alphabet[d1];
    198             b2 = base64Alphabet[d2];
    199             b3 = base64Alphabet[d3];
    200             b4 = base64Alphabet[d4];
    201 
    202             decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
    203             decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
    204             decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
    205         }
    206         //如果找到“没有数据”,只返回空
    207         if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
    208             return null;
    209         }
    210 
    211         b1 = base64Alphabet[d1];
    212         b2 = base64Alphabet[d2];
    213 
    214         d3 = base64Data[dataIndex++];
    215         d4 = base64Data[dataIndex++];
    216         if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
    217             if (isPad(d3) && isPad(d4)) {
    218                 if ((b2 & 0xf) != 0)//last 4 bits should be zero
    219                 {
    220                     return null;
    221                 }
    222                 byte[] tmp = new byte[i * 3 + 1];
    223                 System.arraycopy(decodedData, 0, tmp, 0, i * 3);
    224                 tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
    225                 return tmp;
    226             } else if (!isPad(d3) && isPad(d4)) {
    227                 b3 = base64Alphabet[d3];
    228                 if ((b3 & 0x3) != 0)//last 2 bits should be zero
    229                 {
    230                     return null;
    231                 }
    232                 byte[] tmp = new byte[i * 3 + 2];
    233                 System.arraycopy(decodedData, 0, tmp, 0, i * 3);
    234                 tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
    235                 tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
    236                 return tmp;
    237             } else {
    238                 return null;
    239             }
    240         } else { //No PAD e.g 3cQl
    241             b3 = base64Alphabet[d3];
    242             b4 = base64Alphabet[d4];
    243             decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
    244             decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
    245             decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
    246 
    247         }
    248 
    249         return decodedData;
    250     }
    251 
    252     /**
    253      * 从包含编码的Base64数据的MIME中移除空白
    254      * @param data  Base64数据的字节数组
    255      * @return      the new length
    256      */
    257     private static int removeWhiteSpace(char[] data) {
    258         if (data == null) {
    259             return 0;
    260         }
    261 
    262         // 计算不是空白的字符
    263         int newSize = 0;
    264         int len = data.length;
    265         for (int i = 0; i < len; i++) {
    266             if (!isWhiteSpace(data[i])) {
    267                 data[newSize++] = data[i];
    268             }
    269         }
    270         return newSize;
    271     }
    272 }

    测试类:需要再D盘下建 rsa的文件夹,并在该文件夹下新建两个文件。

     1 package me.hao0.trace.order;
     2 
     3 import me.hao0.trace.order.Base64;
     4 import me.hao0.trace.order.RSAEncrypt;
     5 import me.hao0.trace.order.RSASignature;
     6 
     7 import java.net.URL;
     8 
     9 public class MainTest {
    10 
    11     public static void main(String[] args) throws Exception {
    12         String filepath="D:/rsa/";
    13         //随机生成密钥对,并把公钥私钥写入对应的文件夹内
    14         RSAEncrypt.genKeyPair(filepath);
    15 
    16         System.out.println("--------------公钥加密私钥解密过程-------------------");
    17         String plainText="测试_公钥加密私钥解密";
    18         //公钥加密过程
    19         byte[] cipherData= RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)),plainText.getBytes());
    20         String cipher= Base64.encode(cipherData);
    21         //私钥解密过程
    22         byte[] res=RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)), Base64.decode(cipher));
    23         String restr=new String(res);
    24         System.out.println("原文:"+plainText);
    25         System.out.println("加密:"+cipher);
    26         System.out.println("解密:"+restr);
    27         System.out.println();
    28 
    29         System.out.println("--------------私钥加密公钥解密过程-------------------");
    30         plainText="测试_私钥加密公钥解密";
    31         //私钥加密过程
    32         cipherData=RSAEncrypt.encrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)),plainText.getBytes());
    33         cipher=Base64.encode(cipherData);
    34         //公钥解密过程
    35         res=RSAEncrypt.decrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)), Base64.decode(cipher));
    36         restr=new String(res);
    37         System.out.println("原文 :"+plainText);
    38         System.out.println("加密 :"+cipher);
    39         System.out.println("解密 :"+restr);
    40         System.out.println();
    41 
    42         System.out.println("---------------私钥签名过程------------------");
    43         String content="测试_这是用于签名的原始数据";
    44         String signstr= RSASignature.sign(content,RSAEncrypt.loadPrivateKeyByFile(filepath));
    45         System.out.println("签名原串 :"+content);
    46         System.out.println("签名串 :"+signstr);
    47         System.out.println();
    48 
    49         System.out.println("---------------公钥校验签名------------------");
    50         System.out.println("签名原串 :"+content);
    51         System.out.println("签名串 :"+signstr);
    52 
    53         System.out.println("验签结果 :"+RSASignature.doCheck(content, signstr, RSAEncrypt.loadPublicKeyByFile(filepath)));
    54         System.out.println();
    55 
    56     }
    57 }
  • 相关阅读:
    GAE 1.5.1 SDK Prerelease
    GAE 1.5.1 SDK Prerelease
    SVN 分支更新与合并
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
    SVN 分支更新与合并
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
  • 原文地址:https://www.cnblogs.com/laojiao/p/9922286.html
Copyright © 2011-2022 走看看