DES加密解密->java实现

DES加密解密涉及到的JAVA类

Cipher

此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心
为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。
转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有以下形式:
“算法/模式/填充”或 “算法”
(后一种情况下,使用模式和填充方案特定于提供者的默认值)。例如,以下是有效的转换:
Cipher c = Cipher.getInstance(“DES/CBC/PKCS5Padding”);
使用 CFB 和 OFB 之类的模式,Cipher 块可以加密单元中小于该 Cipher 的实际块大小的数据。请求这样一个模式时,可以指定一次处理的位数(可选):将此数添加到模式名称中,正如 “DES/CFB8/NoPadding” 和 “DES/OFB32/PKCS5Padding” 转换所示。如果未指定该数,则将使用特定于提供者的默认值。(例如,SunJCE 提供者对 DES 使用默认的 64 位)。因此,通过使用如 CFB8 或 OFB8 的 8 位模式,Cipher 块可以被转换为面向字节的 Cipher 流。
DES加密解密->java实现_第1张图片
DES加密解密->java实现_第2张图片
DES加密解密->java实现_第3张图片

SecretKeyFactory

此类表示秘密密钥的工厂。
密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),反之亦然。秘密密钥工厂只对秘密(对称)密钥进行操作。
密钥工厂为双工模式,即其允许根据给定密钥规范(密钥材料)构建不透明密钥对象,或以适当格式获取密钥对象的底层密钥材料。
应用程序开发人员应参阅其提供者文档,找出 generateSecret 和 getKeySpec 方法所支持的密钥规范。例如,”SunJCE” 提供者提供的 DES 秘密密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示形式,并且该提供者的 Triple DES 密钥的秘密密钥工厂支持 DESedeKeySpec 作为 Triple DES 密钥的透明表示形式。
DES加密解密->java实现_第4张图片

KeySpec

public interface KeySpec组成加密密钥的密钥内容的(透明)规范。
如果密钥存储在硬件设备上,则其规范可以包含有助于标识该设备上的密钥的信息。
用特定于算法的方法或独立于算法的编码格式(例如,ASN.1)可以指定密钥。例如,DSA 专用密钥可以由其组件 x、p、q 和 g 指定(请参见 DSAPrivateKeySpec),或使用其 DER 编码指定(请参见 PKCS8EncodedKeySpec)。
此接口不包含任何方法或常量。它仅用于将所有密钥规范分组,并为其提供类型安全。所有密钥规范都必须实现此接口。

在实现类中可以看到DESKeySpec。
DES加密解密->java实现_第5张图片

SecretKey

public interface SecretKeyextends Key秘密(对称)密钥。
此接口不包含方法或常量。其唯一目的是分组秘密密钥(并为其提供类型安全)。
此接口的提供者实现必须改写继承自 java.lang.Object 的 equals 和 hashCode 方法,以便根据底层密钥材料而不是根据引用进行秘密密钥比较。
实现此接口的密钥以其编码格式(请参阅 getFormat)返回字符串 RAW,并返回作为 getEncoded 方法调用结果的原始密钥字节。(getFormat 和 getEncoded 方法继承自 java.security.Key 父接口。)
利用以下方法即可获得秘钥。

SecretKey secretKey = secretKeyFactory.generateSecret(keySpec); 然后利用cipher的init方法即可初始化cipher对象,进而可以进行加密和解密操作。

cipher.init(Cipher.ENCRYPT_MODE, secretKey,new SecureRandom());

实现类DESEncryptTools

package com.david.des;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/** * * 项目名称:CipherTest * 类 名 称:AESEncryptTools * 类 描 述:DES加密解密算法 * 创 建 人:david * 创建时间:2016年5月2日 下午8:00:21 * Copyright (c) david-版权所有 */
public final class DESEncryptTools {

    //加密算是是des
    private static final String ALGORITHM = "DES";
    //转换格式
    private static final String TRANSFORMATION = "DES/ECB/PKCS5Padding";

    //利用8个字节64位的key给src加密
    @SuppressWarnings("unused")
    public static byte[] encrypt(byte[] src,byte[]key)
    {
        try {
            //加密
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
            KeySpec keySpec = new DESKeySpec(key);
            SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey,new SecureRandom());
            byte[] enMsgBytes = cipher.doFinal(src);    
            return enMsgBytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //利用8个字节64位的key给src解密
    @SuppressWarnings("unused")
    public static byte[] decrypt(byte[] encryptBytes,byte[]key){
        try {
            //解密
            //Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            Cipher deCipher = Cipher.getInstance(TRANSFORMATION);
            SecretKeyFactory deDecretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
            KeySpec deKeySpec = new DESKeySpec(key);
            SecretKey deSecretKey = deDecretKeyFactory.generateSecret(deKeySpec);
            deCipher.init(Cipher.DECRYPT_MODE, deSecretKey,new SecureRandom());
            byte[] deMsgBytes = deCipher.doFinal(encryptBytes);
            return deMsgBytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试类

package com.david.des;

public class DesMainTest {

    private static String key = "12345678";

    public static void main(String[] args) throws Exception{
        String msg = "hello world. 你好,DES";
        System.out.println("加密前:"+msg);
        byte[] encryptBytes = DESEncryptTools.encrypt(msg.getBytes(),key.getBytes());
        System.out.println("加密后:"+new String(encryptBytes));
        byte[] deMsgBytes = DESEncryptTools.decrypt(encryptBytes,key.getBytes());
        System.out.println("解密后:"+new String(deMsgBytes));
    }
}

测试结果

DES加密解密->java实现_第6张图片

总结

学习了一下DES加密解密算法!

你可能感兴趣的:(java,加密,des)