加密包含:
1、双向加密,能加密能解密,包含对称加密、非对称加密。
2、单向加密,只能加密无法解密,包含信息摘要、数字签名。
3、数字证书,使用非对称加密(加密内容)、数字签名(校验内容完整性)、信息摘要(校验证书文件)。
Hex:十六进制转换,常用于信息摘要算法处理摘要值。
/* Hex字节数组转字符串 */
String str = Hex.toHexString(byteArr);
Base64:表单加密、加密方式公开。最早使用在电子邮件上,为处理编码问题产生,通常会做为密钥、密文的通用处理方式。
/* 密文、密钥的处理 */
String str = new String(Base64.encode(byteArr));
/* 解密、密钥使用时处理 */
byte[] bytes = Base64.decode(str.getBytes());
信息摘要:
经典算法:
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等。
/* 实例化信息摘要对象 */
MessageDigest md = MessageDigest.getInstance(type);
/* 摘要处理 */
byte[] bytes = md.digest(byteArr);
/* 文件信息摘要 */
DigestInputStream dis = new DigestInputStream(inputStream, md);
/* 读取流,这里必须空读一遍 */
byte[] buffer = new byte[1024]
while (dis.read(buffer, 0, 1024) != -1) {}
/* 获取信息摘要 */
byte[] bytes = md.digest();
对称加密:
特点:加密和解密使用的密钥是相同的。
经典算法:
1、DES算法:典型对称加密算法,对称加密的基础算法,56位。由于计算机技术的发展,已不再那么安全。
2、DESede算法:三重DES算法,由DES演变而来,使用的多次迭代DES的方式,安全性提高,但速度慢。
3、AES算法:优秀的DES代替算法,支持128位、192位、256位,安全、速度快。
4、IDEA算法:DES的代替算法之一,邮件加密的一种算法。
5、PEB算法:基于口令的算法,特殊的对称加密算法,使用了口令和盐两部分同时进行加密、解密,比较灵活。
/* 加密处理 */
/* 构建密钥生成器 */
KeyGenerator kg = KeyGenerator.getInstance(type);
/* 获取密钥对象 */
SecretKey sk = kg.generateKey();
/* 获取密钥的字节数组,发送时可以通过Base64转换为字符串 */
byte[] key= sk.getEncoded();
/* 构造密文处理器 */
Cipher cipher = Cipher.getInstance(type);
/* 通过密钥初始化,ENCRYPT_MODE是加密模式 */
cipher.init(Cipher.ENCRYPT_MODE, sk);
/* 加密处理 */
byte[] bytes = cipher.doFinal(byteArr);
/* 解密处理 */
/* 通过密钥的byte数组重构密钥 */
SecretKey sk = new SecretKeySpec(key, type);
/* 构造密文处理器 */
Cipher cipher = Cipher.getInstance(type);
/* 通过密钥初始化,DECRYPT_MODE是解密模式 */
cipher.init(Cipher. DECRYPT_MODE, sk);
/* 解密处理 */
byte[] bytes = cipher.doFinal(byteArr);
/* 文件加密 */
/* 新建加密处理类对象 */
Cipher cipher = Cipher.getInstance(type);
/* 通过密钥初始化加密类 */
cipher.init(Cipher.ENCRYPT_MODE, sk);
/* 待加密文件流 */
InputStream is = new FileInputStream(file);
/* 输出文件流 */
OutputStream os = new FileOutputStream(cryptFile);
/* 获取加密后输入流 */
CipherInputStream cis = new CipherInputStream(is, cipher);
/* 写入文件 */
byte[] buffer = new byte[1024];
int count;
while ((count = cis.read(buffer)) != -1) {
os.write(buffer, 0, count);
}
/* 关闭流 */
cis.close();
is.close();
os.close();
/* 文件解密 */
/* 新建加密处理类对象 */
Cipher cipher = Cipher.getInstance(type);
/* 通过密钥初始化加密类 */
cipher.init(Cipher.DECRYPT_MODE, sk);
/* 加密文件流 */
InputStream is = new FileInputStream(file);
/* 输出文件流 */
OutputStream os = new FileOutputStream(cryptFile);
/* 获取加密后输入流 */
CipherOutputStream cos = new CipherOutputStream(os, cipher);
/* 写入文件 */
byte[] buffer = new byte[1024];
int count;
while ((count = is.read(buffer)) != -1) {
cos.write(buffer, 0, count);
}
/* 关闭流 */
cos.close();
is.close();
os.close();
非对称加密:
特点:加密及解密的密钥是不同的,分别为私钥和公钥,成对出现。
经典算法:
1、DH算法:密钥交行算法,思想过度的算法。
2、RSA算法:典型非对称加密算法,特点是公钥短、私钥长,公钥、私钥都可以进行加密和解密(公钥加密需要私钥解密、私钥加密需要公钥解密),基于数学大数因子分解。
3、ElGaml算法:常用非对称加密算法,基于数学离散对数。
/* 密钥生成 */
/* 实例化密钥生成对象 */
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(type);
/* 生成密钥对 */
KeyPair keyPair = keyPairGen.generateKeyPair();
/* 获取公钥 */
PublicKey publicKey = keyPair.getPublic();
/* 获取私钥 */
PrivateKey privateKey = keyPair.getPrivate();
/* 获取公钥字节数组 */
byte[] public_key = publicKey.getEncoded();
/* 获取私钥字节数组 */
byte[] private_key = privateKey.getEncoded();
/* 实例化公私钥 */
/* 私钥 */
/* 实例化私钥处理对象 */
PKCS8EncodedKeySpec pkcs8Encoded = new PKCS8EncodedKeySpec(private_key);
/* 实例化密钥处理工厂对象 */
KeyFactory keyFactory = KeyFactory.getInstance(type);
/* 生成私钥 */
PrivateKey key = keyFactory.generatePrivate(pkcs8Encoded);
/* 公钥 */
/* 实例化公钥处理对象*/
X509EncodedKeySpec x509Encoded = new X509EncodedKeySpec(public_key);
/* 实例化密钥处理工厂对象 */
KeyFactory keyFactory = KeyFactory.getInstance(type);
/* 生成公钥 */
PublicKey key = keyFactory.generatePublic(x509Encoded);
/* 加密处理 */
/* 实例化加密处理对象 */
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
/* 初始化加密处理对象,只有RSA算法支持公钥的加密,公钥加密对应私钥解密 */
cipher.init(Cipher.ENCRYPT_MODE, key);
/* 加密处理 */
byte[] bytes = cipher.doFinal(byteArr);
/* 解密处理 */
/* 实例化加密处理对象 */
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
/* 初始化加密处理对象,只有RSA算法支持私钥的解密,私钥解密对应公钥加密 */
cipher.init(Cipher.DECRYPT_MODE, key);
/* 解密处理 */
byte[] bytes = cipher.doFinal(byteArr);
数字签名:
特点:带双钥的信息摘要算法,私钥签名、公钥校验。
经典算法:
1、RSA算法:经典数字签名算法,与非对称加密的RSA算法是同一算法。
2、DSA算法:数字签名标准算法。
3、ECDSA算法:椭圆曲线数字签名算法,强度高、速度快、签名短、构建相当麻烦。
/* 私钥签名 */
/* 实例化签名处理对象 */
Signature sign = Signature.getInstance(type);
/* 初始化签名处理对象 */
sign.initSign(key);
/* 填充签名信息 */
sign.update(byteArr);
/* 签名处理 */
byte[] bytes = sign.sign();
/* 公钥校验 */
/* 实例化签名处理对象 */
Signature verify = Signature.getInstance(type);
/* 初始化签名处理对象 */
verify.initVerify(key);
/* 填充签名信息 */
verify.update(byteArr);
/* 签名校验处理 */
boolean succ = verify.verify(bytes);