首页 > 编程知识 正文

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

时间:2023-12-15 08:46:16 阅读:315998 作者:ELHL

本文目录一览:

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方法测试一下,应该是没问题的

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。