一、什么是Cipher
Cipher是一种用于加密和解密信息的算法或方法。它将原始的明文转化为密文,从而保护信息的安全性和机密性。使用密码学中的数学原理和技术,Cipher可以对数据进行加密处理,使其在传输或存储过程中对未授权的访问者不可读。在必要时,只有具有正确密钥或密码的人才能解密并获取原始的明文信息。
Cipher可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,速度较快,但密钥管理较为复杂。而非对称加密使用一对密钥,私钥用于解密,公钥用于加密,在安全性上更加可靠,但运算速度较慢。
实际应用中,Cipher被广泛应用于保护敏感数据的传输,如网上银行、电子商务、密码学通信等领域。通过使用Cipher,可以保护个人隐私、防止信息被窃取或篡改,提高数据的安全性和机密性。
二、Java中的Cipher类
在Java中,Cipher是一个提供加密和解密功能的类。它位于javax.crypto包下,用于实现各种加密算法。Cipher类可以用于对数据进行加密和解密操作,同时还可以进行数字签名和验签。
代码示例:
package com.blockchain.qgy.demo.cipherdemo;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.util.Arrays;
import java.util.Random;public class CipherDemo {public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {//密钥StringBuilder sb = new StringBuilder("QGY");while(sb.length() < 8) {sb.append((char)new Random().nextInt(128));}byte[] keyBytes = sb.toString().getBytes();//生成密钥SecretKey key = new SecretKeySpec(keyBytes,"DES");System.out.println("密钥:"+key);Cipher instance = Cipher.getInstance("DES");System.out.println("初始化Cipher对象");instance.init(Cipher.ENCRYPT_MODE,key);System.out.println("Cipher对象:"+instance);Provider provider = instance.getProvider();System.out.println("Cipher对象提供者:"+provider);String algorithm = instance.getAlgorithm();System.out.println("Cipher对象的算法名称:"+algorithm);int blockSize = instance.getBlockSize();System.out.println("返回块的大小:"+blockSize);byte[] iv = instance.getIV();System.out.println("返回新缓冲区的初始化向量:"+iv);AlgorithmParameters parameters = instance.getParameters();System.out.println("返回Cipher使用的参数:"+parameters);ExemptionMechanism exemptionMechanism = instance.getExemptionMechanism();System.out.println("Cipher使用的豁免机制对象:"+exemptionMechanism);byte[] bytes = instance.doFinal(new byte[]{'Q', 'G', 'Y'});System.out.println("bytes:"+Arrays.toString(bytes));System.out.println("bytes->update:"+Arrays.toString(instance.update(bytes)));}
}
上面是一个Cipher类加密的简单示例,在Cipher类中常用的常量字段有7个:
- public static final int ENCRYPT MODE:用于将 Cipher 初始化为加密模式的常量。
- public static final int DECRYPT MODE:用于将 Cipher 初始化为解密模式的常量。
- public static fnal int WRAP MODE:用于将 Cipher 初始化为密钥包装模式的常量。
- public static finalint UNWRAP MODE:用于将 Cipher 初始化为密钥解包模式的常量。
- public static final int PUBLIC KEY:用于表示要解包的密钥为“公钥”的常量。
- public static final int PRIVATE KEY:用于表示要解包的密钥为“私钥”的常量。
- public static final intSECRET KEY:用于表示要解包的密钥为“秘密密钥”的常量。
三、封装好的加密工具类
加密工具类:
package com.blockchain.qgy.util;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;/*** 基于Cipher实现的加密和解密工具类** @author QGY**/
public class DeEnCoderCipherUtil {//加密、解密模式,即加密算法名称private final static String CIPHER_MODE = "DES";//DES密钥private static String DEFAULT_DES_KEY = "主播主播,你的MD5加密确实很强,但还是太吃操作了,有没有更加简单和强势的加密工具推荐一下,有的兄弟,有的,这就是当前版本T0.5的强势加密算法";/*** 不允许创建对象*/private DeEnCoderCipherUtil(){}/*** function 字符串加密方法** @param plaintext:要加密的字符串* @param key:密钥* @return 加密后的字符串*/public static String getCipherText(String plaintext,String key){//判断入参是否正确if(Strings.isNullOrEmpty(plaintext) || Strings.isNullOrEmpty(key)) return null;try{byte[] cipherText = getCipherText(plaintext.getBytes(), key.getBytes());return new BASE64Encoder().encode(cipherText);} catch (Exception e){e.printStackTrace();}return null;}/*** function 字节加密方法** @param plaintext:要加密的字节* @param key:密钥* @return 加密后的字节*/private static byte[] getCipherText(byte[] plaintext,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {//1.生成随机数SecureRandom random = new SecureRandom();//2.基于密钥数据创建DESKeySpec对象DESKeySpec desKeySpec = new DESKeySpec(key);//3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//4.Cipher对象进行加密Cipher cipher = Cipher.getInstance(CIPHER_MODE);//5.初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);//返回密文return cipher.doFinal(plaintext);}public static String getPlainText(String cipherText,String key){//判断入参if(Strings.isNullOrEmpty(cipherText) || Strings.isNullOrEmpty(key)) return null;try{BASE64Decoder decoder = new BASE64Decoder();return new String(getPlainText(decoder.decodeBuffer(cipherText),key.getBytes()));}catch (Exception e) {e.printStackTrace();}return null;}private static byte[] getPlainText(byte[] cipherText,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {//1.生成随机数SecureRandom random = new SecureRandom();//2.基于密钥数据创建DESKeySpec对象DESKeySpec desKeySpec = new DESKeySpec(key);//3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//4.Cipher对象进行解密Cipher cipher = Cipher.getInstance(CIPHER_MODE);//5.初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE,secretKey,random);//返回明文return cipher.doFinal(cipherText);}
}
strings工具类:
package com.blockchain.qgy.util;import java.util.Objects;/*** 字符串工具类** @author QGY**/
public class Strings {/*** 判断字符串是否为空或null** @param string* @return 布尔值*/public static Boolean isNullOrEmpty(String string){if (Objects.isNull(string)) return true;if (string.isEmpty()) return true;return false;}
}
注意:这里密钥的长度为8,如果有其他需求可以通过进一步封装达到自身需求