700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java实现加密解密抽象_DES加密解密-java实现

java实现加密解密抽象_DES加密解密-java实现

时间:2021-09-27 18:36:40

相关推荐

java实现加密解密抽象_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 流。

SecretKeyFactory

此类表示秘密密钥的工厂。

密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),反之亦然。秘密密钥工厂只对秘密(对称)密钥进行操作。

密钥工厂为双工模式,即其允许根据给定密钥规范(密钥材料)构建不透明密钥对象,或以适当格式获取密钥对象的底层密钥材料。

应用程序开发人员应参阅其提供者文档,找出 generateSecret 和 getKeySpec 方法所支持的密钥规范。例如,”SunJCE” 提供者提供的 DES 秘密密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示形式,并且该提供者的 Triple DES 密钥的秘密密钥工厂支持 DESedeKeySpec 作为 Triple DES 密钥的透明表示形式。

KeySpec

public interface KeySpec组成加密密钥的密钥内容的(透明)规范。

如果密钥存储在硬件设备上,则其规范可以包含有助于标识该设备上的密钥的信息。

用特定于算法的方法或独立于算法的编码格式(例如,ASN.1)可以指定密钥。例如,DSA 专用密钥可以由其组件 x、p、q 和 g 指定(请参见 DSAPrivateKeySpec),或使用其 DER 编码指定(请参见 PKCS8EncodedKeySpec)。

此接口不包含任何方法或常量。它仅用于将所有密钥规范分组,并为其提供类型安全。所有密钥规范都必须实现此接口。

在实现类中可以看到DESKeySpec。

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 * 创建时间: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加密解密算法!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。