java 加密技术(二)

本文是Java加密技术的第二部分,重点介绍了对称加密算法,包括DES、三重DES、AES和PBE。DES因安全性较低已被弃用,而AES成为更广泛使用的加密标准。PBE结合了消息摘要和对称加密的优势。文章提供了相应的代码实现,并鼓励读者发现错误或提出疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 加密技术(二)

1 对称加密算法

1.1 介绍
  • 对称加密算法是说加密秘钥与解密秘钥使用的是同一把.
  • 他是属于初等(初级)加密算法, 使用范围广,使用频率高 .
  • 常用对称加密算法有
    • DES
    • 3DES
    • AES
    • PBE
    • IDEA

2 DES算法

2.1 介绍

DES (Data Encryption Standard) 数据加密标准. 由美国国家标准性研究所提供, 但是自98年之后,已经被破解,安全性较差. 所以现在项目中不推荐使用DES.
默认秘钥长度56位

2.2 代码实现
package secret;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import org.apache.commons.codec.binary.Hex;

public class DESTest {

    public static String src ="i am gc DES";

    public static void main(String[] args) {
        System.out.println("====jdkDES实现====");
        jdkDES();
        System.out.println("=================");

        //运行结果
        /*
         ====jdkDES实现====
        生成的DES秘钥:e5312a52d93b8325
        加密之后的结果0b980d14f67e7e2dbf3bf45e5edc5c11
        解密之后的结果:i am gc DES
        =================
         */
    }

    public static void jdkDES(){
        try {
            //由DES算法生成算法生成器KeyGenerator
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            //由算法生成器生成秘钥
            SecretKey secretKey =  keyGenerator.generateKey();
            //将秘钥转成byte数组
            byte[] byteKey = secretKey.getEncoded();
            //将byte数组十六进制转换成字符串
            System.out.println("生成的DES秘钥:"+Hex.encodeHexString(byteKey));

            //加密
            Cipher cipher = Cipher.getInstance("DES");
            //加密初始化,传入加密模式和秘钥
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("加密之后的结果"+Hex.encodeHexString(result));

            //进行byteKey的转换
            //先将byteKey生成DESKeySpec
            DESKeySpec desKeySpec = new DESKeySpec(byteKey);
            //再制造DES秘钥工厂
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            //由秘钥工厂将deskeyspec加工成SecretKey
            //此时的secreteKey2与secreteKey是相等的
            SecretKey secretKey2 = secretKeyFactory.generateSecret(desKeySpec);

            //解密
            //初始化cipher,解密模式,传入秘钥
            cipher.init(Cipher.DECRYPT_MODE, secretKey2);
            //开始解密
            result = cipher.doFinal(result);
            //输出
            System.out.println("解密之后的结果:"+new String(result));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

如果感兴趣的话可以多次运行,比较秘钥内容,发现每次生成的秘钥都不一样


3 三重DES

3.1 介绍

三重DES是对DES的补充,在密钥长度与迭代次数都有所加强

3.2 代码实现
package secret;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

import org.apache.commons.codec.binary.Hex;

public class SDESTest {

    public static String src = "i am 3DES";
    public static void main(String[] args) {
        System.out.println("====jdk3DES实现====");
        jdk3DES();
        System.out.println("=================");

        //运行结果
        /*====jdk3DES实现====
        生成的秘钥为:e37616b6d920151637927c5ecb10abf2c46262bf34522abf
        加密之后的结果:75e21263547078139f0953e45e5aa683
        解密之后的结果:i am 3DES
        =================
        */
    }
    public static void jdk3DES(){
        //生成Key
        try {
            //用DESede来实例化三重DES
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
            //生成秘钥
            SecretKey secretKey = keyGenerator.generateKey();
            //获取秘钥到byte数组里
            byte[] byteKey = secretKey.getEncoded();
            //输出秘钥
            System.out.println("生成的秘钥为:"+Hex.encodeHexString(byteKey));

            //加密
            Cipher cipher = Cipher.getInstance("DESede");
            //根据秘钥进行加密
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            //输出加密之后的密文
            byte[] result = cipher.doFinal(src.getBytes());
            //输出加密结果
            System.out.println("加密之后的结果:"+Hex.encodeHexString(result));

            //将byteKey转换成秘钥
            //根据byteKey生成3DES秘钥规范
            DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(byteKey);
            //创建3DES秘钥工厂
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
            //生产秘钥
            SecretKey secretKey2 = secretKeyFactory.generateSecret(deSedeKeySpec);

            //解密
            cipher.init(Cipher.DECRYPT_MODE, secretKey2);
            result = cipher.doFinal(result);
            System.out.println("解密之后的结果:"+new String(result));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}    

4 AES加密算法

4.1 介绍

为什么有了3DES还要出现AES呢?因为3DES处理效率比较慢,所以产生AES.
AES应用更加广泛,到目前,还没有官方报道AES被破解

4.2 代码实现
package secret;

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

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

import org.apache.commons.codec.binary.Hex;

public class AESTest {
    public static String src = "i am AES";

    public static void main(String[] args) {
        jdkAES();
        //运行结果
        /*
             生成的秘钥为:4a4cb6b6cffc650cc4f7010d939a64f8
            加密后的结果:740bc2b2535a401eec755326a25ca134
            解密后的结果:i am AES
         */
    }

    public static void jdkAES(){
        try {
            //生成秘钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            //初始化KeyGenerator,密钥长度默认
            keyGenerator.init(new SecureRandom());
            //生成秘钥
            SecretKey secretKey = keyGenerator.generateKey();
            //生成byte数组
            byte[] byteKey = secretKey.getEncoded();
            //输出
            System.out.println("生成的秘钥为:"+Hex.encodeHexString(byteKey));

            //加密
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("加密后的结果:"+Hex.encodeHexString(result));

            //byteKey转换
            //AES的Key转换与DES有点区别
            Key key = new SecretKeySpec(byteKey, "AES");

            //解密
            cipher.init(Cipher.DECRYPT_MODE, key);
            result = cipher.doFinal(result);
            System.out.println("解密后的结果:"+new String(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}    

5 PBE加密

5.1 介绍

PBE加密算法结合了”消息摘要”算法与”对称加密”算法的优势
PBE ( Password Based Encrtption) 基于口令的加密技术

5.2 代码实现
package secret;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.asn1.pkcs.PBEParameter;

public class PBETest {

    public static String src = "i am gc PBE";

    public static void main(String[] args) {
        jdkPBE();
        //运行结果
        /*
         * 加密之后的结果:e9c7035f7c54def110404a3218ed351d
         *  解密之后的结果:i am gc PBE
         */
    }

    public static void jdkPBE() {
        try {
            // 初始化盐
            SecureRandom random = new SecureRandom();
            // 产生一个8位的盐,盐必须8位长度
            byte[] salt = random.generateSeed(8);
            // 创建口令
            String password = "gc";
            // 将口令转换成秘钥
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());

            // PBEWITHMD5andDES产生秘钥工厂
            SecretKeyFactory secretKeyFactory = SecretKeyFactory
                    .getInstance("PBEWITHMD5andDES");
            // 产生Key
            Key key = secretKeyFactory.generateSecret(pbeKeySpec);

            // 加密
            // 产生PBE参数, 用盐和迭代次数初始化
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("加密之后的结果:" + Hex.encodeHexString(result));

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
            result = cipher.doFinal(result);
            System.out.println("解密之后的结果:" + new String(result));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

  • 文章中避免不了错误的出现,如果有读者发现文章中的错误,或者有疑问的地方,请留言/Email To Gc
  • 请转发OR复制的同学,标注出处,尊重作者劳动成果,谢谢亲
  • 本篇出自GC博客
  • 本文主要参考moocer老师java实现对称加密
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值