Java公钥私钥签名工具包

package com.locator.encryption; import java.io.ByteArrayOutputStream; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.crypto.Cipher; /**  * <p>  * RSA公钥/私钥/签名工具包  * <p>  * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>  * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>  * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全  * </p>  *   */ public class RSAUtils{     /**      * 加密算法RSA      */     public static final String KEY_ALGORITHM = "RSA";          /**      * 签名算法      */     public static final String SIGNATURE_ALGORITHM = "MD5withRSA";     /**      * 获取公钥的key      */     private static final String PUBLIC_KEY = "LocatorPublicKey";          /**      * 获取私钥的key      */     private static final String PRIVATE_KEY = "LocatorPrivateKey";          /**      * RSA最大加密明文大小      */     private static final int MAX_ENCRYPT_BLOCK = 117;          /**      * RSA最大解密密文大小      */     private static final int MAX_DECRYPT_BLOCK = 128;     /**      * <p>      * 生成密钥对(公钥和私钥)      * </p>      *       * @return      * @throws Exception      */     public static Map<String, Object> genKeyPair() throws Exception {         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);         keyPairGen.initialize(1024);         KeyPair keyPair = keyPairGen.generateKeyPair();         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();         Map<String, Object> keyMap = new HashMap<String, Object>(2);         keyMap.put(PUBLIC_KEY, publicKey);         keyMap.put(PRIVATE_KEY, privateKey);         return keyMap;     }          /**      * <p>      * 用私钥对信息生成数字签名      * </p>      *       * @param data 已加密数据      * @param privateKey 私钥(BASE64编码)      *       * @return      * @throws Exception      */     public static String sign(byte[] data, String privateKey) throws Exception {         byte[] keyBytes = Base64Utils.decode(privateKey);         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);         signature.initSign(privateK);         signature.update(data);         return Base64Utils.encode(signature.sign());     }     /**      * <p>      * 校验数字签名      * </p>      *       * @param data 已加密数据      * @param publicKey 公钥(BASE64编码)      * @param sign 数字签名      *       * @return      * @throws Exception      *       */     public static boolean verify(byte[] data, String publicKey, String sign)             throws Exception {         byte[] keyBytes = Base64Utils.decode(publicKey);         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         PublicKey publicK = keyFactory.generatePublic(keySpec);         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);         signature.initVerify(publicK);         signature.update(data);         return signature.verify(Base64Utils.decode(sign));     }     /**      * <P>      * 私钥解密      * </p>      *       * @param encryptedData 已加密数据      * @param privateKey 私钥(BASE64编码)      * @return      * @throws Exception      */     public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)             throws Exception {         byte[] keyBytes = Base64Utils.decode(privateKey);         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());         cipher.init(Cipher.DECRYPT_MODE, privateK);         int inputLen = encryptedData.length;         ByteArrayOutputStream out = new ByteArrayOutputStream();         int offSet = 0;         byte[] cache;         int i = 0;         // 对数据分段解密         while (inputLen - offSet > 0) {             if (inputLen - offSet > MAX_DECRYPT_BLOCK) {                 cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);             } else {                 cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);             }             out.write(cache, 0, cache.length);             i++;             offSet = i * MAX_DECRYPT_BLOCK;         }         byte[] decryptedData = out.toByteArray();         out.close();         return decryptedData;     }     /**      * <p>      * 公钥解密      * </p>      *       * @param encryptedData 已加密数据      * @param publicKey 公钥(BASE64编码)      * @return      * @throws Exception      */     public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)             throws Exception {         byte[] keyBytes = Base64Utils.decode(publicKey);         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         Key publicK = keyFactory.generatePublic(x509KeySpec);         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());         cipher.init(Cipher.DECRYPT_MODE, publicK);         int inputLen = encryptedData.length;         ByteArrayOutputStream out = new ByteArrayOutputStream();         int offSet = 0;         byte[] cache;         int i = 0;         // 对数据分段解密         while (inputLen - offSet > 0) {             if (inputLen - offSet > MAX_DECRYPT_BLOCK) {                 cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);             } else {                 cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);             }             out.write(cache, 0, cache.length);             i++;             offSet = i * MAX_DECRYPT_BLOCK;         }         byte[] decryptedData = out.toByteArray();         out.close();         return decryptedData;     }     /**      * <p>      * 公钥加密      * </p>      *       * @param data 源数据      * @param publicKey 公钥(BASE64编码)      * @return      * @throws Exception      */     public static byte[] encryptByPublicKey(byte[] data, String publicKey)             throws Exception {         byte[] keyBytes = Base64Utils.decode(publicKey);         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         Key publicK = keyFactory.generatePublic(x509KeySpec);         // 对数据加密         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());         cipher.init(Cipher.ENCRYPT_MODE, publicK);         int inputLen = data.length;         ByteArrayOutputStream out = new ByteArrayOutputStream();         int offSet = 0;         byte[] cache;         int i = 0;         // 对数据分段加密         while (inputLen - offSet > 0) {             if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {                 cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);             } else {                 cache = cipher.doFinal(data, offSet, inputLen - offSet);             }             out.write(cache, 0, cache.length);             i++;             offSet = i * MAX_ENCRYPT_BLOCK;         }         byte[] encryptedData = out.toByteArray();         out.close();         return encryptedData;     }     /**      * <p>      * 私钥加密      * </p>      *       * @param data 源数据      * @param privateKey 私钥(BASE64编码)      * @return      * @throws Exception      */     public static byte[] encryptByPrivateKey(byte[] data, String privateKey)             throws Exception {         byte[] keyBytes = Base64Utils.decode(privateKey);         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());         cipher.init(Cipher.ENCRYPT_MODE, privateK);         int inputLen = data.length;         ByteArrayOutputStream out = new ByteArrayOutputStream();         int offSet = 0;         byte[] cache;         int i = 0;         // 对数据分段加密         while (inputLen - offSet > 0) {             if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {                 cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);             } else {                 cache = cipher.doFinal(data, offSet, inputLen - offSet);             }             out.write(cache, 0, cache.length);             i++;             offSet = i * MAX_ENCRYPT_BLOCK;         }         byte[] encryptedData = out.toByteArray();         out.close();         return encryptedData;     }     /**      * <p>      * 获取私钥      * </p>      *       * @param keyMap 密钥对      * @return      * @throws Exception      */     public static String getPrivateKey(Map<String, Object> keyMap)             throws Exception {         Key key = (Key) keyMap.get(PRIVATE_KEY);         return Base64Utils.encode(key.getEncoded());     }     /**      * <p>      * 获取公钥      * </p>      *       * @param keyMap 密钥对      * @return      * @throws Exception      */     public static String getPublicKey(Map<String, Object> keyMap)             throws Exception {         Key key = (Key) keyMap.get(PUBLIC_KEY);         return Base64Utils.encode(key.getEncoded());     } }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

SSH公钥免密登录其他主机

在多台主机之间使用SSH免密登录,假设主机A免密登录主机B:1\.在主机A上生成自己的ssh公钥:root@A~sshkeygentrsa执行上面命令,一路回车,完成后,会在~/.ssh目录下生成2个文件:id\_rsa(私钥)和id\_rsa.pub(公钥)2\.将主机A上生成的公钥