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

时间: 2024-10-05 15:10:11

DES加密解密->java实现的相关文章

des加密解密——java加密,php解密

最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了.为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密.结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来. 要来java的des算法代码,研究加密的过程,其

des加密解密JAVA与.NET互通实例

JAVA版本 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; public class Des { private byte[] desKey; //解密数据 public static Stri

兼容PHP和Java的des加密解密代码分享

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加

DES加密解密字符串的JAVA实现(lp)

野火烧不尽,春风吹又生.众里寻他千百度,蓦然回首,那人却在灯火阑珊处.天作孽,犹可违,自作孽,不可活.山高月小,水落石出.晴川历历汉阳树,芳草萋萋鹦鹉洲. package test.des2.tt; /** * * 这个是真正实用的.修正了以前方法的只加密了前8位正确的bug. */ import java.security.*; import javax.crypto.*; public class DESPlus { private static String strDefaultKey =

C# Java DES加密解密

c#代码: public class DESHelper    {          /// <summary>        /// DES加密算法        /// </summary>        /// <param name="encryptString">要加密的字符串</param>        /// <param name="sKey">加密码Key</param>  

JAVA使用DES加密解密

在使用DES加密解密的时候,遇到了一些问题,廖记一下.如有哪位大神亲临留言指点,不胜感激. 先上代码: public DESUtil() { } //密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.*/ private stati

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

DES加密解密类-java

import java.security.*; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * Copyright 2007 GuangZhou Cotel Co. Ltd. * All right reserved. * DES加密解密类. * @author <a

用JAVA实现的DES加密解密算法

package Encrypt; import java.security.*; import javax.crypto.*; import sun.misc.*; /** * 使用DES加密与解密,可对byte[],String类型进行加密与解密 * 密文可使用String,byte[]存储. * 方法: * void getKey(String strKey)从strKey的字条生成一个Key * String getEncString(String strMing)对strMing进行加密