我是在学习des加密的过程中,有一步
String enConde = Base64.encode(bytes)
bytes数组中存放的是DES加密后密文的字节数组,因为字节中出现了负数,ASCII码中不能对应,然后老师要求使用Base64编码,但我的编译器显示这步有问题,而且和老师导的包不一样,只有一个
java.util.Base64;
这个包
然后,我查了好久好久,书上是这么说的:
原本上BASE64的编码器和解码器都是在sun.misc组件中的,因为它没有在java.*的包中,所以在java新的版本中它的位置可能发生变化(刚好我现在的Java版本就是最新的,所以我意识到,有情况)
然后我仔细研究了一下java.util.Base64;
大概就是base64中定义了两个静态内部类
Encoder和Decoder
Base64.getEncoder()
方法就返回了一个Encoder对象
然后我在jdk文档中点入了Encoder这个静态内部类
Encode类中有这么些方法
哈哈哈就出来了,果然,遇事不决看文档,啥都能解决,嘿嘿嘿
所以,将字节数组转变位base64的编码的具体代码为:
导的包为java.util.Base64
String encode = Base64.getEncoder().encodeToString(bytes)
然后下面是我的des加密
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class DesDemo {
public static void main(String[] args) throws Exception {
//明文
String plainText = "硅谷";
//密钥(des的密钥必须是八个字节)
String key = "12345678";
//创建加密对象
Cipher des = Cipher.getInstance("des");//参数表示选择的算法
//创建加密规则
//第一个参数表示:表示key的字节
//第二个参数表示:加密的类型
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "des");
//进行加密初始化
//第一个参数表示模式(加密模式、解密模式)
//第二个参数表示加密的规则(即上面创建的加密规则)
des.init(des.ENCRYPT_MODE,secretKeySpec);
//调用方法加密
//参数表示明文的字节数组
byte[] bytes = des.doFinal(plainText.getBytes());
//直接打印密文,如果出现乱码,是因为在编码表(ACSLL)上找不到对应的字符
// System.out.println(new String(bytes));
//将每个字节的十进制打印出来
// for (byte aByte : bytes) {
// System.out.println(aByte);
// }
// String encode = Base64.encode(byres);
// System.out.println(encode);
//Base64 当前java jdk是15
String encode = Base64.getEncoder().encodeToString(bytes);
System.out.println(encode);
}
}
然后解密的代码就是先把得到的字符串密文Base64解码,得到最初DES加密后的字节数组,然后再对字节数组DES解密
```java
des.init(Cipher.DECRYPT_MODE,secretKeySpec);
byte[] text = des.doFinal(Base64.getDecoder().decode(encode));
System.out.println("DES解密得到的明文:"+new String(text));
运行结果:
搞完,崩撤卖溜
(小声BB,i am java初学者,如果我理解的有问题,还请指教)