java使用des加密(des加密算法实现)

本文目录一览:

Java中 DES加密算法

三个文件:

一:skey_DES.java

//对称秘钥生成及对象化保存

import java.io.FileOutputStream;

import java.io.ObjectOutputStream;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

public class Skey_DES

{

public static void main(String args[])throws Exception

{

KeyGenerator kg=KeyGenerator.getInstance(“DESede”);

kg.init(168);

SecretKey k=kg.generateKey();

FileOutputStream f=new FileOutputStream(“key1.txt”);

ObjectOutputStream b= new ObjectOutputStream(f);

b.writeObject(k);

}

};

二:SEnc.java

//对称秘钥加密,使用字节码

import java.io.*;

import java.security.*;

import javax.crypto.*;

public class SEnc

{

public static void main(String args[]) throws Exception

{

String s=”Hello123Hello123Hello123Hello123″;

FileInputStream f=new FileInputStream(“key1.txt”);

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject();

Cipher cp=Cipher.getInstance(“DESede”);

cp.init(Cipher.ENCRYPT_MODE,k);

byte ptext[]=s.getBytes(“UTF8”);

for(int i=0;iptext.length;i++)

{

System.out.print(ptext[i]+”,”);

}

System.out.println(“”);

byte ctext[]=cp.doFinal(ptext);

for(int i=0;ictext.length;i++)

{

System.out.print(ctext[i]+”,”);

}

FileOutputStream f2=new FileOutputStream(“SEnc.txt”);

f2.write(ctext);

}

};

三:SDec.java

//使用对称秘钥解密

import java.io.*;

import java.security.*;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

public class SDec

{

public static void main(String args[])throws Exception

{

FileInputStream f=new FileInputStream(“SEnc.txt”);

int num=f.available();

byte[] ctext=new byte[num];

f.read(ctext);

FileInputStream f2=new FileInputStream(“key1.txt”);

ObjectInputStream b=new ObjectInputStream(f2);

Key k=(Key)b.readObject();

Cipher cp=Cipher.getInstance(“DESede”);

cp.init(Cipher.DECRYPT_MODE,k);

byte[] ptext=cp.doFinal(ctext);

String p=new String(ptext,”UTF8″);

System.out.println(p);

}

};

java des加密,密钥的长度是多少

3des算法是指使用双长度(16字节)密钥k=(kl||kr)将8字节明文数据块进行3次des加密/解密。如下所示:

y

=

des(kl)[des-1(kr)[des(kl[x])]]

解密方式为:

x

=

des-1

(kl)[des

(kr)[

des-1

(kl[y])]]

其中,des(kl[x])表示用密钥k对数据x进行des加密,des-1

(kl[y])表示用密钥k对数据y进行解密。

sessionkey的计算采用3des算法,计算出单倍长度的密钥。表示法为:sk

=

session(dk,data)

3des加密算法为:

void

3des(byte

doublekeystr[16],

byte

data[8],

byte

out[8])

{

byte

buf1[8],

buf2[8];

des

(doublekeystr[0],

data,

buf1);

udes(doublekeystr[8],

buf1,

buf2);

des

(doublekeystr[0],

buf2,

out);

}

JAVA和.NET使用DES对称加密的区别

DES加密算法原理:DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的第8位作为奇偶校验位),产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或,置换,代换,移位操作四种基本运算。

.NET中的DES加密:

对于.NET,框架在System.Security.Cryptography命名空间下提供了DESCryptoServiceProvider作为System.Security.Cryptography.DES加密解密的包装接口,它提供了如下的4个方法:

public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)

public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)

public override void GenerateIV()

public override void GenerateKey()

从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样

JAVA中的DES加密:

JAVA的javax.crypto.Cipher包下,提供了加密解密的功能,它的静态getInstance方法,可以返回一个Cipher对象,一般有public static final Cipher getInstance(String transformation)方法,transformation为:algorithm/mode/padding,分别表示算法名称,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名称,如为:”DES/CBC/PKCS5Padding”,”DES”等。JAVA中默认的算法为ECB,默认填充方式为PKCS5Padding。Cipher的Init方法用来初始化加密对象,常见的有:

public final void init(int opmode, Key key, AlgorithmParameterSpec params) ,

public final void init(int opmode,Key key, SecureRandom random),用SecureRandom时,一般用于不需要IV的算法模式

总结

对于.NET和JAVA在使用DES对称加密时,需要大家指定一样的算法和填充模式,并且JAVA在写DES加解密算法时,还需要根据创建Cipher对象的不同,正确使用IV向量。在不同系统需要互相数据时,必须要明确的是加密算法,Key和算法模式,再根据不同模式是否需要IV向量,最后是填充模式。

如何使用JAVA实现对字符串的DES加密和解密

/**

 * ECB模式的des加密,以base64的编码输出

 * @param message

 * @param key

 * @return

 * @throws Exception

 */

  public static String desEncrypt(String message, String key)throws Exception{

    // DES/ECB CBC CFB OFB /PKCS5Padding  NoPadding  加密/模式/填充

    Cipher cipher = Cipher.getInstance(“DES”);//默认就是 DES/ECB/PKCS5Padding

    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DES”);

    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

    cipher.init(1, secretKey);

   return new BASE64Encoder().encode(cipher.doFinal(message.getBytes(“UTF-8”)));

  }

  /**

   * ECB模式的des解密

   * @param message

   * @param key

   * @return

   * @throws Exception

   */

  public static String desDecrypt(String message, String key)throws Exception{

    Cipher cipher = Cipher.getInstance(“DES”);

    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DES”);

    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

    cipher.init(2, secretKey);

    return new String(cipher.doFinal(Base64.decode(message)), “UTF-8”);

  }

你自己写main方法测试一下,应该是没问题的

原创文章,作者:SP1OV,如若转载,请注明出处:https://www.506064.com/n/127538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SP1OVSP1OV
上一篇 2024-10-03 23:16
下一篇 2024-10-03 23:16

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论