算法(一)_加密算法
现在开始重新复习下算法,那么,先看看加密算法。
简称 | 全称 | 性质 | 说明 | 备注 |
---|---|---|---|---|
DES (Data Encryption Standard) |
数据加密算法 | 密钥,对称加密算法 | 简易加密算法 | - |
RSA | 支持变长密钥的公共密钥算法 | 公私密钥,非对称加密算法 | 公钥加密,私钥解密 | - |
AES (Advanced Encryption Standard) |
高级加密标准 | 密钥,对称加密算法 | 下一代的加密算法标准 | - |
MD5 (Message Digest Algorithm 5) |
消息摘要算法 | 摘要算法 | 用于验证信息的正确性,不被修改 | - |
SHA (Secure Hash Algorithm) |
安全哈希算法 | 数字签名 | 用于验证信息的正确性,不被修改 | 用很多扩展 |
关于JAVA实现:Key
密钥
基本上,DES,RSA,AES等等的加密算法,为了保证不用使用场景下加密方式不同,需要使用密钥。
密钥,可以看做一个方法,经过方法的【明文】变成【密文】,用以安全的传输。接受方再使用方法将【密文】转换成【明文】。以此做的安全加密的过程。
对应java,密钥是Key(java.security.Key接口),而创建时,使用KeyGenerator或者启动的密钥生成器进行生成。如下AES密钥的生成:
public static Key makeKey(String key) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES"); // AES生成器
keyGen.init(128, new SecureRandom(key.getBytes())); // AES生成器初始化
SecretKey secretKey = keyGen.generateKey(); // 生成密钥
return new SecretKeySpec(secretKey.getEncoded(),"AES"); // 转为AES密钥
}
不过,用于RSA使用一对公钥私钥,所以特别的使用KeyPair(java.security.KeyPair接口),使用一对密钥进行:
public static KeyPair makeKey(int keyLength) throws Exception{
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA"); // RSA生成器
keyPairGenerator.initialize(keyLength); // 根据长度生成,每次生成不一致
return keyPairGenerator.generateKeyPair(); // 生成密钥
}
加密解密Cipher
JAVA中,加密解密使用Cipher(javax.crypto.Cipher),不管是DES,RSA,AES,都只是Cipher的一直类型。简而言之,使用类型(DES,RSA,AES)和密钥,确定模式,即可加密解密,以AES为例:
/**
* 加密
*/
public static byte[] encrypt(String msg,Key key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(msg.getBytes());
}
/**
* 解密
*/
public static byte[] decrypt(byte[] content,Key key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(content);
}
信息摘要MessageDigest
摘要或者说签名,简单的说,就是把一定的简要信息,转换成易于判断的遗传编码。传输中同时传输编码,用于判断信息正确性,接收方会再次对进行进行摘要处理,如果结果和传过来的信息不一致,则判断信息不正确,不予处理。
java中的摘要处理使用MessageDigest:
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(msg.getBytes());
注意,直降输出的结果,需要通过加盐或者转换等处理,才能转成可看的结果