java 加密 数字_java 加密数字签名
1)消息摘要:
这是一种与消息认证码结合使用以确保消息完整性的技术。 主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA- 1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法:
package com.number.test;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MessageDigestExample {
/**
* @param args
* 单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存
*/
public static void main(String[] args) {
if (args.length!=1) {
System.err.println("Usage:java.MessageDigestExample.text");
System.exit(1);
}
try {
byte[] plainText=args[0].getBytes("UTF8");
//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法
MessageDigest messageDigest =MessageDigest.getInstance("SHA-1");
System.out.println("\n"+messageDigest.getProvider().getInfo());
//开始使用算法
messageDigest.update(plainText);
System.out.println("\nDigest");
//输出运算结果
System.out.println(new String(messageDigest.digest(),"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2)私钥加密:
消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。
这种最好理解,使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):
使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),
然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56
位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持,
以下例子使用AES算法来加密:
package com.number.test;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
public class PrivateExample {
/**
* @param args
*
*/
public static void main(String[] args) {
if (args.length!=1) {
System.err.println("Usage:java.PrivateExample.txt");
System.exit(1);
}
try {
byte [] plainText=args[0].getBytes("utf8");
//通过KeyGenerator形成一个key
System.out.println("\nStart generate AES key");
KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
keyGenerator.init(128);
Key key =keyGenerator.generateKey();
System.out.println("Finish generating AES key");
//获得一个私钥加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
System.out.println("\n"+cipher.getProvider().getInfo());
//使用私钥加密
System.out.println("\n Start encryption:");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] cipherText =cipher.doFinal(plainText);
System.out.println("Finish encryption:");
System.out.println(new String(cipherText,"UTF8"));
System.out.println("\nStart decryption:");
cipher.init(Cipher.DECRYPT_MODE,key);
byte[] newPlainText=cipher.doFinal(cipherText);
System.out.println("Finish decryption:");
System.out.println(new String(newPlainText,"UTF8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3)公钥加密:
上面提到,私钥加
密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使
用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很
慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等,jdk1.5种提供了对RSA
的支持,是一个改进的地方:
package com.number.test;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
public class PublicExample {
/**
* @param args
*/
public static void main(String[] args) {
if (args.length!=1) {
System.err.println("Usage:java.PublicExaple.txt");
System.exit(1);
}
try {
byte[] plainText=args[0].getBytes("UTF8");
//构成一个RSA密钥
System.out.println("Start generationg RSA key");
KeyPairGenerator keyPairGenerator =KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair key =keyPairGenerator.generateKeyPair();
System.out.println("Finish generation RSA key");
//获得一个RSA的Cipher类,使用公钥加密
Cipher cipher =Cipher.getInstance("RSA/ECB/PKCS1Padding");
System.out.println("\n"+cipher.getProvider().getInfo());
System.out.println("\n Start encryption");
cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());
byte[] cipherText=cipher.doFinal(plainText);
System.out.println("\n Finish encryption");
System.out.println(new String(cipherText,"UTF8"));
//使用私钥解密
System.out.println("\n decryption");
cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
byte[] newPlainText =cipher.doFinal(cipherText);
System.out.println("Finish decryption");
System.out.println(new String(newPlainText,"UTF8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java 加密 数字_java 加密数字签名相关推荐
- delphi7aes加密解密与java互转_Java 加密/解密Excel
概述 设置excel文件保护时,通常可选择对整个工作簿进行加密保护,打开文件时需要输入密码:或者对指定工作表进行加密,即设置表格内容只读,无法对工作表进行编辑.另外,也可以对工作表特定区域设置保护,即 ...
- 什么是加密数字货币 加密数字货币的发展前景
数字货币是英文的"Digital Currency"(数字货币)的缩写.是电子货币形式的替代货币.数字金币和密码货币都属于数字货币(DIGICCY).它不能完全等同于虚拟世界中的虚 ...
- java security用法_Java加密体系(一)java.security包
一.JCA/ JCE JCA(Java Cryptography Architecture) 是Java体系结构,提供了基本Java加密框架,比如证书.数字签名.消息摘要.秘钥对生成器等,在java. ...
- java加密框架_Java加密解密(一)Java加密体系基础
标签: Java加密解密(一)Java加密体系基础 1. JCA(Java Cryptography Architecture) 提供基本的加密框架,如证书,数字签名,消息摘要和密钥对生成器.其主要实 ...
- java 加密工具包_Java加密和解密算法调用工具包
软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...
- java 字符串加密解密_Java加密解密字符串
importjava.security.Key;importjava.security.Security;importjavax.crypto.Cipher;/*** DES加密和解密工具,可以对字符 ...
- java 如何解密_java加密与解密
1.下载:UnlimitedJCEPolicy 主要:获取权限文件 2.把解压后的 local_policy.jar US_export_policy.jar 复制到 这个目录中: C:\Progra ...
- java 实现电子签名_Java实现数字签名
一 数字签名算法 带有秘钥(公钥,私钥)的消息摘要算法 验证数据完整性,认证数据来源,抗否认 OSI参考模型 私钥签名,公钥验证 RSA,DSA,ECDSA 二 数字签名算法RSA 经典算法 MD,S ...
- java 汉字 数字_java数字转汉字工具类详解
/** * Created by 33303 on 2017/7/28. */ import java.math.BigDecimal; /** * 数字转换为汉语中人民币的大写 * */ publi ...
最新文章
- PCL:从法线计算到曲率计算并可视化
- CSP 201812-1 小明上学 Python实现+详解
- 《OpenGL超级宝典第5版》学习笔记(一)—— 第一个OpenGL程序
- Ubuntu在当前目录下右键直接打开terminal终端
- SAP 货物移动 BAPI 的简单使用 BAPI_GOODSMVT_CREATE
- OSPF网络类型详解
- Java EE 7之前版本替代JPA 2.1的非同步持久性上下文
- 一个可变的C++字符序列是5 0新增的
- float 最小误差_关于float与double结果的误差
- css环形进度条clip,clip实现圆环进度条
- win10 中 ,python 创建虚拟化环境
- 2018全国大学生电子竞赛D题代码和心得
- 如何修改路由器dns服务器,怎么修改路由器DNS地址
- 给销售组织分配分销渠道
- 【农业物联网】智慧农业模型应用多案例分享
- txt文件中生成立体字或图案网站
- 离开华为三年,我才真正认同狼性文化
- html抓取网址某链接,URL 筛选小工具 提取网页中的链接地址
- 【学习笔记】Docker基础实战教程一:入门
- 随风2.0定位助手/fake location最新下载教程