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编码后:5L2g5aW95ZCX77yf
Base64解码后:你好吗?
-------------------------------
-------------------------------
md5摘要后转成16进制:bb0b6bc45375143826f72439e050743e
sha散列后转成16进制:45ae21511874936d98a8f48d00dd7496ce650094
mac散列鉴别转成16进制:12238759ada6954dcea7bad8cb756e40
-------------------------------
-------------------------------
des加密后转成16进制:316d7895d0e3822fd3511480a4ac0f28
des解密后:你好吗?
PBE加密后转成16进制:3d97bceeda52b23726a7cf683dd71f04
PBE解密后:你好吗?
-------------------------------
-------------------------------
RSA公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChXsqtx0/wNVM3syuP5rKi141m/oOkrz6MXwee
ii7TAGYc3esjsi3B8/PyQZ5kajrz1fbN4LumKRIKSOnxj3yIR0sZwH1zfnbnWmdfv2jBv6ZT7lEk
Brob4ibzTZc+twsd5zwx9whXBsUu7XPQX38d0FN7yqLepD+hLnJIveNEDQIDAQAB
RSA私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKFeyq3HT/A1UzezK4/msqLXjWb+
g6SvPoxfB56KLtMAZhzd6yOyLcHz8/JBnmRqOvPV9s3gu6YpEgpI6fGPfIhHSxnAfXN+dudaZ1+/
aMG/plPuUSQGuhviJvNNlz63Cx3nPDH3CFcGxS7tc9Bffx3QU3vKot6kP6Eucki940QNAgMBAAEC
gYEAhxDWR9nZeM7JVoeq4IlR36bXfettuDvN+KPZtsMmKgndbi/5Dimmzv4now91Scr4iPr/1pZR
ueQKa31YAo38xqYfWEmHEV5s02JqVgF3QIsUqRpye99KLydrF7G3EQ4T9ZlDhNNQgD5BwBt7lzWM
xtL0vjbOXJ0vAfQE6CnL0OkCQQDgussq8a16VVslfb1NbXx+YBbj0iEYrLwnQ79eMyZ2MmxQpPOZ
djn6asz6kZscb92HkcHzroPwEJEwCm7WMf53AkEAt9MKzo9tnhB1UHLn4XzEwQpCFeBE0/uEJK+N
qsr4EvmgBok24pwJlWb7TGf6UpT0/5v3CNwp48wzwaD7omXemwJBAM+rjifnIdqUmh/xLEgqzwqx
nTV2buMwbMcUEfno5rf/LJzxcbL0z+sbWsSKXX5P2bV3+nVHZeEoTiLI4VfK500CQCu+CYVLtg71
5aSmIy2SDhPNiBpCir5SzIgaSkDJGa0SP5Uuk6Pq85Dct5Hf8D40efRVPbya/1DYp7w8vYRQb18C
QFWFjw/+3rmn8YdsZ2g/DVnF+wVvadS7QhXZZzpLgd7OJqsHFvI8G94lMq+b3mxbmi0BXPB1XlNA
GoHj2lbnuYE=
私钥加密后的数据为:9082fd2d027a1d3fc928a51d92e6a8141cd2ef234c5fe01b155bb0c927dc4357f1165101df339dc603b26d12375b67bd42a125c15605f135aea7b3098cb0c3e2a045ed5d4635340b762af0488334309460d05cb14f33d280a28158fbcdfec2fa1360d057c9ffe52529459fb054e0a003648e97bda688efb7001e5a5f48735c8a
公钥解密后的数据为:你好吗?
公钥加密后的数据为:40ef781411a6cb1147e987db924de00636cac4092ce178003c6c45d91f1d7aa3f929d3cfcfeb18d97a435eb8deff4b00e9924f049af92082b26ffc4cc6259c49a6661599bb50cf0e05da7fdd103074a7225c8a30225773fec0d6a7c9fac5108e41e2d2828c7e54617ea802d6598699e58aca068d874feb0be920aded79000f8a
私钥解密后的数据为:我很好,你呢?
签名后:8d30a274d4f9ebea1b6e7aacfff8cdfc4938516eb0658b953dab845d7d3c7505126823c56844320b7fd251d47e1f2bb7a9ee9233867e4f12a1237a61151526f23a60ebbf6fdbc2f6e9b3406e1ed9039b61e67e637874b765f150257edeaf3afe85a563d912cd30dcc06c7a38bf8987fc6f023077cc64bdf520e7f50a72cd2ec6
验证签名:true
-------------------------------
java几种常见加密算法小试的更多相关文章
- JAVA几种常见的编码格式(转)
简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...
- Java几种常见的编码方式
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...
- java几种常见的排序算法总结
/*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int ...
- Java几种常见的设计模式
--------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...
- Java几种常见的排序方法
日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一 ...
- java 几种常见的定时器
今天闲着没事就总结了一下在java中常用的几种定时器. 主要有3种java.util.Timer, ScheduledExecutorService和quartz 一.Timer 举个简单例子.每隔5 ...
- Java几种常见的排序算法
一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...
- Java几种常见的四舍五入的方法
/* * 在上面简单地介绍了银行家舍入法,目前java支持7中舍入法: 1. ROUND_UP:远离零方向舍入.向绝对值最大的方向舍入,只要舍弃位非0即进位. 2. ROUND_DOWN:趋向零方向舍 ...
- 【转】Java 枚举7常见种用法
原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu 原创地址:http://blog.li ...
随机推荐
- XML学习摘要
XML元素可以在开始标签中包含属性. 属性(Attribute)提供关于元素的额外信息,属性必须加引号. 属性值必须被引号包围,不过单引号和双引号均可,若属性值本身包含双引号,那么有必要使用单引号包围 ...
- js面向对象组件
1.包装对象 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...
- KnockOut.js入门示例详解
KnockOut框架简称KO,是微软将应用于WPF/Silverlight的MVVM模式在Web上的尝试,这是一个非常有用的JavaScript框架. KO的核心就是绑定,包括数据绑定和行为绑定: K ...
- 解决iOS8安装企业版无反应问题
iOS7可以下载没有任何问题,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但是确认以后没有反应,找了很久,都没有发现问题.后来查看了的device console发现安装的时候出 ...
- SAP abap 需找出口(BADI)的几种方法
需找BADI方法有很多,据公司的牛人说,他知道的就不止5种 现在给出一些比较简单的方法 首先,大家要知道,一个程序的出口不会太多,需找出口,很多的时候都是在尝试 第二,方法:首先会给出事务码,然后通过 ...
- Day6 google Geocoding API
在看机器学习实战中K-means一章,练习中需要调用Yahoo PlaceFinder API 为地点添加经纬度,语言是python.申请到了appid但调用好像还要收费,要填写银行卡号才能用,没管那 ...
- Android FM模块学习之三 FM手动调频
前一章主要是FM的自动调频, 接下来我们就看看FM手动调频是如何进行的.如果不清楚FM自动调频的过程,请打开超链接查看FM搜索频率流程. 首先来看一下流程图: 2.滑动刻度盘HorizontalNum ...
- C++学习笔记22:设备
设备类型 设备文件的性质 设备文件不是普通的磁盘文件 读写设备的数据需要与相应的设备驱动器通信 设备文件的类型 字符设备:读写串行数据字节流,如串口.终端等 块设备:随机读写固定尺寸数据块,如磁盘设备 ...
- poj 1363
这是一道数据结构的问题,用到了栈的知识.题目大意讲的是每一次有N辆车从A到B,但是要将车辆的顺序重新排列,可以通过中转站C来辅助排列,但是C符合先进后出的原则,这一点和栈的特性相同. 整个重新排序的过 ...
- lua的栈
lua的栈是从栈底到栈顶: lua_pushstring(L, "test1");lua_pushstring(L, "test2");lua_pushstri ...