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 加密数字签名相关推荐

  1. delphi7aes加密解密与java互转_Java 加密/解密Excel

    概述 设置excel文件保护时,通常可选择对整个工作簿进行加密保护,打开文件时需要输入密码:或者对指定工作表进行加密,即设置表格内容只读,无法对工作表进行编辑.另外,也可以对工作表特定区域设置保护,即 ...

  2. 什么是加密数字货币 加密数字货币的发展前景

    数字货币是英文的"Digital Currency"(数字货币)的缩写.是电子货币形式的替代货币.数字金币和密码货币都属于数字货币(DIGICCY).它不能完全等同于虚拟世界中的虚 ...

  3. java security用法_Java加密体系(一)java.security包

    一.JCA/ JCE JCA(Java Cryptography Architecture) 是Java体系结构,提供了基本Java加密框架,比如证书.数字签名.消息摘要.秘钥对生成器等,在java. ...

  4. java加密框架_Java加密解密(一)Java加密体系基础

    标签: Java加密解密(一)Java加密体系基础 1. JCA(Java Cryptography Architecture) 提供基本的加密框架,如证书,数字签名,消息摘要和密钥对生成器.其主要实 ...

  5. java 加密工具包_Java加密和解密算法调用工具包

    软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...

  6. java 字符串加密解密_Java加密解密字符串

    importjava.security.Key;importjava.security.Security;importjavax.crypto.Cipher;/*** DES加密和解密工具,可以对字符 ...

  7. java 如何解密_java加密与解密

    1.下载:UnlimitedJCEPolicy 主要:获取权限文件 2.把解压后的 local_policy.jar US_export_policy.jar 复制到 这个目录中: C:\Progra ...

  8. java 实现电子签名_Java实现数字签名

    一 数字签名算法 带有秘钥(公钥,私钥)的消息摘要算法 验证数据完整性,认证数据来源,抗否认 OSI参考模型 私钥签名,公钥验证 RSA,DSA,ECDSA 二 数字签名算法RSA 经典算法 MD,S ...

  9. java 汉字 数字_java数字转汉字工具类详解

    /** * Created by 33303 on 2017/7/28. */ import java.math.BigDecimal; /** * 数字转换为汉语中人民币的大写 * */ publi ...

最新文章

  1. PCL:从法线计算到曲率计算并可视化
  2. CSP 201812-1 小明上学 Python实现+详解
  3. 《OpenGL超级宝典第5版》学习笔记(一)—— 第一个OpenGL程序
  4. Ubuntu在当前目录下右键直接打开terminal终端
  5. SAP 货物移动 BAPI 的简单使用 BAPI_GOODSMVT_CREATE
  6. OSPF网络类型详解
  7. Java EE 7之前版本替代JPA 2.1的非同步持久性上下文
  8. 一个可变的C++字符序列是5 0新增的
  9. float 最小误差_关于float与double结果的误差
  10. css环形进度条clip,clip实现圆环进度条
  11. win10 中 ,python 创建虚拟化环境
  12. 2018全国大学生电子竞赛D题代码和心得
  13. 如何修改路由器dns服务器,怎么修改路由器DNS地址
  14. 给销售组织分配分销渠道
  15. 【农业物联网】智慧农业模型应用多案例分享
  16. txt文件中生成立体字或图案网站
  17. 离开华为三年,我才真正认同狼性文化
  18. html抓取网址某链接,URL 筛选小工具 提取网页中的链接地址
  19. 【学习笔记】Docker基础实战教程一:入门
  20. 随风2.0定位助手/fake location最新下载教程

热门文章

  1. 计算机软考笔记之《数据库基础》
  2. 《世界因你而不同-李开复自传》读书笔记(1/3)
  3. linux 学习操作小计
  4. 噪音 - Perlin Noise
  5. C#使用oracle数据库的function与procedure
  6. 在asp.net 2.0中使用SqlBulkCopy类迁移数据[转]
  7. linux基础知识——环境变量
  8. 虚拟内存管理习题补充
  9. python海龟绘图_Python教学案例|海龟绘图三例
  10. 类似collect2: ld returned 1 exit status的错误