Java加密类

1.示例

package com.example.demo;

import org.springframework.boot.test.context.SpringBootTest;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;


@SpringBootTest
class DemoApplicationTests {
   
    public static void main(String[] args) {
   
        String str = des3EncodeECB("Key3Des","@##h586ellAAon你好");
        System.out.println(str);
        System.out.println(des3DecodeECB("Key3Des",str));
    }
    static {
   
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }
    private static final String DES3 = "DESede";
    /** * 3DES ECB模式加密 */
    public static String des3EncodeECB(String Key, String Data) {
   
        try {
   
            byte[] data=Data.getBytes(StandardCharsets.UTF_8);
            byte[] key = build3DesKey(Key);
            key = null;
            assert key != null;
            SecretKey DESKey = new SecretKeySpec(key, DES3);
            //生成密钥
            Cipher cipher = Cipher.getInstance(DES3 + "/ECB/PKCS7Padding");
            cipher.init(Cipher.ENCRYPT_MODE, DESKey);
            return new BASE64Encoder().encode(cipher.doFinal(data));
        } catch (Exception e) {
   
            e.printStackTrace();
            return null;
        }
    }
    /** * 3DES ECB模式解密 */
    public static String des3DecodeECB(String Key, String Data) {
   
        try {
   
            //--通过base64,将字符串转成byte数组
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] data = decoder.decodeBuffer(Data);
            byte[] key = build3DesKey(Key);
            assert key != null;
            SecretKey DESKey = new SecretKeySpec(key, DES3);
            //生成密钥
            Cipher cipher = Cipher.getInstance(DES3 + "/ECB/PKCS7Padding");
            cipher.init(Cipher.DECRYPT_MODE, DESKey);
            byte[] bout=cipher.doFinal(data);

            return new String(bout, StandardCharsets.UTF_8);
        } catch (Exception e) {
   
            e.printStackTrace();
            return null;
        }
    }
    /** * 根据字符串生成密钥字节数组 * * @param keyStr 密钥字符串 */
    private static byte[] build3DesKey(String keyStr) {
   
        try {
   
            byte[] key = new byte[24];
            //声明一个24位的字节数组,默认里面都是0
            byte[] temp = keyStr.getBytes(StandardCharsets.UTF_8);
            //将字符串转成字节数组
            //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
            //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
            System.arraycopy(temp, 0, key, 0, Math.min(key.length, temp.length));
            return key;
        } catch (Exception  e) {
   
            e.printStackTrace();
            return null;
        }
    }

}

2.Cipher类介绍

此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。
Cipher类是一个<mark>引擎类</mark>,它需要通过getInstance()工厂方法来实例化对象。为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。

之后通过其init方法初始化它的模式 (加密 / 解密) , update方法进行数据块的加密。
例如:

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);

第1步:创建KeyPairGenerator对象

<mark>KeyPairGenerator</mark> 类提供 <mark>getInstance()</mark> 方法,该方法接受表示所需密钥生成算法的String变量,并返回生成密钥的 <mark>KeyPairGenerator</mark> 对象。
使用<mark>getInstance()</mark> 方法创建<mark>KeyPairGenerator</mark>对象,如下所示。

第2步:初始化KeyPairGenerator对象

<mark>KeyPairGenerator</mark>类提供了一个名为<mark>initialize()</mark> 的方法,该方法用于初始化密钥对生成器。 此方法接受表示密钥大小的整数值。
使用<mark>initialize()</mark> 方法初始化在上一步中创建的<mark>KeyPairGenerator</mark> 对象,如下所示。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

第3步:生成KeyPairGenerator

可以使用<mark>KeyPairGenerator</mark> 类的<mark>generateKeyPair()</mark> 方法生成<mark>KeyPair</mark> 。 使用此方法生成密钥对,如下所示。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

第4步:获取公钥

使用getPublic()方法从生成的密钥对对象中获取公钥,如下所示。使用此方法获取公钥,如下所示。

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

第5步:创建一个Cipher对象

<mark>Cipher</mark> 类的<mark>getInstance()</mark> 方法接受表示所需转换的String变量,并返回实现给定转换的<mark>Cipher</mark> 对象。
使用<mark>getInstance()</mark> 方法创建<mark>Cipher</mark> 对象,如下所示。

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

第6步:初始化Cipher对象

Cipher类的init()方法接受两个参数,一个表示操作模式的整数参数(加密/解密)和一个表示公钥的Key对象。
使用init()方法初始化Cypher对象,如下所示。

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

第7步:将数据添加到Cipher对象

<mark>Cipher</mark> 类的<mark>update()</mark> 方法接受表示要加密的数据的字节数组,并使用给定的数据更新当前对象。
通过以字节数组的形式将数据传递给<mark>update()</mark> 方法来更新初始化的<mark>Cipher</mark> 对象,如下所示。

//Adding data to the cipher
byte[] input = "Welcome to yiibai".getBytes();
cipher.update(input);

第8步:加密数据

<mark>Cipher</mark> 类的<mark>doFinal()</mark> 方法完成加密操作。 因此,使用此方法完成加密,如下所示。

//Encrypting the data
byte[] cipherText = cipher.doFinal();