java 加密

加密,大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密。

双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。
单向加密只是对信息进行了摘要计算,不能通过算法生成明文。

双向加密

对称加密

密钥是控制加密及解密过程的指令。加密和解密使用相同密钥,也称为单密钥加密, 对称式加密本身不是安全的。  
常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等。

DES被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码*加密算法。

AES高级加密标准(Advanced Encryption Standard),是美国联邦*采用的一种区块加密标准。这个标准用来替代原先的DES,2006年,已然成为对称密钥加密中最流行的算法之一。

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class EncryptTool {
public static String encrypt(String seed, String clearText) throws Exception {
        byte[] rawkey = getRawKey(seed.getBytes());
        byte[] result = encrypt(rawkey, clearText.getBytes());
        return toHex(result);

    }

    public static String decrypt(String seed, String encrypted) throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = toByte(encrypted);
        byte[] result = decrypt(rawKey, enc);
        return new String(result);
    }

    /**
     * 生成给定的种子字节数
     * @param seed
     * @return
     * @throws Exception
     */
    private static byte[] getRawKey(byte[] seed) throws Exception {
     //KeyGenerator 提供对称密钥生成器的功能,支持各种算法  DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed(seed);
        kgen.init(128, sr);
        SecretKey sKey = kgen.generateKey();
        byte[] raw = sKey.getEncoded();
        return raw;
    }

    /**
     * 对字节串clear加密
     * @param raw
     * @param clear
     * @return
     * @throws Exception
     */
    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
     //SecretKeySpec 负责保存对称密钥
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        //Cipher 负责完成加密或解密工作
        Cipher cipher = Cipher.getInstance("AES");
        //ENCRYPT_MODE 表示加密
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    }

    /**
     * 对字节串encrypted解密
     * @param raw
     * @param encrypted
     * @return
     * @throws Exception
     */
    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        //DECRYPT_MODE 表示解密
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }

    public static String toHex(String txt) {
        return toHex(txt.getBytes());
    }

    public static String fromHex(String hex) {
        return new String(toByte(hex));
    }

    public static byte[] toByte(String hexString) {
        int len = hexString.length() / 2;
        byte[] result = new byte[len];
        for (int i = 0; i < len; i++)
            result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();
        return result;
    }

    public static String toHex(byte[] buf) {
        if (buf == null)
            return "";
        StringBuffer result = new StringBuffer(2 * buf.length);
        for (int i = 0; i < buf.length; i++) {
            appendHex(result, buf[i]);
        }
        return result.toString();
    }

    private static void appendHex(StringBuffer sb, byte b) {
        final String HEX = "0123456789ABCDEF";
        sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
    }
}

非对称加密

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

1.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
2.DSA Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。

单向加密

常见的单向加密:

BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)

Java一般需要获取对象MessageDigest来实现单项加密。

MD5 即Message-Digest Algorithm 5(信息-摘要算法 5),MD5的前身有MD2、MD3和MD4,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一,主流编程语言普遍已有MD5

实现。MD5就是把一个任意长度的字节串变换成一定长的十六进制数字串。

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
 
public class EncrypMD5 { 
     
    public byte[] eccrypt(String info) throws NoSuchAlgorithmException{ 
        //根据MD5算法生成MessageDigest对象 
        MessageDigest md5 = MessageDigest.getInstance("MD5"); 
        byte[] srcBytes = info.getBytes(); 
        //使用srcBytes更新摘要 
        md5.update(srcBytes); 
        //完成哈希计算,得到result 
        byte[] resultBytes = md5.digest(); 
        return resultBytes; 
    } 
     
     
 

一般MD5和BASE64一起使用



java 加密,布布扣,bubuko.com

java 加密

上一篇:《Swift编程语言》中文翻译及读书笔记page22


下一篇:springboot 报错 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported