常见加密算法简介
本文介绍常见的算法(MD5/SHA,DSA,RSA,DES)的应用场景,以及在java上的使用方法.
1) MD5/SHA(MD5常用于加密用户名密码,当用户验证时。SHA加密,与MD5相似的用法,只是两者的算法不同。)
MessageDigest是一个数据的数字指纹.即对一个任意长度的数据进行计算,产生一个唯一指纹号.
MessageDigest的特性:
A) 两个不同的数据,难以生成相同的指纹号
B) 对于指定的指纹号,难以逆向计算出原始数据
代表:MD5/SHA
Java实现:
MD5:
MessageDigest md =&Instance("MD5");
md.update(Bytes());
byte[] result = md.digest();
md.update(Bytes());
byte[] result = md.digest();
SHA:
MessageDigest md =&Instance("SHA");
md.update(Bytes());
byte[] result = md.digest();
md.update(Bytes());
byte[] result = md.digest();
2) DES
单密钥算法,是信息的发送方采用密钥A进行数据加密,信息的接收方采用同一个密钥A进行数据解密.
单密钥算法是一个对称算法.
缺点:由于采用同一个密钥进行加密解密,在多用户的情况下,密钥保管的安全性是一个问题.
代表:DES
Java实现:
首先,需要生成一个密钥,这边的做法,是把生成的密钥,保存到某个文件中.
KeyGenerator gen =&Instance("DES");
Key key =&ateKey();
File keyFile = new File(Constant.CRYPT_KEY_FILE);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(keyFile));
out.writeObject(key);
out.close();
Key key =&ateKey();
File keyFile = new File(Constant.CRYPT_KEY_FILE);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(keyFile));
out.writeObject(key);
out.close();
在生成key的时候,可以通过SecureRandom产生一个可信任的随机数源
KeyGenerator gen =&Instance("DES");
gen.init(new SecureRandom(seed));
Key key =&ateKey();
gen.init(new SecureRandom(seed));
Key key =&ateKey();
加密:
Key key =&Key(Constant.CRYPT_KEY_FILE);//从文件中得到密钥
Cipher cipher =&Instance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key); //指定是加密模式
cipher.update(Bytes());
byte[] result = cipher.doFinal();
Cipher cipher =&Instance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key); //指定是加密模式
cipher.update(Bytes());
byte[] result = cipher.doFinal();
解密:
由于DES是一个对称算法,所以解密代码跟加密代码几乎一致
key =&Key(Constant.CRYPT_KEY_FILE);
cipher.init(Cipher.DECRYPT_MODE, key); //指定是解密模式
cipher.update(result);
byte[] data = cipher.doFinal();
cipher.init(Cipher.DECRYPT_MODE, key); //指定是解密模式
cipher.update(result);
byte[] data = cipher.doFinal();
由于采用了同一个密钥(key),所以两端代码中
Constant.DATA.getBytes()和 data 的值是一致的.
3) 非对称加密算法 DSA 数字签名的代表
4) RSA
公钥密码体制:为了解决单密钥保管安全性的问题,提供了公钥密码体制的概念.在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使用;解密密钥只有解密人自己知道。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。
代表:RSA
Java实现:
同样,需要生成公钥和私钥,并且保存到相应的文件中
KeyPairGenerator gen =&Instance(“RSA”);
//以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置
//参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数
gen.initialize(1024);
KeyPair pair =&ateKeyPair();
File pubkeyFile = new File(Constant.PUB_KEY_FILE);
File prikeyFile = new File(Constant.PRI_KEY_FILE);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(pubkeyFile))
//以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置
//参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数
gen.initialize(1024);
KeyPair pair =&ateKeyPair();
File pubkeyFile = new File(Constant.PUB_KEY_FILE);
File prikeyFile = new File(Constant.PRI_KEY_FILE);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(pubkeyFile))
;
out.Public());
out.close();
out = new ObjectOutputStream(new FileOutputStream(prikeyFile));
out.Private());
out.close();
out.Public());
out.close();
out = new ObjectOutputStream(new FileOutputStream(prikeyFile));
out.Private());
out.close();
加密:
采用公钥进行加密:
PublicKey pubkey = (PublicKey)&Key(Constant.PUB_KEY_FILE);//从文件中得到公钥
Cipher cipher =&Instance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubkey);//指定加密模式
byte[] bytes = cipher.doFinal(Bytes());
Cipher cipher =&Instance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubkey);//指定加密模式
byte[] bytes = cipher.doFinal(Bytes());
解密:
采用私钥进行解密:
PrivateKey prikey = (PrivateKey)&Key(Constant.PRI_KEY_FILE);//从文件中得到私钥
Cipher c =&Instance("RSA");
c.init(Cipher.DECRYPT_MODE, prikey);//指定解密模式
byte[] data = c.doFinal(bytes);
Cipher c =&Instance("RSA");
c.init(Cipher.DECRYPT_MODE, prikey);//指定解密模式
byte[] data = c.doFinal(bytes);
两段代码中, Constant.DATA.getBytes()和data的值是一致的.
加密算法有很多种:这里只大约列举几例:
1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指
纹。MD5/SHA1
发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。
2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密
3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。
2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密
3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
代表:DSA
4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。代表:RSA
4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。代表:RSA
下面是对上面几个例子进行的简单实现:
Java代码
1. package test;
2. import java.io.FileInputStream;
3. import java.io.FileOutputStream;
4. import java.io.IOException;
5. import java.io.ObjectInputStream;
6. import java.io.ObjectOutputStream;
java加密方式有哪些7. import java.security.*;
8. import&pto.Cipher;
9. import&pto.KeyGenerator;
10. import&pto.SecretKey;
11. /**
12. * 加密解密
13. *
14. * @author shy.qiu
15. * @since blog.csdn/qiushyfm
16. */
17. public class CryptTest {
18. /**
19. * 进行MD5加密
20. *
21. * @param info
22. * 要加密的信息
23. * @return String 加密后的字符串
24. */
25. public String encryptToMD5(String info) {
26. byte[] digesta = null;
27. try {
28. // 得到一个md5的消息摘要
29. MessageDigest alga =&Instance("MD5");
30. // 添加要进行计算摘要的信息
31. alga.Bytes());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论