- 浏览: 53085 次
文章分类
最新评论
1. 加密的作用
1)明文变密文(你不知道密钥是很难解密的);
2)数据的一致性(hash值一样);
3)数据的可信任性(验签)。
2. 两种不同的加密与解密
1)对称加密:加密与解密使用相同的密钥,处理速度快;
2)非对称加密:加密与解密使用不同的密钥(生对生成),处理速度不及对称加密。
3.在非对称加密中,究竟是公钥加密还是私钥加密的问题
1)如果只是用加密的用途
公钥加密,私钥解密(私钥只有一个,公钥大家都知道)。
2)如果用验签
私钥加密,公钥解密(解密的来源是私钥,其它的来源是不可信任的)。
下面是两个工具类。
写一个例子测试下。注意:先要运行上面main方法,使其生成security.key和security.crt。
1)明文变密文(你不知道密钥是很难解密的);
2)数据的一致性(hash值一样);
3)数据的可信任性(验签)。
2. 两种不同的加密与解密
1)对称加密:加密与解密使用相同的密钥,处理速度快;
2)非对称加密:加密与解密使用不同的密钥(生对生成),处理速度不及对称加密。
3.在非对称加密中,究竟是公钥加密还是私钥加密的问题
1)如果只是用加密的用途
公钥加密,私钥解密(私钥只有一个,公钥大家都知道)。
2)如果用验签
私钥加密,公钥解密(解密的来源是私钥,其它的来源是不可信任的)。
下面是两个工具类。
import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; 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 java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Cipher; public class RSAHelper { public static final String KEY_ALGORITHM = "RSA"; private static final int KEY_LENGTH = 1024; public static final String PUBLIC_KEY = "PublicKey"; public static final String PRIVATE_KEY = "PrivateKey"; private static final int MAX_ENCRYPT_BLOCK = 117; private static final int MAX_DECRYPT_BLOCK = 128; private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; public RSAHelper() { } public static void generateKeyPair(Map<String, Object> keyMap) { boolean result = false; KeyPairGenerator keyPairGenerator = null; try { keyPairGenerator = KeyPairGenerator.getInstance("RSA"); result = true; } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } if (result) { SecureRandom secureRandom = new SecureRandom(); String currentDateTime = new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()); secureRandom.setSeed(currentDateTime.getBytes()); keyPairGenerator.initialize(1024, secureRandom); KeyPair keyPair = keyPairGenerator.genKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); keyMap.put("PublicKey", publicKey.getEncoded()); keyMap.put("PrivateKey", privateKey.getEncoded()); } } public static void saveKeyPair(Map<String, Object> keyPair, String publicKeyFileName, String privateKeyFileName) { try { FileOutputStream fileOutputStream = new FileOutputStream( publicKeyFileName); byte[] publicKey = (byte[]) keyPair.get("PublicKey"); fileOutputStream.write(publicKey); fileOutputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } try { FileOutputStream fileOutputStream = new FileOutputStream( privateKeyFileName); byte[] privateKey = (byte[]) keyPair.get("PrivateKey"); fileOutputStream.write(privateKey); fileOutputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } } public static byte[] getKey(String keyFileName) { byte[] keyBytes = null; try { File file = new File(keyFileName); FileInputStream fileInputStream = new FileInputStream(file); DataInputStream dataInputStream = new DataInputStream( fileInputStream); keyBytes = new byte[(int) file.length()]; dataInputStream.readFully(keyBytes); dataInputStream.close(); fileInputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return keyBytes; } public static byte[] encryptWithPublicKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(1, publicK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 117) { cache = cipher.doFinal(data, offSet, 117); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 117; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; } public static byte[] encryptWithPrivateKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(1, privateK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 117) { cache = cipher.doFinal(data, offSet, 117); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 117; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; } public static byte[] decryptWithPublicKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(2, publicK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 128) { cache = cipher.doFinal(data, offSet, 128); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 128; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; } public static byte[] decryptWithPrivateKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(2, privateK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 128) { cache = cipher.doFinal(data, offSet, 128); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 128; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; } public static byte[] sign(byte[] data, int offset, int length, byte[] privateKeyBytes) { byte[] signedData = null; try { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec( privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory .generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update(data, offset, length); signedData = signature.sign(); } catch (Exception ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return signedData; } public static boolean verify(byte[] data, int offset, int length, byte[] publicKeyBytes, byte[] dataSignature) { boolean result = false; try { X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec( publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initVerify(publicKey); signature.update(data, offset, length); result = signature.verify(dataSignature); } catch (Exception ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return result; } }
import com.adph.jms.Base64Utils; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; public class RSAKeyUtils { private static String RAS_PUBLICKEY_PATH = "D://security.key"; private static String RSA_PRIVATEKEY_PATH= "D://security.crt"; public RSAKeyUtils() { } protected static void init(String RAS_PUBLICKEY_PATH, String RSA_PRIVATEKEY_PATH) { try { FileUtils.forceMkdir(new File(new File(RAS_PUBLICKEY_PATH) .getParent())); Map<String, Object> keyPair = new HashMap(); RSAHelper.generateKeyPair(keyPair); RSAHelper.saveKeyPair(keyPair, RAS_PUBLICKEY_PATH, RSA_PRIVATEKEY_PATH); } catch (IOException e) { e.printStackTrace(); } } public static void setKeyPath(String keyPath) { RAS_PUBLICKEY_PATH = keyPath; } public static void setCrtPath(String crtPath) { RSA_PRIVATEKEY_PATH = crtPath; } public static String encByPublicKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.encryptWithPublicKey(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RAS_PUBLICKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String encByPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.encryptWithPrivateKey(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String decByPublicKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.decryptWithPublicKey( Base64Utils.decode(data), 0, Base64Utils.decode(data).length, RSAHelper.getKey(RAS_PUBLICKEY_PATH)); dataBack = new String(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String decByPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.decryptWithPrivateKey( Base64Utils.decode(data), 0, Base64Utils.decode(data).length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = new String(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String doSignPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.sign(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static boolean doVerifyPublicKey(String data, String sign) { Boolean returnFlag = Boolean.FALSE; if ((StringUtils.isEmpty(data)) || (StringUtils.isEmpty(sign))) { return Boolean.FALSE.booleanValue(); } try { returnFlag = Boolean.valueOf(RSAHelper.verify(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RAS_PUBLICKEY_PATH), Base64Utils.decode(sign))); } catch (Exception e) { e.printStackTrace(); } return returnFlag.booleanValue(); } // public static void main(String[] args) { // init("D://security.key", "D://security.crt"); // } }
写一个例子测试下。注意:先要运行上面main方法,使其生成security.key和security.crt。
public class EncTest { public static void main(String[] args) throws Exception { String text = "Hello World"; String enc = RSAKeyUtils.encByPublicKey(text); System.out.println("加密数据:" + enc); System.out.println("解密数据:" + RSAKeyUtils.decByPrivateKey(enc)); String sign=RSAKeyUtils.doSignPrivateKey(text); System.out.println("签名:"+sign); System.out.println("验签结果:"+RSAKeyUtils.doVerifyPublicKey(text, sign)); } }
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 697IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 733代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 440对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2379我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 883今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8181. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 747xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4351. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 366Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 419JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 422在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 763Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1989背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
C3P0 连接分析
2015-12-01 19:05 894最近在看C3P0的原理,还是将C3P0的源码导入到Ecplis ... -
微信开发的原理
2015-11-30 10:10 1318微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 17091. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 403之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1632对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 623昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 482我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
杂货产品检测43-YOLO(v5至v9)、CreateML、Paligemma、TFRecord、VOC数据集合集.rarIPCV分配-V6 2024-01-21 6:10 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括7012张图像。 家庭废物以createMl格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。
谁喜欢谁下载,没啥商业价值,comsol也能做,不过我这产量更大
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
推箱子Python小游戏
该新媒体视域下的中国古诗词展演主要为管理员和用户两类用户角色提供需求,管理员在后台可以对系统进行全面管理,用户在前台可以进行查看系统信息,注册登录,查询校园失物,评论,下载校园失物等操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7
内容概要:本文介绍了使用MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多特征分类预测模型。通过PSO优化BiLSTM模型的超参数、引入注意力机制增强模型的特征提取能力,提升了多维度数据的分类精度。模型在金融风险预测、医疗健康预测、交通流量预测等多个领域具有广泛的应用前景。项目详细描述了模型架构、代码实现、训练与优化、模型评估与可视化、以及GUI界面设计等方面的内容。 适合人群:具备一定编程基础,工作1-3年的数据科学家和机器学习工程师。 使用场景及目标:① 金融、医疗、交通等领域的多特征分类预测任务;② 结合PSO优化BiLSTM超参数、引入注意力机制,提升模型预测准确度。 阅读建议:本文详细讲解了模型的理论背景、算法实现和应用案例,适合希望深入理解深度学习和优化算法的读者。建议结合代码和实际数据进行实验,以便更好地掌握模型的设计和优化过程。
Java项目-基于SSM的物资管理系统项目源码
Video_2024-12-18_000023.wmv
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
系统实现: 用户功能模块:用户点击进入到系统操作界面,可以对主页、个人中心、我的收藏管理、订单管理等功能模块,我的收藏管理:通过列表可以获取用户ID、收藏ID、表名、收藏名称、收藏图片信息并进行修改操作 管理员功能模块:管理员通过用户名和密码填写完成后进行登录。管理员登录成功后进入到系统操作界面,可以对主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等功能模块进行相对应操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
1、嵌入式物联网单片机项目开发实战。例程经过精心编写,简单好用。 2、代码使用KEIL 标准库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7
Java项目-基于SSM的网上淘书吧
内容概要:本文详细介绍了 Oracle 19c 中的闪回技术,包括闪回查询、闪回事务查询、闪回丢弃、闪回表、闪回数据库和闪回归档。具体讲解了每种闪回技术的原理、配置方法、操作步骤和限制条件,并提供了具体的实例和 SQL 命令。目的是帮助数据库管理员和开发人员理解和掌握如何利用这些技术来提高数据恢复和错误修复的能力,减少数据库管理的复杂性和风险。 适合人群:Oracle 数据库管理员、数据库开发人员及维护人员。 使用场景及目标:① 使用闪回技术快速恢复因误操作或其他错误导致的数据丢失;② 配置闪回技术以实现高效的数据库恢复;③ 在日常运维中监控和管理闪回操作。 其他说明:本文不仅提供了理论上的解释,还包含了实际操作的示例,以便读者能够更好地理解和应用这些技术。