一、双向加密
可逆的加密,可以通过加密的数据还原原有数据,常用于数据信息传送的加密。分为两种,对称加密和非对称加密。
(一)对称加密
对称的主要体现是:加密和解密使用的密钥是相同的。
存在的问题是,加密、解密使用的是同一把钥匙,解密方获得了密钥也获得了加密方式,密钥的保管称为了重要问题。
经典算法:
1、DES算法:典型对称加密算法,对称加密的基础算法,56位。由于计算机技术的发展,已不再那么安全。
2、DESede算法:三重DES算法,由DES演变而来,使用的多次迭代DES的方式,安全性提高,但速度慢。
3、AES算法:优秀的DES代替算法,支持128位、192位、256位,安全、速度快。
4、IDEA算法:DES的代替算法之一,邮件加密的一种算法。
5、PEB算法:基于口令的算法,特殊的对称加密算法,使用了口令和盐两部分同时进行加密、解密,比较灵活。
(二)非对称加密
非对称的主要体现是:加密及解密的密钥是不同的,分别为私钥和公钥,成对出现。
非对称加密针对对称加密的不足进行了改变,使用成对的公钥和私钥代替了原先的密钥,非对称加密只需对解密方公布公钥,而不需要公布公钥,在安全上得到了进一步保证。
经典算法:
1、DH算法:密钥交行算法,思想过度的算法。
2、RSA算法:典型非对称加密算法,特点是公钥短、私钥长,公钥、私钥都可以进行加密和解密(公钥加密需要私钥解密、私钥加密需要公钥解密),基于数学大数因子分解。
3、ElGaml算法:常用非对称加密算法,基于数学离散对数。
二、单向加密(散列函数)
不可逆的加密,无法进行数据解密。
(一)信息摘要
常用于用户密码的存储、文件或数据完整性的校验。
经典算法:
1、MD算法:典型信息摘要算法,例如经典的MD5,算法包括MD2(128位)、MD3、MD4(128位)、MD5(128位)。
2、SHA算法:MD算法的继任者,通过MD4算法演变而来。更安全,摘要信息更长。算法包括:SHA-1(160位)、SHA-256(256位)、SHA-512(512位)等。
3、MAC算法:结合了MD、SHA算法的优势,加入了密钥的支持(需要通过密钥对数据斤进行摘要处理)。算法包括:HmacMD2、HmacMD5、HmacSHA1、HmacSHA256等。
(二)数字签名
带双钥的信息摘要算法,私钥签名、公钥校验。相比信息摘要,数字签名更安全。常用于交易验证、权限合法性校验。
经典算法:
1、RSA算法:经典数字签名算法,与非对称加密的RSA算法是同一算法。
2、DSA算法:数字签名标准算法。
3、ECDSA算法:椭圆曲线数字签名算法,强度高、速度快、签名短、构建相当麻烦。
三、数字证书
有私钥库、公钥证书,私钥库保留、公钥证书公布,综合了非对称加密、数字签名、信息摘要技术。是网络平台安全的重要组成部分。
非对称加密:用于确保数据的安全。
数字签名:用于确保数据的完整性、校验信息来源。
信息摘要:用于确保证书的完整性。
四、加密相关
Hex:十六进制转换,常用于信息摘要算法处理摘要值。
Base64:表单加密、加密方式公开。最早使用在电子邮件上,为处理编码问题产生,通常会做为密钥、密文的通用处理方式。
java RSA加密实例:
package jiami;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
public class EncrypRSA {
/**
* 加密
*
* @param publicKey
* @param srcBytes
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
protected byte[] encrypt(RSAPublicKey publicKey, byte[] srcBytes)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
if (publicKey != null) {
// Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
// 根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] resultBytes = cipher.doFinal(srcBytes);
return resultBytes;
}
return null;
}
/**
* 解密
*
* @param privateKey
* @param srcBytes
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] srcBytes)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
if (privateKey != null) {
// Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
// 根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] resultBytes = cipher.doFinal(srcBytes);
return resultBytes;
}
return null;
}
/**
* @param args
* @throws NoSuchAlgorithmException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws NoSuchAlgorithmException,
InvalidKeyException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
UnsupportedEncodingException {
EncrypRSA rsa = new EncrypRSA();
String msg = "ccc";
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为1024位
keyPairGen.initialize(1024);
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
// 得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 用公钥加密
byte[] srcBytes = msg.getBytes();
byte[] resultBytes = rsa.encrypt(publicKey, srcBytes);
// 用私钥解密
byte[] decBytes = rsa.decrypt(privateKey, resultBytes);
System.out.println("明文是:" + msg);
System.out.println("加密后是:" + new String(resultBytes));
System.out.println("解密后是:" + new String(decBytes));
byte[] b = keyPair.getPrivate().getEncoded();
Base64 enc = new Base64();
String s = enc.encode(b);
System.out.println(s);
}
}