package com.ming.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; 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.SecureRandom; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * RSA加密,支持分片加密 * <pre> * BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码。 * 用4位二进制数来表示1位十进制数中的0~9这10个数码。 * 是一种二进制的数字编码形式,用二进制编码的十进制代码。 * 注:日常所说的BCD码大都是指8421BCD码形式 * @author Ming * */ public class RSAUtil { /** 指定加密算法为RSA */ private static String ALGORITHM = "RSA"; /** 指定key的大小 */ private static int KEYSIZE = 1024; /** 指定公钥存放文件 */ private static String PUBLIC_KEY_FILE = "PublicKey"; /** 指定私钥存放文件 */ private static String PRIVATE_KEY_FILE = "PrivateKey"; public static final String KEY_ALGORITHM = "RSA"; public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; /** * 生成密钥对 */ public static void generateKeyPair() throws Exception { if (getpublickey() == null || getprivatekey() == null) { /** RSA算法要求有一个可信任的随机数源 */ SecureRandom sr = new SecureRandom(); /** 为RSA算法创建一个KeyPairGenerator对象 */ KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM); /** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */ kpg.initialize(KEYSIZE, sr); /** 生成密匙对 */ KeyPair kp = kpg.generateKeyPair(); /** 得到公钥 */ Key publicKey = kp.getPublic(); /** 得到私钥 */ Key privateKey = kp.getPrivate(); /** 用对象流将生成的密钥写入文件 */ ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE)); ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE)); oos1.writeObject(publicKey); oos2.writeObject(privateKey); /** 清空缓存,关闭文件输出流 */ oos1.close(); oos2.close(); } } /** * 产生签名 * * @param data * @param privateKey * @return * @throws Exception */ public static String sign(byte[] data, String privateKey) throws Exception { // 解密由base64编码的私钥 byte[] keyBytes = decryptBASE64(privateKey); // 构造PKCS8EncodedKeySpec对象 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取私钥对象 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); // 用私钥对信息生成数字签名 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(data); return encryptBASE64(signature.sign()); } /** * 验证签名 * * @param data * @param publicKey * @param sign * @return * @throws Exception */ public static boolean verify(byte[] data, String publicKey, String sign) throws Exception { // 解密由base64编码的公钥 byte[] keyBytes = decryptBASE64(publicKey); // 构造X509EncodedKeySpec对象 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取公钥对象 PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(pubKey); signature.update(data); // 验证签名是否有效 return signature.verify(decryptBASE64(sign)); } /** * BASE64解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } /** * 加密方法 source: 源数据 */ public static String encrypt(String source) throws Exception { generateKeyPair(); /** 将文件中的公钥对象读出 */ ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); Key key = (Key) ois.readObject(); ois.close(); /** 得到Cipher对象来实现对源数据的RSA加密 */ Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key); int MaxBlockSize = KEYSIZE / 8; int len = (MaxBlockSize - 11) / 8; String[] datas = splitString(source, len); StringBuffer mi = new StringBuffer(); for (String s : datas) { mi.append(bcd2Str(cipher.doFinal(s.getBytes()))); } return mi.toString(); } /** * 字符串分片 * * @param string * 源字符串 * @param len * 单片的长度(keysize/8) * @return */ public static String[] splitString(String string, int len) { int x = string.length() / len; int y = string.length() % len; int z = 0; if (y != 0) { z = 1; } String[] strings = new String[x + z]; String str = ""; for (int i = 0; i < x + z; i++) { if (i == x + z - 1 && y != 0) { str = string.substring(i * len, i * len + y); } else { str = string.substring(i * len, i * len + len); } strings[i] = str; } return strings; } /** * bcd 转 Str * * @param bytes * @return */ public static String bcd2Str(byte[] bytes) { char temp[] = new char[bytes.length * 2], val; for (int i = 0; i < bytes.length; i++) { val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f); temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0'); val = (char) (bytes[i] & 0x0f); temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0'); } return new String(temp); } /** * 解密 * * @param cryptograph * :密文 * @return 解密后的明文 * @throws Exception */ public static String decrypt(String cryptograph) throws Exception { generateKeyPair(); /** 将文件中的私钥对象读出 */ @SuppressWarnings("resource") ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); Key key = (Key) ois.readObject(); /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */ Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key); int key_len = KEYSIZE / 8; byte[] bytes = cryptograph.getBytes(); byte[] bcd = ASCII2BCD(bytes, bytes.length); StringBuffer sBuffer = new StringBuffer(); byte[][] arrays = splitArray(bcd, key_len); for (byte[] arr : arrays) { sBuffer.append(new String(cipher.doFinal(arr))); } return sBuffer.toString(); } /** * ASCII 转 BCD * * @param ascii * @param asc_len * @return */ public static byte[] ASCII2BCD(byte[] ascii, int asc_len) { byte[] bcd = new byte[asc_len / 2]; int j = 0; for (int i = 0; i < (asc_len + 1) / 2; i++) { bcd[i] = asc2bcd(ascii[j++]); bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc2bcd(ascii[j++])) + (bcd[i] << 4)); } return bcd; } /** * asc转bcd * * @param asc * @return */ public static byte asc2bcd(byte asc) { byte bcd; if ((asc >= '0') && (asc <= '9')) bcd = (byte) (asc - '0'); else if ((asc >= 'A') && (asc <= 'F')) bcd = (byte) (asc - 'A' + 10); else if ((asc >= 'a') && (asc <= 'f')) bcd = (byte) (asc - 'a' + 10); else bcd = (byte) (asc - 48); return bcd; } /** * 字节数组分片 * * @param data * @param len * @return */ public static byte[][] splitArray(byte[] data, int len) { int x = data.length / len; int y = data.length % len; int z = 0; if (y != 0) { z = 1; } byte[][] arrays = new byte[x + z][]; byte[] arr; for (int i = 0; i < x + z; i++) { arr = new byte[len]; if (i == x + z - 1 && y != 0) { System.arraycopy(data, i * len, arr, 0, y); } else { System.arraycopy(data, i * len, arr, 0, len); } arrays[i] = arr; } return arrays; } /** 将文件中的公钥对象读出 */ public static String getpublickey() { try { @SuppressWarnings("resource") ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); Key key = (Key) ois.readObject(); String publickey = encryptBASE64(key.getEncoded()); return publickey; } catch (Exception e) { LogUtil.exception(e); } return null; } /** 将文件中的私钥对象读出 */ public static String getprivatekey() { try { @SuppressWarnings("resource") ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); Key key = (Key) ois.readObject(); String privatekey = encryptBASE64(key.getEncoded()); return privatekey; } catch (Exception e) { LogUtil.exception(e); } return null; } public static void main(String[] args) { try { String s = encrypt("allming.com"); System.out.println("加密:"+s); System.out.println("解密:"+decrypt(s)); } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
太赫兹金属回形结构:电磁波调控与信号传输的关键技术,太赫兹金属回形结构。 ,太赫兹; 金属; 回形结构; 电磁波响应,太赫兹金属回形结构:高效电磁波调控技术
路翼DCS460电脑调音软件下载是专为汽车音响爱好者和专业人士设计的一款强大工具, 这款软件的主要功能在于帮助用户对车载音频系统进行精确的数字信号处理,以提升音乐播放效果,提供更丰富的听觉体验。
基于Matlab的轴承故障分类系统:小波包能量特征提取与深度置信网络(DBN)的分类模型研究与应用,基于小波包能量特征提取和深度置信网络(DBN)的轴承故障分类 开发语言matlab 程序内容包括 1.轴承故障数据一份,共10类 2.数据读取,训练集,测试集数据划分。 3.小波包特征能量特征提取程序一份 4.基于DBN故障分类模型一份 ,小波包能量特征提取;DBN故障分类模型;Matlab;轴承故障数据;数据划分,基于MATLAB的轴承故障分类:小波包能量特征提取与深度置信网络分类模型
matlab实现PSO-BP分类完整程序+数据
基于AHP-CRITIC组合变权与指标劣化度修正的赋权方法研究,38考虑劣化度APH-CRITIC组合变权 组合变权赋权方法,基于AHP和改进CRITIC计算主客观权重,引入指标劣化度构造变权函数对综合权重进行修正,还方法可以捕捉指标时序的劣化程度,实现数据的有效跟踪,评价更加合理。 可根据需求进行改进。 ,关键词:组合变权赋权方法;AHP;CRITIC;指标劣化度;变权函数;时序劣化程度;数据跟踪;评价合理。,基于AHP-CRITIC组合变权法:综合主客观权重与指标劣化度评价
ROS机械臂仿真与视觉抓取技术:Darknet_ROS配置及Matlab运动学轨迹规划研究,ros机械臂仿真代做,视觉抓取,darknet_ros配置 Matlab机械臂运动学,轨迹规划 ,ROS机械臂仿真; 视觉抓取; darknet_ros配置; Matlab机械臂运动学; 轨迹规划,ROS机械臂仿真与视觉抓取:Darknet_ROS配置及Matlab运动学轨迹规划
农村事务管理与交流平台 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"基于Rsoft的光纤拉锥与弯曲模型仿真研究:探究beamprop模块的应用",光纤弯曲、拉锥弯曲模型仿真 Rsoft光学仿真,beamprop模块 ,光纤弯曲; 拉锥弯曲模型仿真; Rsoft光学仿真; beamprop模块,Rsoft仿真:光纤拉锥与弯曲的光束传播模型研究
亚像素提取的精确利器:Bresenham算法与卡尺算法的融合应用,bresenham算法,用于亚像素提取,卡尺算法 ,Bresenham算法; 亚像素提取; 卡尺算法,"Bresenham算法:亚像素提取的精准工具"
基于Vivado HLS的CLAHE算法FPGA实现:高效率视频处理IP核工程,限制对比度的自适应直方图均衡算法(CLAHE)的FPGA实现。 可实时处理视频流。 算法具体内容不做过多介绍,网上都有。 使用vivado hls实现,生成的IP核的输入输出接口都为axi-stream。 已经上板跑通(zynq7020)。 摄像头分辨率400*400-30fps,可以轻松的做到实时处理。 (如果您不清楚我的源码是否能应用到您的项目中,可以发我硬件平台和要处理视频流的分辨率与帧率,帮你评估。 )此hls源码工程。 ,关键词: 1. 限制对比度的自适应直方图均衡算法(CLAHE) 2. FPGA实现 3. 实时处理视频流 4. Vivado HLS 5. AXI-Stream接口 6. Zynq7020平台 7. 摄像头分辨率与帧率 8. HLS源码工程,基于Vivado HLS的CLAHE算法FPGA实现:实时视频流处理工程
games101-作业3
"基于Halcon的C#可视化工具:轻松抓边抓圆,Halcon控件上绘制更简单",使用C#新研发的基于Halcon的可视化抓边、抓圆工具,在Halcon控件上绘制的,使用起来简单 ,使用C#研发;Halcon可视化抓边工具;Halcon抓圆工具;在Halcon控件上绘制;简单易用;快速使用;直接绘制,"C#研发的Halcon可视化工具:抓边抓圆,简单易用"
基于微信小程序的校园食堂订餐服务系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"COMSOL PDE中设置Floquet周期性边界条件的步骤与注意事项",comsol pde设置floqeut周期性边界条件 ,comsol; pde设置; floqeut; 周期性边界条件,COMSOL PDE设置周期性边界条件
计算机网络第八版课件资料
基于FLAC3D的复杂地质环境下的双线隧道与基坑协同开挖策略:分步开挖,多层防护处理,flac3d 双线隧道开挖和基坑开挖。 临近既有隧道基坑开挖。 首先进行隧道开挖,考虑应力释放,使用反力支撑法,使用shell壳单元支护。 然后进行基坑开挖,使用地连墙和对撑支护。 分三层开挖。 ,flac3d;双线隧道开挖;基坑开挖;应力释放;反力支撑法;shell壳单元支护;分三层开挖;地连墙;对撑支护。,FLAC3D:隧道基坑双线开挖与支护技术
4b076399e3f709dc8990bd0e12720254.part6
西门子S7-200PLC与组态王技术在温室大棚系统中的应用与实现,38#西门子S7-200PLC和组态王温室大棚系统 ,38号项目; 西门子S7-200PLC; 组态王; 温室大棚系统; 控制系统,西门子S7-200PLC与组态王联控温室大棚系统
"深度探讨:对称修正梯形加速度规律插补算法的推导与仿真实践",对称修正梯形加速度规律插补算法推导仿真 ,对称修正; 梯形加速度; 插补算法; 推导; 仿真,对称梯形加速度插补算法推导仿真
"基于MATLAB GUI界面的多步骤裂缝检测系统:去除阴影,滤噪处理,图像增强与骨架特征提取技术",- 标题: 基于matlab的裂缝检测系统 - 关键词:matlab GUI界面 数字图像处理 去除阴影 滤波 图像增强 大津算法 otsu zhang_suen算法 形态学操作 骨架特征提取 中轴变化 - 步骤:打开图像 去除阴影 滤波操作 图像增强 阈值处理 形态学操作 骨架提取 - 简述:使用数字图像处理技术对输入图像去阴影操作,并可选择使用:中值滤波,均值滤波, 高斯滤波三种算法,之后再对图像进行增强操作,阈值化的大津算法,以及对阈值处理后的图像进行形态学操作,最终使用zhang_suen算法或者中轴变化算法,骨架效果提取明显,能保持裂缝的总体结构不变化且连续。 ,基于matlab的裂缝检测系统;matlab GUI界面;数字图像处理;去除阴影;滤波(中值滤波、均值滤波、高斯滤波);图像增强;大津算法;形态学操作;zhang_suen算法;骨架特征提取;中轴变化。,基于Matlab GUI的裂缝检测系统:数字图像处理与阴影去除技术