Java中的加密与解密

Java中的加密与解密主要对数据的安全性提供保障,分为对称和非对称的,对称表示加密密钥和解密密钥是同一个密钥,因此也常常称作私密密钥或秘密密钥,非对称密钥表示加密密钥和解密为两个不同的密钥,一个为公共密钥,另一个则为私密密钥。对称加密解密算法有DES、AES等,非对称加密解密算法有RSA、DH等。对于数据的加密与解密我们通常通过生成密钥,然后通过加密与解密操作类利用密钥对数据进行加密与解密,接下来我们看看Java中如何实现对称、非对称加密与解密。

对称加密与解密:通过KeyGenerator(密钥生成器)生成Key(密钥),然后通过Cipher(加密解密操作类)进行对数据的加密与解密。

例子:

KeyGenerator kg=KeyGenerator.getInstance("DES");//获得指定算法的密钥生成器

kg.init(56);//密钥生成器初始化,指定生成密钥的长度

Key key=kg.generateKey();//获得密钥

Cipher cp=Cipher.getInstance("DES");//获得指定算法的加密解密操作类

cp.init(Cipher.ENCRYPT_MODE, key);//通过密钥对其进行初始化,初始化为加密操作类

byte[] b=cp.doFinal("hello".getBytes());//对数据进行加密

System.out.println(new String(b));

cp.init(Cipher.DECRYPT_MODE, key);//通过密钥对其进行初始化,初始化为解密操作类

System.out.println(new String(cp.doFinal(b)));//对数据进行解密

非对称加密与解密:通过KeyPairGenerator(密钥生成器)生成KeyPair(密钥),然后通过KeyPair得到公共密钥和私密密钥,最后通过Cipher(加密解密操作类)利用公共密钥和私密密钥对数据的加密与解密。

KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");

kpg.initialize(512);

KeyPair kp=kpg.generateKeyPair();

Cipher c=Cipher.getInstance("RSA");

c.init(Cipher.ENCRYPT_MODE, kp.getPrivate());

byte[] b=c.doFinal("zhangsan".getBytes());

System.out.println(new String(b));

c.init(Cipher.DECRYPT_MODE, kp.getPublic());

System.out.println(new String(c.doFinal(b)));

数据安全性得到保障但是对于数据的完整性又是如何保障的呢?对于提供了消息摘要和数字签名两种方式来保障。消息摘要就是通过信息生成的散列值,例如A将数据发送给B,A会将信息和消息摘要一起发送过去,B接受到信息之后,利用信息生成消息摘要,然后与接受到的消息摘要相比是否一致。数字签名既保证了信息的完整性,也保证了数据的不可伪造性,同样是利用消息生成签名,与消息一起发送过去,收到消息与签名之后,利用消息来验证签名。

消息摘要:

MessageDigest md=MessageDigest.getInstance("MD5");

md.update("zhangsan".getBytes());

System.out.println(new String(md.digest()));//生成消息摘要

md.reset();//用于重置MessageDigest,其实当我们调用digest()方法之后就重置了Messagedigest

System.out.println(new String(md.digest("zhangsan".getBytes())));

/**

* MessageDigest用于产生消息摘要,也称为哈希值、散列值,用于产生该摘要的算法称为哈希函数、散列函数,主要用于保证

* 数据的完整性,在同一个哈希函数情况下,只有相同的消息才能产生相同的摘要,发送发将消息和摘要发送个接收方,接受者接受

* 到消息后使用发送发相同的哈希函数产生消息摘要,并且与接收到的消息摘要相比,对比是否相同。

*/

数字签名:与消息摘要不同,数字签名通过公共密钥生成和验证

byte[] message="hello".getBytes();

KeyPairGenerator kpg=KeyPairGenerator.getInstance("DSA");

kpg.initialize(1024);

KeyPair kp=kpg.generateKeyPair();

Signature sign=Signature.getInstance(kpg.getAlgorithm());

//通过私密密钥生成签名

sign.initSign(kp.getPrivate());

sign.update(message);

byte[] s=sign.sign(); //生成签名

//通过公共密钥验证签名

sign.initVerify(kp.getPublic());

sign.update(message);

System.out.println(sign.verify(s));//验证签名

我们在使用的过程中可能还会接触到Provider(安全机制提供者),简单的来理解就是提供加密解密算法方,在生成私密密钥生成器和公共密钥生成器的时候可能会用到,Provider继承Properties,因此可以向Properties一样使用。Security(对提供者的操作类),用于对提供者进行管理(查找、删除、增加)。JDK内置很多提供者,通过以下的方法可以查找出来

Provider[] ps=Security.getProviders();

System.out.println(ps.length);

for(Provider p:ps)

{

Set<Entry<Object, Object>> entry=p.entrySet();

for(Entry<Object,Object> e:entry)

System.out.println(e.getKey()+"  "+e.getValue());

}

时间: 2024-07-28 19:19:37

Java中的加密与解密的相关文章

AES —— JAVA中对称加密和解密

package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; impor

java中进行加密和解密的方法

package com.jh.hiv.test.service.test;import java.io.UnsupportedEncodingException; import org.apache.commons.codec.digest.DigestUtils;import org.apache.commons.codec.binary.Base64;import org.junit.Test;public class test12 {    static final String TARG

php和java中的加密和解密

遇到的java代码如下: Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding"); 在php中使用des算法 始终校验不过去.对方的提供的代码中 MCRYPT_TRIPLEDES 有这个关键字. 而不是 MCRYPT_DES 然后google知道结果. java代码中.第一段是加密算法的名称,如DESede实际上是3-DES.所以php可以使用以下代码 1 $key = "123456789"; 2 $

Java实现MD5加密及解密的代码实例分享

链接:http://www.jb51.net/article/86027.htm Java实现MD5加密及解密的代码实例分享 作者:厦门大学陈黎栋 字体:[增加 减小] 类型:转载 时间:2016-06-07我要评论 如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享: 基础:MessageDigest类的使用 其实要在Java中完成MD5加密,Message

11 在.NET 中如何加密和解密一个字符串

string plainText = "This is plain text that we will encrypt"; string password = "[email protected]$$w0rd"; Console.WriteLine(plainText); Console.WriteLine(); create a new instance of our encryption class passing in the password as the

nodejs中aes-128-cbc加密和解密

和java程序进行交互的时候,java那边使用AES 128位填充模式:AES/CBC/PKCS5Padding加密方法,在nodejs中采用对应的aes-128-cbc加密方法就能对应上,因为有使用向量(iv),所以nodejs中要用createCipheriv方法,而不是createCipher. 在这类加密和解密的计算中,最最要注意的就是中文编码问题,不然铁定采坑.我踩完坑了,把能跑的代码发上来下,运行环境nodejs 4.4.6. var crypto = require('crypto

h5棋牌源码租用Java的MD5加密和解密类

理解MD5MD5的应用非常广泛h5棋牌源码租用(h5.hxforum.com)联系170618633533企鹅2952777280(http://yhgj8004.com)源码出售 房卡出售 后台出租联系方式只有企鹅.例如我们在unix中下载某种软件时,常常会看到一个扩展名为.md5的文件,内容大概是:MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461这就是tanajiya.tar.gz文件的数字签名.因此当我们得到这个文件后,使用工

Java的MD5加密和解密

简单demo: Java代码   import  java.security.*; import  java.security.spec.*; class  MD5_test { public   final   static  String MD5(String s) { char  hexDigits[] = {  '0' ,  '1' ,  '2' ,  '3' ,  '4' ,  '5' ,  '6' ,  '7' ,  '8' ,  '9' , 'a' ,  'b' ,  'c' , 

在ASP.NET MVC环境中使用加密与解密

在.NET Framework 4.5的NET框架中,在程序中加密与解密很方便.现在均学习ASP.NET MVC程序了,因此Insus.NET也在此写个学习的例子.在需要时可以参考与查阅. 写一个Utility类,它包含有加密Encryption与解密Decryption的方法.当然你完全可以自定义你的加密与解密的key. 在ASP.NET MVC演示中,在文本框中输入字符,点加密铵钮,显示加密字符,点解密铵钮,显示原始文本. 在控制器添加三个Action: 根据标记1的Action,添加一个视