算法(一)_加密算法

现在开始重新复习下算法,那么,先看看加密算法。

简称 全称 性质 说明 备注
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());

注意,直降输出的结果,需要通过加盐或者转换等处理,才能转成可看的结果

posted @ 2018-05-05 10:07  常烦常乐  阅读(286)  评论(0编辑  收藏  举报