zoukankan      html  css  js  c++  java
  • Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    当前使用的是Linux系统,已经按装使用OpenSSL软件包,

    一、使用OpenSSL来生成私钥和公钥

    1、执行命令openssl version -a 验证机器上已经安装openssl 

    openssl version -a
    

    运行结果:

    2、生成私钥:这条命令让openssl随机生成了一份私钥,加密长度是1024位。加密长度是指理论上最大允许”被加密的信息“长度的限制,也就是明文的长度限制。随着这个参数的增大(比方说2048),允许的明文长度也会增加,但同时也会造成计算复杂度的极速增长。一般推荐的长度就是2048位

    openssl genrsa -out rsa_private_key.pem 2048
    

     运行结果:

    生产私钥文件:rsa_private_key.pem,内容都是标准的ASCII字符,开头一行和结尾一行有明显的标记,真正的私钥数据是中间的不规则字符

      

    3、根据私钥生产公钥:rsa_public_key.pem or private_key.der

    openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout

    openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt

    运行结果:

    公钥内容:

    注意:此时的私钥还不能直接被使用,需要进行PKCS#8编码:

     4、PKCS#8编码:指明输入私钥文件为rsa_private_key.pem,输出私钥文件为pkcs8_rsa_private_key.pem,不采用任何二次加密(-nocrypt)

    openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt

      openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der

    至此:可用的密钥对已经生成好了,私钥使用pkcs8_rsa_private_key.pem,公钥采用rsa_public_key.pem

    二、java使用:

    读取pem文件格式:

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

    读取der文件格式:

      1 import lombok.extern.slf4j.Slf4j;
      2 
      3 import javax.crypto.BadPaddingException;
      4 import javax.crypto.Cipher;
      5 import javax.crypto.IllegalBlockSizeException;
      6 import javax.crypto.NoSuchPaddingException;
      7 import java.io.*;
      8 import java.nio.file.Files;
      9 import java.nio.file.Paths;
     10 import java.security.*;
     11 import java.security.spec.InvalidKeySpecException;
     12 import java.security.spec.KeySpec;
     13 import java.security.spec.PKCS8EncodedKeySpec;
     14 import java.security.spec.X509EncodedKeySpec;
     15 
     16 /**
     17  * <p>
     18  * 1.
     19  * </p>
     20  *
     21  * @author PollyLuo
     22  * @version 1.0.0
     23  */
     24 @Slf4j
     25 public class RSAEncrypt {
     26     /**
     27      * 字节数据转字符串专用集合
     28      */
     29     private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6',
     30             '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
     31 
     32     /**
     33      * 获取der公钥
     34      *
     35      * @param key 公钥内容
     36      * @return 公钥对象
     37      * @throws Exception
     38      */
     39     public static PublicKey geneneratePublicKey(byte[] key) throws Exception {
     40         try {
     41             KeySpec keySpec = new X509EncodedKeySpec(key);
     42             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
     43             return keyFactory.generatePublic(keySpec);
     44         } catch (NoSuchAlgorithmException e) {
     45             throw new Exception("无此算法");
     46         } catch (InvalidKeySpecException e) {
     47             throw new Exception("公钥非法");
     48         } catch (NullPointerException e) {
     49             throw new Exception("公钥数据为空");
     50         }
     51     }
     52 
     53     /**
     54      * 获取der私钥
     55      *
     56      * @param key 私钥内容
     57      * @return 公钥对象
     58      * @throws Exception
     59      */
     60     public static PrivateKey geneneratePrivateKey(byte[] key) throws Exception {
     61         try {
     62             KeySpec keySpec = new PKCS8EncodedKeySpec(key);
     63             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
     64             return keyFactory.generatePrivate(keySpec);
     65         } catch (NoSuchAlgorithmException e) {
     66             throw new Exception("无此算法");
     67         } catch (InvalidKeySpecException e) {
     68             throw new Exception("私钥非法");
     69         } catch (NullPointerException e) {
     70             throw new Exception("私钥数据为空");
     71         }
     72     }
     73 
     74     /**
     75      * 根据Cer文件读取密钥内容
     76      *
     77      * @param pubCerPath 密钥文件地址
     78      * @return
     79      */
     80     public static byte[] getKeyFromFile(String pubCerPath) {
     81         try (InputStream inputStream = Files.newInputStream(Paths.get(pubCerPath));) {
     82             byte[] reads = new byte[inputStream.available()];
     83             inputStream.read(reads);
     84             return reads;
     85         } catch (FileNotFoundException e) {
     86             log.error("密钥文件不存在:", e);
     87         } catch (IOException e) {
     88             log.error("密钥文件读取失败:", e);
     89         }
     90         return null;
     91     }
     92 
     93 
     94     /**
     95      * 公钥加密过程
     96      *
     97      * @param publicKey     公钥
     98      * @param plainTextData 明文数据
     99      * @return
    100      * @throws Exception 加密过程中的异常信息
    101      */
    102     public static byte[] encrypt(PublicKey publicKey, byte[] plainTextData)
    103             throws Exception {
    104         if (publicKey == null) {
    105             throw new Exception("加密公钥为空, 请设置");
    106         }
    107         Cipher cipher = null;
    108         try {
    109             // 使用默认RSA
    110             cipher = Cipher.getInstance("RSA");
    111             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    112             byte[] output = cipher.doFinal(plainTextData);
    113             return output;
    114         } catch (NoSuchAlgorithmException e) {
    115             throw new Exception("无此加密算法");
    116         } catch (NoSuchPaddingException e) {
    117             e.printStackTrace();
    118             return null;
    119         } catch (InvalidKeyException e) {
    120             throw new Exception("加密公钥非法,请检查");
    121         } catch (IllegalBlockSizeException e) {
    122             throw new Exception("明文长度非法");
    123         } catch (BadPaddingException e) {
    124             throw new Exception("明文数据已损坏");
    125         }
    126     }
    127 
    128     /**
    129      * 私钥加密过程
    130      *
    131      * @param privateKey    私钥
    132      * @param plainTextData 明文数据
    133      * @return
    134      * @throws Exception 加密过程中的异常信息
    135      */
    136     public static byte[] encrypt(PrivateKey privateKey, byte[] plainTextData)
    137             throws Exception {
    138         if (privateKey == null) {
    139             throw new Exception("加密私钥为空, 请设置");
    140         }
    141         Cipher cipher = null;
    142         try {
    143             // 使用默认RSA
    144             cipher = Cipher.getInstance("RSA");
    145             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    146             byte[] output = cipher.doFinal(plainTextData);
    147             return output;
    148         } catch (NoSuchAlgorithmException e) {
    149             throw new Exception("无此加密算法");
    150         } catch (NoSuchPaddingException e) {
    151             e.printStackTrace();
    152             return null;
    153         } catch (InvalidKeyException e) {
    154             throw new Exception("加密私钥非法,请检查");
    155         } catch (IllegalBlockSizeException e) {
    156             throw new Exception("明文长度非法");
    157         } catch (BadPaddingException e) {
    158             throw new Exception("明文数据已损坏");
    159         }
    160     }
    161 
    162     /**
    163      * 私钥解密过程
    164      *
    165      * @param privateKey 私钥
    166      * @param cipherData 密文数据
    167      * @return 明文
    168      * @throws Exception 解密过程中的异常信息
    169      */
    170     public static byte[] decrypt(PrivateKey privateKey, byte[] cipherData)
    171             throws Exception {
    172         if (privateKey == null) {
    173             throw new Exception("解密私钥为空, 请设置");
    174         }
    175         Cipher cipher = null;
    176         try {
    177             // 使用默认RSA
    178             cipher = Cipher.getInstance("RSA");
    179             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
    180             cipher.init(Cipher.DECRYPT_MODE, privateKey);
    181             byte[] output = cipher.doFinal(cipherData);
    182             return output;
    183         } catch (NoSuchAlgorithmException e) {
    184             throw new Exception("无此解密算法");
    185         } catch (NoSuchPaddingException e) {
    186             e.printStackTrace();
    187             return null;
    188         } catch (InvalidKeyException e) {
    189             throw new Exception("解密私钥非法,请检查");
    190         } catch (IllegalBlockSizeException e) {
    191             throw new Exception("密文长度非法");
    192         } catch (BadPaddingException e) {
    193             throw new Exception("密文数据已损坏");
    194         }
    195     }
    196 
    197     /**
    198      * 公钥解密过程
    199      *
    200      * @param publicKey  公钥
    201      * @param cipherData 密文数据
    202      * @return 明文
    203      * @throws Exception 解密过程中的异常信息
    204      */
    205     public static byte[] decrypt(PublicKey publicKey, byte[] cipherData)
    206             throws Exception {
    207         if (publicKey == null) {
    208             throw new Exception("解密公钥为空, 请设置");
    209         }
    210         Cipher cipher = null;
    211         try {
    212             // 使用默认RSA
    213             cipher = Cipher.getInstance("RSA");
    214             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
    215             cipher.init(Cipher.DECRYPT_MODE, publicKey);
    216             byte[] output = cipher.doFinal(cipherData);
    217             return output;
    218         } catch (NoSuchAlgorithmException e) {
    219             throw new Exception("无此解密算法");
    220         } catch (NoSuchPaddingException e) {
    221             e.printStackTrace();
    222             return null;
    223         } catch (InvalidKeyException e) {
    224             throw new Exception("解密公钥非法,请检查");
    225         } catch (IllegalBlockSizeException e) {
    226             throw new Exception("密文长度非法");
    227         } catch (BadPaddingException e) {
    228             throw new Exception("密文数据已损坏");
    229         }
    230     }
    231 
    232     /**
    233      * 字节数据转十六进制字符串
    234      *
    235      * @param data 输入数据
    236      * @return 十六进制内容
    237      */
    238     public static String byteArrayToString(byte[] data) {
    239         StringBuilder stringBuilder = new StringBuilder();
    240         for (int i = 0; i < data.length; i++) {
    241             // 取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移
    242             stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
    243             // 取出字节的低四位 作为索引得到相应的十六进制标识符
    244             stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
    245             if (i < data.length - 1) {
    246                 stringBuilder.append(' ');
    247             }
    248         }
    249         return stringBuilder.toString();
    250     }
    251 }
    View Code

    SHA256withRSA签名:

      1 import java.security.PrivateKey;
      2 import java.security.PublicKey;
      3 
      4 /**
      5  * <p>
      6  * 1.
      7  * </p>
      8  *
      9  * @author PollyLuo
     10  * @version 1.0.0
     11  */
     12 public class RSASignature {
     13 
     14     /**
     15      * 签名算法
     16      */
     17     public static final String SIGN_ALGORITHMS = "SHA256withRSA";
     18 
     19     /**
     20      * RSA签名
     21      *
     22      * @param content    待签名数据
     23      * @param privateKey 商户私钥
     24      * @param encode     字符集编码
     25      * @return 签名值
     26      */
     27     public static String sign(String content, PrivateKey privateKey, String encode) {
     28         try {
     29             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
     30             signature.initSign(privateKey);
     31             signature.update(content.getBytes(encode));
     32             byte[] signed = signature.sign();
     33             return byte2Hex(signed);
     34         } catch (Exception e) {
     35             e.printStackTrace();
     36         }
     37 
     38         return null;
     39     }
     40 
     41     public static String sign(String content, PrivateKey privateKey) {
     42         try {
     43             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
     44             signature.initSign(privateKey);
     45             signature.update(content.getBytes());
     46             byte[] signed = signature.sign();
     47             return byte2Hex(signed);
     48         } catch (Exception e) {
     49             e.printStackTrace();
     50         }
     51         return null;
     52     }
     53 
     54 
     55     /**
     56      * 将byte[] 转换成字符串
     57      */
     58     public static String byte2Hex(byte[] srcBytes) {
     59         StringBuilder hexRetSB = new StringBuilder();
     60         for (byte b : srcBytes) {
     61             String hexString = Integer.toHexString(0x00ff & b);
     62             hexRetSB.append(hexString.length() == 1 ? 0 : "").append(hexString);
     63         }
     64         return hexRetSB.toString();
     65     }
     66 
     67     /**
     68      * RSA验签名检查
     69      *
     70      * @param content   待签名数据
     71      * @param sign      签名值
     72      * @param publicKey 分配给开发商公钥
     73      * @param encode    字符集编码
     74      * @return 布尔值
     75      */
     76     public static boolean doCheck(String content, String sign, PublicKey publicKey, String encode) {
     77         try {
     78             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
     79 
     80             signature.initVerify(publicKey);
     81             signature.update(content.getBytes(encode));
     82 
     83             boolean bverify = signature.verify(hex2Bytes(sign));
     84             return bverify;
     85 
     86         } catch (Exception e) {
     87             e.printStackTrace();
     88         }
     89 
     90         return false;
     91     }
     92 
     93     public static boolean doCheck(String content, String sign, PublicKey publicKey) {
     94         try {
     95             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
     96             signature.initVerify(publicKey);
     97             signature.update(content.getBytes());
     98             boolean bverify = signature.verify(hex2Bytes(sign));
     99             return bverify;
    100         } catch (Exception e) {
    101             e.printStackTrace();
    102         }
    103 
    104         return false;
    105     }
    106 
    107 
    108     /**
    109      * 将16进制字符串转为转换成字符串
    110      */
    111     public static byte[] hex2Bytes(String source) {
    112         byte[] sourceBytes = new byte[source.length() / 2];
    113         for (int i = 0; i < sourceBytes.length; i++) {
    114             sourceBytes[i] = (byte) Integer.parseInt(source.substring(i * 2, i * 2 + 2), 16);
    115         }
    116         return sourceBytes;
    117     }
    118 
    119 
    120 }
    View Code

    测试方法:

     1 import RSAEncrypt;
     2 import RSASignature;
     3 import org.apache.commons.codec.binary.Base64;
     4 
     5 public class ApplicationTests {
     6 
     7     public static void main(String[] args) throws Exception {
     8         String filepath = "D:\\key\\MDAQ\\";
     9         Base64 base64 = new Base64();
    10 
    11         System.out.println("--------------公钥加密私钥解密过程-------------------");
    12         String signKey = "ihep_公钥加密私钥解密";
    13         // 公钥加密过程
    14         byte[] cipherData = RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)),
    15                 signKey.getBytes());
    16         String cipher = new String(base64.encode(cipherData));
    17         // 私钥解密过程
    18         byte[] res = RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)),
    19                 base64.decode(cipher));
    20         String restr = new String(res);
    21         System.out.println("原文:" + signKey);
    22         System.out.println("加密:" + cipher);
    23         System.out.println("解密:" + restr);
    24         System.out.println();
    25 
    26         System.out.println("--------------私钥加密公钥解密过程-------------------");
    27 //        signKey = "ihep_私钥加密公钥解密";
    28         // 私钥加密过程
    29         cipherData = RSAEncrypt.encrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)),
    30                 signKey.getBytes());
    31         cipher = new String(base64.encode(cipherData));
    32         // 公钥解密过程
    33         res = RSAEncrypt.decrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)),
    34                 base64.decode(cipher));
    35         restr = new String(res);
    36         System.out.println("原文:" + signKey);
    37         System.out.println("加密:" + cipher);
    38         System.out.println("解密:" + restr);
    39         System.out.println();
    40 
    41 
    42         System.out.println("---------------私钥签名过程------------------");
    43 //        String content = "ihep_这是用于签名的原始数据";
    44         String content = signKey;
    45         String signstr = RSASignature.sign(content, RSAEncrypt.loadPrivateKeyByFile(filepath));
    46         System.out.println("签名原串:" + content);
    47         System.out.println("签名串:" + signstr);
    48         System.out.println();
    49 
    50         System.out.println("---------------公钥校验签名------------------");
    51         System.out.println("签名原串:" + content);
    52         System.out.println("签名串:" + signstr);
    53 
    54         System.out.println("验签结果:" + RSASignature.doCheck(content, signstr, RSAEncrypt.loadPublicKeyByFile(filepath)));
    55         System.out.println();
    56     }
    57 
    58 }
    View Code

     

  • 相关阅读:
    阿米巴
    linux系统和依赖包常用下载地址
    chm格式文件能打开,但看不到内容问题
    云计算的三层SPI模型
    云计算相关的一些概念Baas、Saas、Iaas、Paas
    IOS 开发环境,证书和授权文件等详解
    Android MDM参考
    理解RESTful架构
    联想小新Air2020锐龙版在Ubuntu下添加指纹识别
    避免踩坑,这才是为知笔记导入印象笔记数据的正确姿势
  • 原文地址:https://www.cnblogs.com/PollyLuo/p/9046610.html
Copyright © 2011-2022 走看看