java几种常见加密算法小试
http://www.cnblogs.com/JCSU/articles/2803598.html
http://www.open-open.com/lib/view/open1397274257325.html
一、代码:
package com.haha.ciper.test; import java.math.BigInteger;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.MessageDigest;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.RSAPublicKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Random; import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec; import org.junit.After;import org.junit.Before;import org.junit.Test; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; public class CoderTest { private static String message; @Before public void before(){ message="你好吗?"; System.out.println("-------------------------------"); } @After public void after(){ System.out.println("-------------------------------"); } @Test /** * BASE64编码格式 */ public void test_Base64Coder(){ try { BASE64Encoder baseEncoder=new BASE64Encoder(); BASE64Decoder baseDecoder=new BASE64Decoder(); byte[] byte1=message.getBytes(); String str2=baseEncoder.encode(byte1); System.out.println("Base64编码后:"+str2);//5a2Z5oKf56m6 byte[] byte2 = baseDecoder.decodeBuffer(str2); System.out.println("Base64解码后:"+new String(byte2)); } catch (Exception e) { e.printStackTrace(); } } @Test /** * 单向加密,摘要 */ public void test_OneWay(){ try { //MD5 MessageDigest md5=MessageDigest.getInstance("MD5"); byte[] b = md5.digest(message.getBytes("utf-8")); System.out.println("md5摘要后转成16进制:"+byteArrayToString(b)); //SHA MessageDigest sha=MessageDigest.getInstance("SHA"); byte[] bsha=sha.digest(message.getBytes("utf-8")); System.out.println("sha散列后转成16进制:"+byteArrayToString(bsha)); //HMAC KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5");//HmacMD5 SecretKey secreKey = keyGenerator.generateKey(); Mac mac=Mac.getInstance(secreKey.getAlgorithm()); mac.init(secreKey); byte[] byteMac = mac.doFinal(); System.out.println("mac散列鉴别转成16进制:"+byteArrayToString(byteMac)); } catch (Exception e) { e.printStackTrace(); } } @Test /** * 对称加密, * 注意:Input length must be multiple of 8 */ public void test_sym(){ try { //DES加密 String pass="12345678";//注意此长度应该大于8位,否则运行时出错 DESKeySpec keySpec=new DESKeySpec(pass.getBytes()); SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(keySpec); Cipher cipher=Cipher.getInstance("DES"); SecureRandom random = new SecureRandom(); cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); byte[] enByte=cipher.doFinal(message.getBytes()); System.out.println("des加密后转成16进制:"+byteArrayToString(enByte)); cipher.init(Cipher.DECRYPT_MODE, secretKey, random); byte[] deByte=cipher.doFinal(enByte); System.out.println("des解密后:"+new String(deByte)); //PBE加密 pass="abc"; PBEKeySpec pbeSpec=new PBEKeySpec(pass.toCharArray()); SecretKeyFactory pbeFactory=SecretKeyFactory.getInstance("PBEWITHMD5andDES"); SecretKey pbeSecretKey=pbeFactory.generateSecret(pbeSpec); byte[] salt=new byte[8]; Random rand=new Random(); rand.nextBytes(salt); PBEParameterSpec paramSpec=new PBEParameterSpec(salt,100); Cipher cipherPbe=Cipher.getInstance("PBEWITHMD5andDES"); cipherPbe.init(Cipher.ENCRYPT_MODE, pbeSecretKey, paramSpec); byte[] byteEnPBE=cipherPbe.doFinal(message.getBytes()); System.out.println("PBE加密后转成16进制:"+byteArrayToString(byteEnPBE)); cipherPbe.init(Cipher.DECRYPT_MODE, pbeSecretKey, paramSpec); byte[] byteDePBE=cipherPbe.doFinal(byteEnPBE); System.out.println("PBE解密后:"+new String(byteDePBE)); } catch (Exception e) { e.printStackTrace(); } } @Test /** * 非对称加密 */ public void test_Asym(){ try { //RSA :据说如果明文长度大于模长度则要分组加密,此处暂不实现 KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair=keyPairGen.generateKeyPair(); RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); String pubStr=byteArrayToString(rsaPublicKey.getEncoded()); pubStr=new BASE64Encoder().encode(rsaPublicKey.getEncoded()); System.out.println("RSA公钥:"+pubStr); String priStr=byteArrayToString(rsaPrivateKey.getEncoded()); priStr=new BASE64Encoder().encode(rsaPrivateKey.getEncoded()); System.out.println("RSA私钥:"+priStr); //私钥加密-公钥解密 String modules=rsaPublicKey.getModulus().toString(); String public_exponent=rsaPublicKey.getPublicExponent().toString(); BigInteger bipub=new BigInteger(public_exponent); String private_exponent=rsaPrivateKey.getPrivateExponent().toString(); BigInteger bim=new BigInteger(modules); BigInteger bipri=new BigInteger(private_exponent); KeyFactory keyFactory=KeyFactory.getInstance("RSA"); Cipher cipher=Cipher.getInstance("RSA"); RSAPrivateKeySpec privateSpec=new RSAPrivateKeySpec(bim,bipri); Key privateKey=(RSAPrivateKey) keyFactory.generatePrivate(privateSpec); cipher.init(Cipher.ENCRYPT_MODE, privateKey); byte[] encdata=cipher.doFinal(message.getBytes()); System.out.println("私钥加密后的数据为:"+byteArrayToString(encdata)); RSAPublicKeySpec publicSpec=new RSAPublicKeySpec(bim,bipub); Key publicKey=(RSAPublicKey) keyFactory.generatePublic(publicSpec); cipher.init(Cipher.DECRYPT_MODE,publicKey); byte[] decdata=cipher.doFinal(encdata); System.out.println("公钥解密后的数据为:"+new String(decdata)); //公钥加密-私钥解密 cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] pubEnc=cipher.doFinal("我很好,你呢?".getBytes()); System.out.println("公钥加密后的数据为:"+byteArrayToString(pubEnc)); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] priDec=cipher.doFinal(pubEnc); System.out.println("私钥解密后的数据为:"+new String(priDec,"UTF-8")); //数字签名:私钥签名——公钥验证 PKCS8EncodedKeySpec pkcs8EnSpec=new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(priStr)); PrivateKey signKey=keyFactory.generatePrivate(pkcs8EnSpec); Signature signature=Signature.getInstance("MD5withRSA"); signature.initSign(signKey); signature.update(encdata); byte[] signdata=signature.sign(); System.out.println("签名后:"+byteArrayToString(signdata)); X509EncodedKeySpec x509EncSpec=new X509EncodedKeySpec(new BASE64Decoder().decodeBuffer(pubStr)); PublicKey veryKey=keyFactory.generatePublic(x509EncSpec); signature.initVerify(veryKey); signature.update(encdata); Boolean isValid=signature.verify(signdata); System.out.println("验证签名:"+isValid); } catch (Exception e) { e.printStackTrace(); } } /** * 该方法为二进制转16进制 * 可以用new BASE64Encoder().encode(byte)替换,然后用new BASE64Decoder().decodeBuffer(str)逆转 * @param arrays * @return */ public String byteArrayToString(byte[] arrays){ StringBuffer sb=new StringBuffer(); for(int i=0;i<arrays.length;i++){ String str=Integer.toHexString(0xFF&arrays[i]); if(1==str.length()){ sb.append("0").append(str); }else{ sb.append(str); }// sb.append(","); } return sb.toString(); } }
二、结果:
-------------------------------Base64编码后:5L2g5aW95ZCX77yfBase64解码后:你好吗?--------------------------------------------------------------md5摘要后转成16进制:bb0b6bc45375143826f72439e050743esha散列后转成16进制:45ae21511874936d98a8f48d00dd7496ce650094mac散列鉴别转成16进制:12238759ada6954dcea7bad8cb756e40--------------------------------------------------------------des加密后转成16进制:316d7895d0e3822fd3511480a4ac0f28des解密后:你好吗?PBE加密后转成16进制:3d97bceeda52b23726a7cf683dd71f04PBE解密后:你好吗?--------------------------------------------------------------RSA公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChXsqtx0/wNVM3syuP5rKi141m/oOkrz6MXweeii7TAGYc3esjsi3B8/PyQZ5kajrz1fbN4LumKRIKSOnxj3yIR0sZwH1zfnbnWmdfv2jBv6ZT7lEkBrob4ibzTZc+twsd5zwx9whXBsUu7XPQX38d0FN7yqLepD+hLnJIveNEDQIDAQABRSA私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKFeyq3HT/A1UzezK4/msqLXjWb+g6SvPoxfB56KLtMAZhzd6yOyLcHz8/JBnmRqOvPV9s3gu6YpEgpI6fGPfIhHSxnAfXN+dudaZ1+/aMG/plPuUSQGuhviJvNNlz63Cx3nPDH3CFcGxS7tc9Bffx3QU3vKot6kP6Eucki940QNAgMBAAECgYEAhxDWR9nZeM7JVoeq4IlR36bXfettuDvN+KPZtsMmKgndbi/5Dimmzv4now91Scr4iPr/1pZRueQKa31YAo38xqYfWEmHEV5s02JqVgF3QIsUqRpye99KLydrF7G3EQ4T9ZlDhNNQgD5BwBt7lzWMxtL0vjbOXJ0vAfQE6CnL0OkCQQDgussq8a16VVslfb1NbXx+YBbj0iEYrLwnQ79eMyZ2MmxQpPOZdjn6asz6kZscb92HkcHzroPwEJEwCm7WMf53AkEAt9MKzo9tnhB1UHLn4XzEwQpCFeBE0/uEJK+Nqsr4EvmgBok24pwJlWb7TGf6UpT0/5v3CNwp48wzwaD7omXemwJBAM+rjifnIdqUmh/xLEgqzwqxnTV2buMwbMcUEfno5rf/LJzxcbL0z+sbWsSKXX5P2bV3+nVHZeEoTiLI4VfK500CQCu+CYVLtg715aSmIy2SDhPNiBpCir5SzIgaSkDJGa0SP5Uuk6Pq85Dct5Hf8D40efRVPbya/1DYp7w8vYRQb18CQFWFjw/+3rmn8YdsZ2g/DVnF+wVvadS7QhXZZzpLgd7OJqsHFvI8G94lMq+b3mxbmi0BXPB1XlNAGoHj2lbnuYE=私钥加密后的数据为:9082fd2d027a1d3fc928a51d92e6a8141cd2ef234c5fe01b155bb0c927dc4357f1165101df339dc603b26d12375b67bd42a125c15605f135aea7b3098cb0c3e2a045ed5d4635340b762af0488334309460d05cb14f33d280a28158fbcdfec2fa1360d057c9ffe52529459fb054e0a003648e97bda688efb7001e5a5f48735c8a公钥解密后的数据为:你好吗?公钥加密后的数据为:40ef781411a6cb1147e987db924de00636cac4092ce178003c6c45d91f1d7aa3f929d3cfcfeb18d97a435eb8deff4b00e9924f049af92082b26ffc4cc6259c49a6661599bb50cf0e05da7fdd103074a7225c8a30225773fec0d6a7c9fac5108e41e2d2828c7e54617ea802d6598699e58aca068d874feb0be920aded79000f8a私钥解密后的数据为:我很好,你呢?签名后:8d30a274d4f9ebea1b6e7aacfff8cdfc4938516eb0658b953dab845d7d3c7505126823c56844320b7fd251d47e1f2bb7a9ee9233867e4f12a1237a61151526f23a60ebbf6fdbc2f6e9b3406e1ed9039b61e67e637874b765f150257edeaf3afe85a563d912cd30dcc06c7a38bf8987fc6f023077cc64bdf520e7f50a72cd2ec6验证签名:true-------------------------------
转载于:https://www.cnblogs.com/shoubianxingchen/p/5305617.html
java几种常见加密算法小试相关推荐
- Java 10种常见设计模式UML图
Java 10种常见设计模式UML图 简单工厂模式(不属于23种设计模式) 工厂方法模式 单例 模式(静态内部类方式 IODH) 适配器模式 装饰者模式 门面模式 代理模式(静态代理) 观察者模式 策 ...
- 万字长文总结JAVA几种常见的编码格式和乱码原因分析
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 developer.ibm.com/zh/articles/j-lo-chine ...
- Java几种常见的编码方式
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的 ...
- 几种常见加密算法初窥及如何选用加密算法
以前写文章总喜欢先废话一堆,这次就免了,直入主题. 加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 ...
- Java几种常见排序算法与代码实现
前言: 排序算法也算是每年校招.春招.社招都会问到的问题,虽然每次复习了就忘,但是也可以隔一段时间又拿出来看看. 其中,排序方式指,内部还是外部排序.只需要内部内存就可以的称为内部排序,数据量太大需要 ...
- Java几种常见的设计模式
--------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...
- 网络安全:为大家介绍5种常见的加密算法
数据加密是将数据从可读格式转换为加扰信息的过程.这样做是为了防止窥探者读取传输中的机密数据.加密可以应用于文档.文件.消息或任何其他形式的网络通信.网络犯罪如此疯狂,数据被别人看到,甚至窃走了怎么办? ...
- Java的几种常见接口用法
2019独角兽企业重金招聘Python工程师标准>>> Java的几种常见接口用法 今天在看阎宏的< Java与模式>,里面对 java的 几种 接口的常用方法的总结: ...
- 【转】Java 枚举7常见种用法
原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu 原创地址:http://blog.li ...
- es elasticsearch 几种常见查询场景 二次分组 java读取es的查询json文件
大家好,我是烤鸭: es中几种常见的查询场景,使用java读取es的json文件进行查询. es 中文使用手册. https://www.elastic.co/guide/cn/elasticsear ...
最新文章
- 输入序列连续的序列检测
- Linux/Unix下tar命令详解
- 企业实战_21_MyCat_keepalived 安装配置验证
- spring复杂数据类型传递
- 转 python 闭包的说明
- mysql判断表字段或索引是否存在,然后修改
- 「深度」物料成本不到1500的iPhone6s凭什么5288元起售?
- Redis集群生产环境高可用方案实战过程
- c语言例题 3/100
- Java生成32位全局唯一id
- 中国国际电子商务中心与易观分析联合发布:2021年4季度全国网络零售发展指数同比增长0.6%
- MySQL按年龄段查询
- SOC课程实验——PC程序计数器设计
- vue mvc与mvvm
- python安装包问题小结
- 卖货文案不会写?试试这5个方法(二)
- 手把手教在VMware虚拟机中安装Windows11系统
- 服务器中病毒要不要重装系统,五种情况必须要给电脑重装系统,这三种不用重做系统,别被骗了!...
- android 点赞局部刷新,局部刷新ListView,实现点赞功能
- 迪杰斯特拉算法详解+模版+例题
热门文章
- iOS开发之WKWebview(淘宝链接不自动打开淘宝和天猫的app)
- matlab中fopen 和 fprintf函数总结
- 5G Next Generation of Communication
- 5年了...Capstone 终于升级到4.0!
- wpf之DataTrigger 数据触发器
- 在Win8.1系统下如何安装运行SQL Server 2005 (以及安装SQL Server 2005 Express打补丁)...
- UltimateAndroid快速开发框架教程
- HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露
- LINUX 下安装 jdk 问题(please use alien to install rpm packages on Debian )
- 如何开发出一个完整的Java Web项目?