java 加密之对称加密算法

版权声明:本文为博主原创文章,转载请标明地址。欢迎关注微信订阅号:PM实验室。 https://blog.csdn.net/plain_maple/article/details/58121301

简介

对称加密是指加密和解密使用相同密钥的加密算法。

在对称加密算法中,数据发送方将明文和加密密钥一起经过算法处理后,使其变成复杂的密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。

在大多数的对称算法中,加密密钥和解密密钥是相同的,所以它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,密钥泄漏意味着消息有被解密的风险,所以密钥的保密性对通信的安全性至关重要。


常见算法

DES(Data Encryption Standard)数据加密标准:JDK实现的算法密钥长度为56位。

3DES:三重DES,JDK实现的算法密钥长度为112和168,默认168位。

AES:代替DES的算法,目前使用最多的对称加密算法,官方并未报告被破解。AES 通常用于移动通信系统加密以及基于SSH协议的软件。JDK实现的AES密钥长度有128,192,256,默认128位。

此外还有 TDEA算法,Blowfish算法,RC5算法,IDEA算法,PBE算法等,目前使用 3DES 和 AES 较为广泛。


DES 的 java 实现

public class MyDES {
    //算法名称
    private static final String KEY_ALGORITHM = "DES";
    //算法名称/加密模式/填充方式
    //DES共有四种工作模式,ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
    private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
    //明文
    private static final String str = "i am pm lab";

    public static void main(String[] args) {

        try {
            //获得DES生成者实例
            KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
            //指定长度默认值,密钥长度必须的8的倍数
            keyGenerator.init(56);
            //生成一个密钥
            SecretKey Key = keyGenerator.generateKey();
            //得到加密私钥的byte数组
            byte[] byteKey = Key.getEncoded();

            //key转换
            DESKeySpec desKeySpec = new DESKeySpec(byteKey);
            SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            SecretKey secretKey = factory.generateSecret(desKeySpec);

            //加密
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = cipher.doFinal(str.getBytes());
            System.out.println(new BigInteger(1, result).toString(16));

            //解密
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            result = cipher.doFinal(result);
            System.out.println(new String(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

应用场景时序图:

这里写图片描述


3DES 的 java 实现

代码基本和 DES 类似:

public class My3DES {
    //算法名称
    private static final String KEY_ALGORITHM = "DESede";
    //算法名称/加密模式/填充方式
    //DES共有四种工作模式,ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
    private static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
    //明文
    private static final String str = "i am pm lab";

    public static void main(String[] args) {

        try {
            //获得DES生成者实例
            KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
            //指定长度默认值,密钥长度必须的8的倍数
            //keyGenerator.init(168);
            keyGenerator.init(new SecureRandom());//也可以SecureRandom生成默认长度的key
            //生成一个密钥
            SecretKey Key = keyGenerator.generateKey();
            //得到加密私钥的byte数组
            byte[] byteKey = Key.getEncoded();

            //key转换
            DESedeKeySpec desKeySpec = new DESedeKeySpec(byteKey);
            SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            SecretKey secretKey = factory.generateSecret(desKeySpec);

            //加密
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = cipher.doFinal(str.getBytes());
            System.out.println(new BigInteger(1, result).toString(16));

            //解密
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            result = cipher.doFinal(result);
            System.out.println(new String(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


AES 的 java 实现

public class MyAES {
    private static final String KEY_ALGORITHM = "AES";
    private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
    private static final String str = "i am pm lab";

    public static void main(String[] args) {
        try {
            //生成密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
            keyGenerator.init(new SecureRandom());
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            //转换密钥
            Key key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

            //加密
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(str.getBytes());
            System.out.println(new BigInteger(1, result).toString(16));

            //解密
            cipher.init(Cipher.DECRYPT_MODE, key);
            result = cipher.doFinal(result);
            System.out.println(new String(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

AES和DES的应用场景时序图相同。

猜你喜欢

转载自blog.csdn.net/plain_maple/article/details/58121301