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();

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA入门级教学之(if语句)

/* 关于java语言中的if语句,属于选择结构 if语句又被称为分支语句/条件控制语句1.if语句的语法结构:四种编写方式 第一种:条件为真,执行大括号内容 条件为假,*跳出*大括号内容 if(布尔表达式){ java…

python怎么处理数据标注_在python中将数据标记为敏感

编辑我提出了一个使用ctypes(反过来使用c)将内存归零的解决方案。import sysimport ctypesdef zerome(string):location id(string) 20size sys.getsizeof(string) - 20memset ctypes.cdll.msvcrt.memset# For Linux, use the following. Change the 6 to whatever it is o…

JAVA入门级教学之(switch语句)

/* 关于switch语句(我称为匹配语句): 1.switch语句也属于选择结构,也是分支语句 2.switch语句的语法结构: 一个比较完整的switch语句应该这样编写: //case有匹配的意思,相当于拿数据匹配&#x…

java实现验证码图片_java实现验证码图片

1 packagesip.utils;2 importjava.awt.Color;3 importjava.awt.Graphics2D;4 importjava.awt.geom.AffineTransform;5 importjava.util.Random;67 /**8 * 验证码图片生成器9 *10 *authorWuZhengFei11 *12 */13 public classIdentityCode {14 /**15 * 验证码图片的宽度。16 */17…

JAVA入门级教学之(for循环)

/* 1.循环结构: 在程序中有一些代码段需要重复执行,假如没有循环结构, 就需要重复写代码。 将来把需要反复执行的代码片段放到"循环",再联合计数器,共同控制这段需要反…

如何做推荐系统 java_Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统

今天大部分时间都在写业务代码,然后算是从无到有的配置了下spring与mybatis的集成。SpringMVCMybatis Web开发流程配置数据源在applicationContext.xml中引入数据源的配置:在spring-my-datasource.xml中配置数据源相关的内容:配置完成后&…

JAVA入门级教学之(while循环语句)

/* while循环语句: 1.while(布尔表达式) { 循环体; } 2.while循环的执行原理: 先判断布尔表达式的结果: *true …

JAVA入门级教学之(do...while循环)

/* do...while: 1.do...while循环的语法结构: do{ 循环体; }while(布尔表达式); 2.do...while循环的执行原理: 3.do...while循环的执行次数: …

java 接口表单提交_Java http 调用接口提交表单以及文件

Java HttpURLConnection 使用/****/package com.demo.java;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnectio…

JAVA入门级教学之(break跳出)

/* 关于java控制语句中的break语句: 1.break是java语言中的关键字,被翻译为"中断/折断" 2.break";"可以成为一个单独完整的java语句; 3.break语句使用在switch语句中,用来终结swit…

java 文件通道_Java NIO(四)文件通道

文件通道通道是访问I/O服务的导管,I/O可以分为广义的两大类:File I/O和Stream I/O。那么相应的,通道也有两种类型,它们是文件(File)通道和套接字(Socket)通道。文件通道指的是FileChannel,套接字通道则有三个&#xff…

JAVA入门级教学之(continue)

/* continue语句: 1.continue表示:继续/下一个的意思 2.continue;也是一个continue关键字加一个分号构成一个单独的完整的java语句, 主要出现循环语句中用来控制循环的执行。 …

java算法实验标尺问题_在codeigniter项目中使用标尺库

我正在尝试将下面链接中可用的标尺库集成到我的codeigniter项目中 .我使用这些链接中给出的步骤安装和配置它 . 但仍然无法使用库中的方法 . 我尝试了库中的示例代码,但它不起作用 . 看起来Ruler库没有得到我的项目,因此方法没有解决 . 寻求帮助以实现这…

JAVA入门级教学之(方法-1)

目录 JAVA入门级教学之(方法-1) 1.以下程序不使用"方法",分析一下程序会存在哪些优缺点? 2.方法的本质:是一段代码片段,可以完成特定功能,可以重复利用 3.注意:方法定义在…

java设计模式初探之装饰者_JAVA设计模式初探之装饰者模式

装饰者模式1、意图: 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。2、适用环境(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责…

JAVA入门级教学之(方法-2)

/* 关于方法调用 -1.方法的修饰符列表中有static关键字,完整的调用方法是:类名.方法名(实参列表); -2.对于方法的修饰符列表中有static关键字的,"类名."可以省略不写 -3.对于在类外的方法调用,就必须使…

JAVA入门级教学之(方法-题-3)

/*分析以下程序的输出结果: *方法体内自上而下执行 *main方法开始main 方法结束*/public class method03 {public static void main(String[] args){System.out.println("main begin");m1();System.out.println("main over");}public static vo…

redis在java中的方法_redis在java中的使用方法

Redis是key-value方式储存数据的内存数据库。下载后解压,redis-server.exe是redis服务,启动之后就可以使用redis。redis-cli.exe是客户端,可以访问本地或远程的redis。redis-cli.exe -h 127.0.0.1 -p 6379 命令行命令。修改-h后的ip…

JAVA入门级教学之(方法-4)

/* 方法的返回值类型不是void的时候 1.要求方法必须保证百分百的执行"return 值;"这样的语句来完成值的返回 *没有这个语句编译器会报错 2.一个方法有返回值的时候,当我们调用这个方法的时候,方法返回了一个值&…

Java写一个快速排序_快速排序java实现

1.快速排序的思想快速排序属于交换排序,是冒泡排序的升降版。相对于冒泡排序而言,快速排序增大了记录比较和移动的距离,将关键字较大的记录直接移动到后面,将关键字较小的记录直接移动到前面;不再是相邻两个记录依次进…