groovy 3.0.7
DES加密简介
加密分为对称加密和非对称加密。非对称加密,加解密使用不同的密钥,如RSA;对称加密,加解密使用相同的密钥,如DES(Data Encryption Standard,即数据加密标准)。相对而言,非对称加密安全性更高,但是计算过程复杂耗时,一般只应用于关键信息,非关键信息可以考虑使用对称加密。
代码实现
DES加密
import java.util.Base64; import javax.crypto.Cipher; import java.security.Key; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; String keyStr = 'h3@FuaKc' // 加解密秘钥 String logInfo = '''{ 'account':'shouke', 'password':'123' } '''; DESKeySpec dks = new DESKeySpec(keyStr.getBytes('UTF-8')); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance('DES'); Key key = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance('DES'); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodedBytes = cipher.doFinal(logInfo.getBytes()) // 执行加密操作 // 使用加密后的数据,比如 Base64加密 def encodedString = Base64.getEncoder().encodeToString(encodedBytes); println(encodedString) // 输出:zdTV3dnCOIkmM7DMz0XC5BIPN0JFK4cR2+wb36Jx5IvfVw3bsXmOfdwtQ88ZvWKj
DES解密
import java.util.Base64; import javax.crypto.Cipher; import java.security.Key; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; String keyStr = 'h3@FuaKc'; String b64EncodedString = 'zdTV3dnCOIkmM7DMz0XC5BIPN0JFK4cR2+wb36Jx5IvfVw3bsXmOfdwtQ88ZvWKj' DESKeySpec dks = new DESKeySpec(keyStr.getBytes('UTF-8')); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance('DES'); Key key = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance('DES'); cipher.init(Cipher.DECRYPT_MODE, key); byte[] b64DecodedString = Base64.getDecoder().decode(b64EncodedString) def result = new String(cipher.doFinal(b64DecodedString)); // 解密操作 println(result);
输出:
{ 'account':'shouke', 'password':'123' }
相关说明:
Cipher.init(int opmode, Key key, AlgorithmParameterSpec params)
opmode
:Cipher.ENCRYPT_MODE
--加密模式,Cipher.DECRYPT_MODE
--解密模式- key :密匙,使用传入的盐构造出一个密匙,可以使用
SecretKeySpec
、KeyGenerator
和KeyPairGenerator
创建密匙,其中SecretKeySpec
和KeyGenerator
支持AES,DES,DESede三种加密算法创建密匙,KeyPairGenerator
支持RSA加密算法创建密匙 params
:使用CBC模式(Cipher Block Chaining mode,密码分组链模式)时必须传入该参数,形如以下:
import java.security.SecureRandom; // ... cipher.init(Cipher.ENCRYPT_MODE, key, new SecureRandom());