DES加密解密算法的实现(Java基本要求)

合集下载

java des加密方法

java des加密方法

java des加密方法
Java中的DES加密方法是一种对称加密算法,它使用一个共享的密钥来加密和解密数据。

DES算法的密钥长度为56位,但由于其已被认为容易被破解,因此现在已经不再被广泛使用。

在Java中,我们可以使用Java Cryptography Extension (JCE)中的javax.crypto包中的类来执行DES加密和解密操作。

我们可以使用javax.crypto.KeyGenerator类来生成一个DES密钥,然后使用javax.crypto.Cipher类来执行加密和解密操作。

使用DES加密和解密数据的基本流程如下:
1. 创建一个javax.crypto.KeyGenerator对象,并使用DES算法初始化它。

2. 调用KeyGenerator的generateKey()方法生成一个密钥。

3. 创建一个javax.crypto.Cipher对象,并使用密钥初始化它。

4. 调用Cipher的doFinal()方法,将需要加密或解密的数据作为参数传递给它。

5. 将加密或解密后的数据作为结果返回。

在进行DES加密和解密操作时,我们需要注意以下几点:
1. 密钥长度必须为8个字节,即56位。

2. 加密和解密的数据必须是8个字节的倍数,如果不足8个字节,则需要使用填充方法填充。

3. 加密和解密使用的密钥必须相同,否则解密将失败。

在实际应用中,我们可以使用DES加密算法来保护敏感数据的安
全性,例如密码、信用卡号码等。

同时,我们也需要采取其他措施来保护数据传输的安全,例如使用SSL/TLS协议。

des加密算法java代码

des加密算法java代码

des加密算法java代码1、DES加密算法Java实现(1)导入所需要的包:import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;(2)定义加密算法:public class DesEncrypter {Cipher ecipher;Cipher dcipher;public DesEncrypter(String passPhrase) {try {// Create the keyDESKeySpec keySpec = newDESKeySpec(passPhrase.getBytes('UTF8'));SecretKeyFactory keyFactory =SecretKeyFactory.getInstance('DES');SecretKey key = keyFactory.generateSecret(keySpec); // Create the cipherecipher = Cipher.getInstance('DES');dcipher = Cipher.getInstance('DES');// Initialize the cipher for encryptionecipher.init(Cipher.ENCRYPT_MODE, key);// Initialize the same cipher for decryption dcipher.init(Cipher.DECRYPT_MODE, key);} catch (Exception e) {}}(3)定义加密函数:public String encrypt(String str) {try {// Encode the string into bytes using utf-8 byte[] utf8 = str.getBytes('UTF8');// Encryptbyte[] enc = ecipher.doFinal(utf8);// Encode bytes to base64 to get a stringreturn new sun.misc.BASE64Encoder().encode(enc);} catch (Exception e) {}return null;}(4)定义解密函数:// Decryptpublic String decrypt(String str) {try {// Decode base64 to get bytesbyte[] dec = newsun.misc.BASE64Decoder().decodeBuffer(str);// Decryptbyte[] utf8 = dcipher.doFinal(dec);// Decode using utf-8return new String(utf8, 'UTF8');} catch (Exception e) {}return null;}}(5)定义测试类,测试加密解之密是否正确:public class TestDes {public static void main(String[] args) {try {// Create encrypter/decrypter classDesEncrypter encrypter = new DesEncrypter('your key');// EncryptString encrypted = encrypter.encrypt('Don't tell anybody!');// DecryptString decrypted = encrypter.decrypt(encrypted);// Print out valuesSystem.out.println('Encrypted: ' + encrypted);System.out.println('Decrypted: ' + decrypted);} catch (Exception e) {}}}。

DES加密和解密java代码

DES加密和解密java代码

DES加密和解密java代码在说DES加密算法之前,我们⾸先了解⼏个基本概念:1. 明⽂:明⽂是指没有经过加密的数据。

⼀般⽽⾔,明⽂都是等待传输的数据。

由于没有经过加密,明⽂很容易被识别与破解,因此在传输明⽂之前必须进⾏加密处理。

2. 密⽂:密⽂只是明⽂经过某种加密算法⽽得到的数据,通常密⽂的形式复杂难以识别及理解。

3. 密钥:密钥是⼀种参数,它是在明⽂转换为密⽂或将密⽂转换为明⽂的算法中输⼊的参数。

4. 对称加密:通信双⽅同时掌握⼀个密钥,加密解密都是由⼀个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。

双⽅通信前共同拟定⼀个密钥,不对第三⽅公开。

5. 分组加密:分组密码是将明⽂分成固定长度的组,每⼀组都采⽤同⼀密钥和算法进⾏加密,输出也是固定长度的密⽂。

好了了解这些以后,我们再来说DES加密算法。

DES 算法是⼀种常见的分组加密算法,由IBM公司在1971年提出。

DES 算法是分组加密算法的典型代表,同时也是应⽤最为⼴泛的对称加密算法。

下⾯我们详细介绍下:1.分组长度:DES 加密算法中,明⽂和密⽂为 64 位分组。

密钥的长度为 64 位,但是密钥的每个第⼋位设置为奇偶校验位,因此密钥的实际长度为56位。

2.加密流程:DES 加密算法⼤致分为 4 步:初始置换、⽣成⼦密钥、迭代过程、逆置换。

代码如下:需特别注意:不要使⽤JDK中⾃带的sun.misc.BASE64Decoder类去做BASE64,该类会在最后⾯多加换⾏。

⽽应使⽤apache中的mons.codec.binary.Base64这个类来做base64加密。

(待验证)import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec;import java.security.Key;import java.security.SecureRandom;import mons.codec.binary.Base64;public class DESUtil {// 偏移变量,固定占8位字节private final static String IV_PARAMETER = "12345678";// 字符编码public static final String CHARSET_UTF8 = "UTF-8";// 加密算法DESpublic static final String DES = "DES";// 电话本模式public static final String DES_ECB = "DES/ECB/PKCS5Padding";// 加密块链模式--推荐public static final String DES_CBC = "DES/CBC/PKCS5Padding";// 测试public static void main(String args[]) {// 待加密内容String str = "false";// 密码,长度要是8的倍数String password = "87654321";String result = DESUtil.encryptCBC(password, str);System.out.println("加密后:" + new String(result));// 直接将如上内容解密try {String decryResult = DESUtil.decryptCBC(password, result);System.out.println("解密后:" + new String(decryResult));} catch (Exception e1) {e1.printStackTrace();}}/*** ⽣成key** @param password* @return* @throws Exception*/private static Key generateKey(String password) throws Exception {DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET_UTF8));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);return keyFactory.generateSecret(dks);}/*** DES加密字符串--ECB格式** @param password* 加密密码,长度不能够⼩于8位* @param data* 待加密字符串* @return加密后内容*/public static String encryptECB(String password, String data) {if (password == null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(DES_ECB);cipher.init(Cipher.ENCRYPT_MODE, secretKey, new SecureRandom());byte[] bytes = cipher.doFinal(data.getBytes(CHARSET_UTF8));// JDK1.8及以上可直接使⽤Base64,JDK1.7及以下可以使⽤BASE64Encoder return new String(Base64.encodeBase64(bytes));} catch (Exception e) {e.printStackTrace();return data;}}/*** DES解密字符串--ECB格式** @param password* 解密密码,长度不能够⼩于8位* @param data* 待解密字符串* @return解密后内容*/public static String decryptECB(String password, String data)throws Exception {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(DES_ECB);cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom());return new String(cipher.doFinal(Base64.decodeBase64(data.getBytes(CHARSET_UTF8))), CHARSET_UTF8);}/*** DES加密字符串-CBC加密格式** @param password* 加密密码,长度不能够⼩于8位* @param data* 待加密字符串* @return加密后内容*/public static String encryptCBC(String password, String data) {if (password == null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}if (data == null) {return null;}try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(DES_CBC);IvParameterSpec spec = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET_UTF8));cipher.init(Cipher.ENCRYPT_MODE, secretKey, spec);byte[] bytes = cipher.doFinal(data.getBytes(CHARSET_UTF8));// JDK1.8及以上可直接使⽤Base64,JDK1.7及以下可以使⽤BASE64Encoder return new String(Base64.encodeBase64(bytes));} catch (Exception e) {e.printStackTrace();return data;}}/*** DES解密字符串--CBC格式** @param password* 解密密码,长度不能够⼩于8位* @param data* 待解密字符串* @return解密后内容*/public static String decryptCBC(String password, String data) throws Exception {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(DES_CBC);IvParameterSpec spec = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET_UTF8));cipher.init(Cipher.DECRYPT_MODE, secretKey, spec);return new String(cipher.doFinal(Base64.decodeBase64(data.getBytes(CHARSET_UTF8))), CHARSET_UTF8); }}。

Java实现DES加密解密

Java实现DES加密解密

Java实现DES加密解密DES(Data Encryption Standard)是⼀种对称加密算法,所谓对称加密就是加密和解密都是使⽤同⼀个密钥加密原理:DES 使⽤⼀个 56 位的密钥以及附加的 8 位奇偶校验位,产⽣最⼤ 64 位的分组⼤⼩。

这是⼀个迭代的分组密码,使⽤称为 Feistel 的技术,其中将加密的⽂本块分成两半。

使⽤⼦密钥对其中⼀半应⽤循环功能,然后将输出与另⼀半进⾏"异或"运算;接着交换这两半,这⼀过程会继续下去,但最后⼀个循环不交换。

DES 使⽤ 16 个循环,使⽤异或,置换,代换,移位操作四种基本运算。

不过,DES已可破解,所以针对保密级别特别⾼的数据推荐使⽤⾮对称加密算法。

下⾯介绍基于Java实现的DES加解密⽅法,该⽅法同样适⽤于Android平台,使⽤的是JDK1.8。

public class DESUtil {/*** 偏移变量,固定占8位字节*/private final static String IV_PARAMETER = "12345678";/*** 密钥算法*/private static final String ALGORITHM = "DES";/*** 加密/解密算法-⼯作模式-填充模式*/private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";/*** 默认编码*/private static final String CHARSET = "utf-8";/*** ⽣成key** @param password* @return* @throws Exception*/private static Key generateKey(String password) throws Exception {DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);return keyFactory.generateSecret(dks);}/*** DES加密字符串** @param password 加密密码,长度不能够⼩于8位* @param data 待加密字符串* @return 加密后内容*/public static String encrypt(String password, String data) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}if (data == null)return null;try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));//JDK1.8及以上可直接使⽤Base64,JDK1.7及以下可以使⽤BASE64Encoder//Android平台可以使⽤android.util.Base64return new String(Base64.getEncoder().encode(bytes));} catch (Exception e) {e.printStackTrace();return data;}}/*** DES解密字符串** @param password 解密密码,长度不能够⼩于8位* @param data 待解密字符串* @return 解密后内容*/public static String decrypt(String password, String data) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}if (data == null)return null;try {Key secretKey = generateKey(password);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET); } catch (Exception e) {e.printStackTrace();return data;}}/*** DES加密⽂件** @param srcFile 待加密的⽂件* @param destFile 加密后存放的⽂件路径* @return 加密后的⽂件路径*/public static String encryptFile(String password, String srcFile, String destFile) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}try {IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv);InputStream is = new FileInputStream(srcFile);OutputStream out = new FileOutputStream(destFile);CipherInputStream cis = new CipherInputStream(is, cipher);byte[] buffer = new byte[1024];int r;while ((r = cis.read(buffer)) > 0) {out.write(buffer, 0, r);}cis.close();is.close();out.close();return destFile;} catch (Exception ex) {ex.printStackTrace();}return null;}/*** DES解密⽂件** @param srcFile 已加密的⽂件* @param destFile 解密后存放的⽂件路径* @return 解密后的⽂件路径*/public static String decryptFile(String password, String srcFile, String destFile) {if (password== null || password.length() < 8) {throw new RuntimeException("加密失败,key不能⼩于8位");}try {File file = new File(destFile);if (!file.exists()) {file.getParentFile().mkdirs();file.createNewFile();}IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, generateKey(key), iv);InputStream is = new FileInputStream(srcFile);OutputStream out = new FileOutputStream(destFile);CipherOutputStream cos = new CipherOutputStream(out, cipher);byte[] buffer = new byte[1024];int r;while ((r = is.read(buffer)) >= 0) {cos.write(buffer, 0, r);}cos.close();is.close();out.close();return destFile;} catch (Exception ex) { ex.printStackTrace(); }return null;}}。

DES加密解密Java代码

DES加密解密Java代码
mainMenu.add(generateItem);
mainMenu.addSeparator();
mainMenu.add(encryptItem);
mainMenu.add(decryptItem);
menuBar.add(mainMenu);
setJMenuBar(menuBar);
//添加文本区
if (fileName == null)
return;
//读取密文
FileInputStream fis = new FileInputStream(fileName);
byte[] cipherText = new byte[fis.available()];
fis.read(cipherText);
jfc.setDialogTitle("打开加密文本内容");
if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
fileName = jfc.getSelectedFile().getPath();
}
//如果没有选择文件,就退出
e1.printStackTrace();
}
} else if (e.getSource() == decryptItem) {
try {
//读取密钥文件的完整路径
String fileName = null;
//设置文件选择对话框
JFileChooser jfc = new JFileChooser();
add(jsp);
//添加事件监听
generateItem.addActionListener(this);

DES加密算法代码

DES加密算法代码

DES加密算法代码java实现DES加密1.准备算法所需要的密钥在Java中,DES加密算法需要一个8字节长的密钥,这里使用原始的8字节长的密钥来实现DES加密算法,同时,还有一种是“密钥扩展”,可以将8字节长的密钥扩展为16字节长,只需要多添加8个字节,后面8个字节可以跟前面8字节保持一致即可,即扩展后的密钥和原始密钥共享后八个字节即可。

byte [] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte) 0x88,0x10, 0x40, 0x38,0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte)0xE2};下面介绍如何用Java来实现原始的8字节长的密钥:// 生成keyKeyGenerator keyGenerator = KeyGenerator.getInstance("DES");keyGenerator.init(new SecureRandom(keyBytes));SecretKey key = keyGenerator.generateKey(;2. 设置加密模式(Cipher Block Chaining Mode,简称CBC模式)在Java中,DES加密算法可以支持三种不同的加密模式:ECB,CBC,CFB。

其中ECB模式为最原始的模式,它不需要任何附加的参数,而CBC模式需要一个8字节的初始向量(Initial Vector,IV)参数,CFB模式需要一个1字节或8字节的变量参数,它们用来增加加密的强度。

这里,我们使用CBC模式,它是最常用的DES加密模式,下面是设置CBC模式所需要的参数:// 创建Cipher对象,指定其支持的DES算法Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 用密匙初始化Cipher对象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, key,param);3.加密。

DES加密算法的JAVA实现

DES加密算法的JAVA实现

DES加密算法的JAVA实现DES是一种对称加密算法,它将明文划分为64位的数据块,并对每个数据块进行一系列的转换和替代操作,最终生成密文。

在Java中,可以使用javax.crypto包提供的API来实现DES加密算法。

首先,需要导入javax.crypto包和java.security包。

```javaimport javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.security.Key;``````javapublic class DESUtilprivate static final String ALGORITHM = "DES";public static Key generateKey(byte[] keyData) throws Exceptionreturn new SecretKeySpec(keyData, ALGORITHM);}```接下来,我们需要编写加密和解密的方法。

```javapublic class DESUtil//...public static byte[] encrypt(byte[] data, Key key) throws ExceptionCipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key);return cipher.doFinal(data);}public static byte[] decrypt(byte[] encryptedData, Key key) throws ExceptionCipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key);return cipher.doFinal(encryptedData);}```在上述代码中,encrypt方法用于将明文数据加密成密文,decrypt 方法用于将密文数据解密成明文。

DES加密算法详细原理以及Java代码实现

DES加密算法详细原理以及Java代码实现

DES加密算法详细原理以及Java代码实现本周的密码学实验要求使⽤任意编程语⾔来实现des加密算法,于是我在查阅了相关资料后有了以下成果。

⾸先,DES算法作为经典的分块密码(block cipher),其主要的实现过程由两部分组成,分别是密钥的⽣成以及明⽂的处理。

加密的⼤致流程如图所⽰作为分块密码,密钥的输⼊以及明⽂的输⼊均为64位2进制数。

下⾯⾸先来说密钥的⽣成过程。

密钥处理部分如图所⽰ 密钥的输⼊为64位,例如00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001,然后经过pc-1盒置换,会去除每⼀个8的倍数位(奇偶校验位)并打乱次序,将密钥变为56位。

pc-1的置换表如下(框中的数字代表的是原密钥的位置,⽽不是数据)157,49,41,33,25,17,9,1,258,50,42,34,26,18,10,2,359,51,43,35,27,19,11,3,460,52,44,36,63,55,47,39,531,23,15,7,62,54,46,38,630,22,14,6,61,53,45,37,729,21,13,5,28,20,12,4 也就是说,经过pc-1盒的置换原来第57位的1将会到第1位,原来49位的数据会到第2位,以此类推。

在DES密钥加密的过程中,这种置换⽅式经常出现。

在经过了pc-1盒的置换后,原来56位的密钥会被均分为两组成为c0,d0。

然后l0和d0会经过循环左移(left shift)的处理。

例如⼀串密钥为1010101,在经过⼀位的循环左移后会变成0101011,即循环左移⼏位,最左边的⼏位数据会紧接在后⾯,达到⼀种左移的效果。

左移后的密钥块分别称为c1,d1。

这时候,将c1以及d1组合起来,经过pc-2的置换(类似于pc-1)。

114,17,11,24,1,5,23,28,15,6,21,10,323,19,12,4,26,8,416,7,27,20,13,2,541,52,31,37,47,55,630,40,51,45,33,48,744,49,39,56,34,53,846,42,50,36,29,32 经过了pc-2盒的置换后,原本56位的密钥会变为48位。

S-DES加密算法的JAVA实现

S-DES加密算法的JAVA实现

周胜安(200620109286) 计算机科学与工程研一(2)班S-DES加密算法的JAVA实现一、实验要求(1)简述S-DES的加密算法的主要思想(2)实现的主要步骤,及各个步骤的主要思想及示意图(3)给出程序的分析,运行结果和程序的效率分析(4)通过编程实现S-DES加密算法,了解DES加密的原理,也加深对现代对称密码的理解。

二、算法思想•加密算法的数学表示:密文=IP-1fk2(SW(fk1(IP(明文)))))其中K1=P8(移位(P10(密钥K)))K2=P8(移位(移位(P10(密钥K))))• 解密算法的数学表示:明文=IP-1(fk1(SW(fk2(IP(密文)))))S-DES 加密方法示意图:S-DES算法涉及加密、密钥产生、解密三个部分。

流程图(每个函数的算法见源代码)三、算法流程框图、各模块说明实验是用JAVA实现的(1)密钥的产生密钥产生的示意图:密钥的产生算法涉及五个函数定义(1)初始置换P10 其中P10的定义为:P10(k1,k2,…,k10)=(k3,k5,k2,k7,k4,k10,k1,k9,k8,k6)(2)LS-1操作:对密钥的左右两组循环左移一位(密钥分成5位一组,共2组)(3)P8置换产生Key1。

其中P8的定义为:P8(k1,k2,…,k10)=(k6,k3,k7,k4,k8,k5,k10,k9)(4)LS-2操作: :对密钥的左右两组循环左移两位.(5) P8置换产生Key2(2) S-DES 的加密过程示意图:加密算法涉及五个函数:(1)初始置换IP(initial permutation)。

其中P8的定义为:IP(k1,k2,…,k8)=(k2,k6,k3,k1,k4,k8,k5,k7)(2)复合函数fk,它是由密钥K确定的,具有置换和代替的运算。

函数fk,是加密方案中的最重要部分,它可表示为:fk(L,R)=(L F(R,SK),R)其中L,R为8位输入, 左右各为4位, F为从4位集到4位集的一个映射, 并不要求是1-1的。

des加密算法的JAVA实现(窗口的实现部分)

des加密算法的JAVA实现(窗口的实现部分)

以下为DES加密算法的实现(附控制台输出调试代码)/*** Created on __DATE__, __TIME__*/package deswindow;import java.util.Scanner;/**** @author __USER__*/public class Window extends javax.swing.JFrame {/** Creates new form Window */public Window() {initComponents();}/** This method is called from within the constructor to* initialize the form.* WARNING: Do NOT modify this code. The content of this method is* always regenerated by the Form Editor.*///GEN-BEGIN:initComponents// <editor-fold defaultstate="collapsed" desc="Generated Code">private void initComponents() {button1 = new java.awt.Button();textField1 = new java.awt.TextField();textField2 = new java.awt.TextField();内容= new bel();密钥= new bel();textArea1 = new java.awt.TextArea();button2 = new java.awt.Button();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);button1.setLabel("加密");er(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {button1ActionPerformed(evt);}});textField1.setText("请输入明文或者密文");textField1.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {textField1ActionPerformed(evt);}});textField2.setText("请输入密钥");textField2.addActionListener(new java.awt.event.ActionListener() {t.ActionEvent evt) {textField2ActionPerformed(evt);}});内容.setText("内容");密钥.setText("密钥");button2.setLabel("解密");button2.addActionListener(new java.awt.event.ActionListener() {vent evt) {button2ActionPerformed(evt);}});javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(127, 127, 127).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(textArea1,javax.swing.GroupLayout.Alignment.TRAILING,javax.swing.GroupLayout.DEFAULT_SIZE,124,Short.MAX_VALUE).addGroup( layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addPreferredGap(ponentPlacement.RELATED).addComponent(内容,javax.swing.GroupLayout.PREFERRED_SIZE,38,javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(密钥,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(2,2,2).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(textField1,javax.swing.GroupLayout.DEFAULT_SIZE,84,Short.MAX_V ALUE).addComponent(textField2,javax.swing.GroupLayout.DEFAULT_SIZE,84,Short.MAX_V ALUE)))).addGroup(layout.createSequentialGroup().addComponent(button1, javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED).addComponent(button2, javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE))).addGap(149, 149, 149)));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(29, 29, 29).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(textField1,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(内容,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(t.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(密钥,javax.swing.GroupLayout.PREFERRED_SIZE,out.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(textField2,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(ponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(button2,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(button1,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(ponentPlacement.RELATED).addComponent(textArea1,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(91, Short.MAX_V ALUE)));pack();}// </editor-fold>//GEN-END:initComponentsprivate void button2ActionPerformed(java.awt.event.ActionEvent evt) {// 解密得到两个输入框的输入值textArea1.setText("");// textArea1.append("欢迎使用64位DES加密解密演示程序。

DES加解密的JAVA实现

DES加解密的JAVA实现

一、实验目的用java编程实现DES加解密算法,以便深入理解DES加解密算法原理。

二、实验条件1、熟悉JA V A开发环境,能熟练运用JA V A进行程序编写;2、掌握DES加解密算法知识,了解其算法原理;3、安装了JA V A环境的计算机。

三、实验原理1、DES加解密过程:1)、初始置换:对于给定的明文分组x,通过初始置换表IP对x进行置换,得到一个64位的输出串x0,即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。

对于所得到64位的输出串x0,记x0 = IP(x) = L0 R0,其中L0为x0的前32位,R0为x0的后32位。

2)、迭代变换:按照规则迭代。

规则为:Li=Ri-1Ri=Li⊕f(Ri-1, Ki) (i=1,2,3, (16)经过第1步变换已经得到L0和R0的值,其中符号⊕表示数学运算“异或”,f表示一种置换,由s盒置换构成,Ki是一些由密钥编排函数产生的比特块。

迭代变换利用16轮循环,每轮循环使用子密钥对Li 和Ri进行分别处理,对输出结果进行异或运算和交换操作,以实现数据和密钥的结合。

3)、逆置换:类似的,经过16轮迭代后所得到的串R16 、L16应用初始置换的逆置换IP-1,获得密文y,即y = IP-1(R16 , L16)。

2、密码函数f函数f的输入是一个32比特串(当前状态的右半部)和子密钥。

密钥编排方案(k1,k2,…,k32)由16个48比特的子密钥组成,这些子密钥由56比特的种子密钥k 导出。

每个ki 都是由置换选择而来,子密钥的产生过程后面详述。

它主要包含了一个应用S 盒的替代以及其后跟随的一个固定置换P 。

密码函数f 是整个加密的关键部分,它包含了如下四个功能:扩展函数E 、S 盒运算、模2加法、置换函数。

其中,E 位选择表如下:Ki 是由密钥产生的48位比特串,具体的算法是:将E 的选位结果与 ki 作异或操作,得到一个48位输出。

java实现DES加密算法

java实现DES加密算法

数据结构算法:java实现DES加密算法java实现DES加密算法为了实现一对密钥对整个项目所有加密解密文件都适用的方法,考试,大提示采用先生成一对密钥.保存到xml文件中,以后获得私匙和公钥只需要从xml文件中取得就可以了./*** 把成生的一对密钥保存到DesKey.xml文件中*/public static void saveDesKey(){try {SecureRandom sr = new SecureRandom();//为我们选择的DES算法生成一个KeyGenerator对象KeyGenerator kg = KeyGenerator.getInstance (\"DES\" );kg.init (sr);FileOutputStream fos = new FileOutputStream(\"C:/DesKey.xml\");ObjectOutputStream oos = new ObjectOutputStream(fos);//生成密钥Key key = kg.generateKey();oos.writeObject(key);oos.close();} catch (Exception e) {e.printStackTrace();}}获取密钥方法如下:/*** 获得DES加密的密钥。

在交易处理的过程中应该定时更* 换密钥。

需要JCE的支持,如果jdk版本低于1.4,则需要* 安装jce-1_2_2才能正常使用。

* @return Key 返回对称密钥*/public static Key getKey() {Key kp = null;try {String fileName = \"conf/DesKey.xml\";InputStream is = DesUtil.class.getClassLoader().getResourceAsStream(fileName);ObjectInputStream oos = new ObjectInputStream(is);kp = (Key) oos.readObject();oos.close();} catch (Exception e) {e.printStackTrace();}return kp;}文件采用DES算法加密文件/*** 文件file进行加密并保存目标文件destFile中* @param file* 要加密的文件如c:/test/srcFile.txt* @param destFile* 加密后存放的文件名如c:/加密后文件.txt*/public static void encrypt(String file, String destFile) throws Exception { Cipher cipher = Cipher.getInstance(\"DES\");cipher.init(Cipher.ENCRYPT_MODE, getKey());InputStream is = new FileInputStream(file);OutputStream out = new FileOutputStream(dest); CipherInputStream cis = new CipherInputStream(is, cipher);byte[] buffer = new byte[1024];int r;while ((r = cis.read(buffer)) > 0) {out.write(buffer, 0, r);}cis.close();is.close();out.close();}文件采用DES算法解密文件/*** 文件file进行加密并保存目标文件destFile中* @param file* 已加密的文件如c:/加密后文件.txt* @param destFile* 解密后存放的文件名如c:/ test/解密后文件.txt*/public static void decrypt(String file, String dest) throws Exception { Cipher cipher = Cipher.getInstance(\"DES\");cipher.init(Cipher.DECRYPT_MODE, getKey());InputStream is = new FileInputStream(file);OutputStream out = new FileOutputStream(dest); CipherOutputStream cos = new CipherOutputStream(out, cipher);byte[] buffer = new byte[1024];int r;while ((r = is.read(buffer)) >= 0) {cos.write(buffer, 0, r);}cos.close();out.close();is.close(); }。

DES详解(Java实现)

DES详解(Java实现)

DES详解(Java实现)DES 数据加密标准(Data Encryption Standard),简称DES,是由IBM公司提交,美国政府于1977年1⽉5⽇颁布的⼀种加密算法。

DES的设计⽬标是,⽤于加密保护静态存储和传输信道中的数据,安全使⽤10~15年。

DES综合运⽤了置换、代替、代数等多种密码技术。

它设计精巧、实现容易、使⽤⽅便,堪称是适应计算机环境的近代分组密码的⼀个典范。

DES的设计充分体现了Shannon所阐述的设计密码的思想,标志着密码的设计与分析达到了新的⽔平。

DES是⼀种分组密码。

明⽂、密⽂和密钥的分组长度都是64位。

DES是⾯向⼆进制的密码算法。

因⽽能够加解密任何形式的计算机数据。

DES是对合运算,因⽽加密和解密共⽤同⼀算法,从⽽使⼯程实现的⼯作量减半。

DES的密码结构属于Feistel结构。

Feistel结构 Feistel结构是IBM的密码专家Horst Feistel最早提出的。

由于它是对称的密码结构,所以对信息加密和解密的过程就极为相似,甚⾄完全⼀样。

这就使得在实施的过程中,对编码量和线路传输的要求就减少了⼏乎⼀半。

加密结构 L i = R i-1 R i = L i-1 ⊕ f ( R i-1 , k i )解密结构 L i-1 = R i ⊕ f ( L i , k i ) R i-1 = L i影响因素 影响Feistel结构的因素有以下5个: 1.块的⼤⼩:⼤的块会提⾼加密的安全性,但是会降低加密、解密的速度; 2.密钥的⼤⼩:⼤的密钥也会提⾼加密的安全性,但是也会降低加密、解密的速度; 3.轮次数:每多进⾏⼀轮循环,安全性就会有所提⾼; 4.⼦密钥的⽣成算法:⽣成算法越复杂,则会使得密⽂被破译的难度增强,即信息会越安全; 5.轮函数的复杂度:轮函数越复杂,则安全性会越⾼。

DES算法细节⼦密钥的产⽣ 64位密钥经过置换选择1、循环左移、置换选择2等变换,产⽣出16个48位长的⼦密钥。

实验二DES加解密算法的实现

实验二DES加解密算法的实现

实验二:DES的编程实现一、实验目的在本实验中,用VC/ C/C++/Java实现DES的加解密算法。

完成实验后将能够深入理解DES加解密算法及其在VC/ C/C++/Java中的实现过程。

二、实验条件熟悉VC/ C/C++/Java开发环境和有关DES算法的有关知识;一台安装有VC/ C/C++/Java 的计算机。

三、实验要求本实验要求:输入十六位十六进制明文(占64Bit)和十六位十六进制密钥(占64Bit),输出十六位十六进制密文和六十四位二进制密文。

四、实验步骤对数据进行加密传输能有效地保证数据的机密性,DES是一个保证数据机密性的经典算法,本实验拟在VC/ C/C++/Java环境中实现DES算法。

以下以VC为例:主要内容:在VC中建立三个文件:控制台应用程序的入口点:testMain.cpp,DES2加密类cpp文件zlDES2.cpp,DES2加密类头文件zlDES2.h。

操作步骤:(1)进入VC环境;(2)在VC环境中,执行“文件| 新建”命令,在“新建”对话框中(如图1)选择“文件”页,在其左侧的列表框中选择“Win32 Console Application”,在右侧的“文件名”文本框中输入新文件名“DES”,在“位置”文本框中选择项目的存储路径(比如选择“e:\des”)。

然后单击“确定”按钮。

图1 “New(新建)”对话框(3)“Win32 Console Application-步骤1共1步”对话框中,选择“一个空工程”单选按钮,单击“完成”按钮,再单击“确定”按钮。

图2 “Win32 Console Application-步骤1共1步”对话框(4)在VC环境中,在其左侧的工程工作区窗口下端中选择标签“FileView”,单击“DES files”前面的“+”号展开。

图3 标签“FileView”(5)鼠标右击“Source Files”,选择“添加文件到目录”,将testMain.cpp和zlDES.cpp 添加进“Source Files”。

JAVA上DES加密算法的实现用例

JAVA上DES加密算法的实现用例

JAVA上DES加密算法的实现用例First we should implement Oracle’s DES arithmetic using Java. Now Java provide the DES arithmetic in jce.jar. So we only work is provide the transformation.Please refer JavaDoc and Oracle forumThe function of the code that listed is same as oracle’s dbms_obfuscation_toolkit DES arithmeticpackage util;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec;import ng.ArrayUtils;public class Encryption {private Cipher en;private Cipher de;public byte[] encrypt(String s) {try {byte[] data = s.getBytes("SJIS");if (data.length % 8 != 0) {int length = 8 - data.length % 8;byte[] spaces = new byte[length];for (int i = 0; i < spaces.length; i++) {spaces[i] = 0x20;}data = ArrayUtils.addAll(data, spaces);}return en.doFinal(data);} catch (Exception e) {throw new RuntimeException(e);}}public String decrypt(byte[] b) {try {byte[] data = de.doFinal(b);return new String(data, "SJIS").trim();} catch (Exception e) {throw new RuntimeException(e);}}private Encryption() {try {DESKeySpec deskey = new DESKeySpec("12345678".getBytes());SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");SecretKey key = skf.generateSecret(deskey);IvParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });en = Cipher.getInstance("DES/CBC/NoPadding");en.init(Cipher.ENCRYPT_MODE, key, iv);de = Cipher.getInstance("DES/CBC/NoPadding");de.init(Cipher.DECRYPT_MODE, key, iv);} catch (Exception e) {throw new RuntimeException(e);}}private static Encryption instance = new Encryption();public static Encryption getInstance() {return instance;}}Ok. I will create a column that will mapped to Hibernate. The type of the column should be RAW!VARCHAR2 is not a good choice, actually VARCHAR2 does not work with encrypted column , because can not get the correct encrypted data from VARCHAR2 type.CREATE TABLE ZENCRYPT(ID VARCHAR2(32CHAR)NOT NULL,ENCRYPT RAW(32))Then we will define a Hibernate UseType, this make encrypt and decrypt more transparent.package usertype;import java.io.Serializable;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import org.hibernate.HibernateException;import erType;import util.Encryption;public class EncryptType implements UserType {public Object assemble(Serializable cached, Object owner) throws HibernateException {return null;}public Object deepCopy(Object value) throws HibernateException {if (value == null) {return null;} else {return new String((String) value);}}public Serializable disassemble(Object value) throws HibernateException {return null;}public boolean equals(Object x, Object y) throws HibernateException {return (x == y) || (x != null && y != null && (x.equals(y)));}public int hashCode(Object x) throws HibernateException { return x.hashCode();}public boolean isMutable() {return false;}public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { //Get bin data from database then decrypt to Stringbyte[] data = rs.getBytes(names[0]);return Encryption.getInstance().decrypt(data);}public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {if (value == null) {return;}//Encrypt String to bin databyte data[] = Encryption.getInstance().encrypt(value.toString());st.setBytes(index, data);}public Object replace(Object original, Object target, Object owner) throws HibernateException {return null;}public Class returnedClass() {return ng.String.class;}public int[] sqlTypes() {return new int[] { Types.BINARY };}}Mapping file<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="entity.ZEncrypt" table="ZENCRYPT"><id name="ids" type="string"><column name="ID" /><generator class="assigned" /></id><property name="encrypt" type="usertype.EncryptType"> <column name="ENCRYPT" /></property></class></hibernate-mapping>。

java实现DES加密解密算法

java实现DES加密解密算法

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的输出结果。

在通信⽹络的两端,双⽅约定⼀致的Key,在通信的源点⽤Key对核⼼数据进⾏DES加密,然后以密码形式在公共通信⽹(如电话⽹)中传输到通信⽹络的终点,数据到达⽬的地后,⽤同样的 Key对密码数据进⾏解密,便再现了明码形式的核⼼数据。

这样,便保证了核⼼数据(如PIN、MAC等)在公共通信⽹中传输的安全性和可靠性。

通过定期在通信⽹络的源端和⽬的端同时改⽤新的Key,便能更进⼀步提⾼数据的保密性,这正是现在⾦融交易⽹络的流⾏做法。

下⾯是具体代码:(切记切记字符串转字节或字节转字符串时⼀定要加上编码,否则可能出现乱码)1import java.io.IOException;2import java.security.SecureRandom;34import javax.crypto.Cipher;5import javax.crypto.SecretKey;6import javax.crypto.SecretKeyFactory;7import javax.crypto.spec.DESKeySpec;89import sun.misc.BASE64Decoder;10import sun.misc.BASE64Encoder;1112/**13 * DES加密解密算法14 *15 * @author lifq16 * @date 2015-3-17 上午10:12:1117*/18public class DesUtil {1920private final static String DES = "DES";21private final static String ENCODE = "GBK";22private final static String defaultKey = "test1234";2324public static void main(String[] args) throws Exception {25 String data = "测试ss";26// System.err.println(encrypt(data, key));27// System.err.println(decrypt(encrypt(data, key), key));28 System.out.println(encrypt(data));29 System.out.println(decrypt(encrypt(data)));3031 }3233/**34 * 使⽤默认key 加密35 *36 * @return String37 * @author lifq38 * @date 2015-3-17 下午02:46:4339*/41byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));42 String strs = new BASE64Encoder().encode(bt);43return strs;44 }4546/**47 * 使⽤默认key 解密48 *49 * @return String50 * @author lifq51 * @date 2015-3-17 下午02:49:5252*/53public static String decrypt(String data) throws IOException, Exception {54if (data == null)55return null;56 BASE64Decoder decoder = new BASE64Decoder();57byte[] buf = decoder.decodeBuffer(data);58byte[] bt = decrypt(buf, defaultKey.getBytes(ENCODE));59return new String(bt, ENCODE);60 }6162/**63 * Description 根据键值进⾏加密64 *65 * @param data66 * @param key67 * 加密键byte数组68 * @return69 * @throws Exception70*/71public static String encrypt(String data, String key) throws Exception {72byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));73 String strs = new BASE64Encoder().encode(bt);74return strs;75 }7677/**78 * Description 根据键值进⾏解密79 *80 * @param data81 * @param key82 * 加密键byte数组83 * @return84 * @throws IOException85 * @throws Exception86*/87public static String decrypt(String data, String key) throws IOException,88 Exception {89if (data == null)90return null;91 BASE64Decoder decoder = new BASE64Decoder();92byte[] buf = decoder.decodeBuffer(data);93byte[] bt = decrypt(buf, key.getBytes(ENCODE));94return new String(bt, ENCODE);95 }9698 * Description 根据键值进⾏加密99 *100 * @param data101 * @param key102 * 加密键byte数组103 * @return104 * @throws Exception105*/106private static byte[] encrypt(byte[] data, byte[] key) throws Exception { 107// ⽣成⼀个可信任的随机数源108 SecureRandom sr = new SecureRandom();109110// 从原始密钥数据创建DESKeySpec对象111 DESKeySpec dks = new DESKeySpec(key);112113// 创建⼀个密钥⼯⼚,然后⽤它把DESKeySpec转换成SecretKey对象114 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); 115 SecretKey securekey = keyFactory.generateSecret(dks);116117// Cipher对象实际完成加密操作118 Cipher cipher = Cipher.getInstance(DES);119120// ⽤密钥初始化Cipher对象121 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);122123return cipher.doFinal(data);124 }125126/**127 * Description 根据键值进⾏解密128 *129 * @param data130 * @param key131 * 加密键byte数组132 * @return133 * @throws Exception134*/135private static byte[] decrypt(byte[] data, byte[] key) throws Exception { 136// ⽣成⼀个可信任的随机数源137 SecureRandom sr = new SecureRandom();138139// 从原始密钥数据创建DESKeySpec对象140 DESKeySpec dks = new DESKeySpec(key);141142// 创建⼀个密钥⼯⼚,然后⽤它把DESKeySpec转换成SecretKey对象143 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); 144 SecretKey securekey = keyFactory.generateSecret(dks);145146// Cipher对象实际完成解密操作147 Cipher cipher = Cipher.getInstance(DES);148149// ⽤密钥初始化Cipher对象150 cipher.init(Cipher.DECRYPT_MODE, securekey, sr);151152return cipher.doFinal(data);153 }。

DES加密解密算法的实现

DES加密解密算法的实现

DES加密解密算法的实现DES(Data Encryption Standard)是一种对称加密算法,用于加密和解密数据。

其基本原理是通过使用密钥将明文数据转换为密文数据,并使用相同的密钥将密文数据还原为明文数据。

DES算法采用了分组加密的方式,将明文数据分为固定大小的数据块,并对每个数据块进行加密。

DES算法的实现包括了三个主要步骤:初始置换、16轮迭代加密和最终置换。

下面将详细介绍DES加密解密算法的实现步骤。

1. 初始置换(Initial Permutation):初始置换是将明文数据进行重排,以增加加密的随机性。

它通过将明文数据按照规定的顺序排列成新的数据,作为加密的初始输入。

2. 16轮迭代加密(16 Rounds of Iterative Encryption):DES算法将明文数据进行16轮的迭代加密。

每一轮加密包括了四个主要步骤:逐位扩展(Expansion Permutation)、密钥混淆(Key Mixing)、S盒替代和P盒置换。

- 逐位扩展(Expansion Permutation):逐位扩展将32位的数据扩展为48位的数据,以提供更高的密钥强度,并增加加密的随机性。

- 密钥混淆(Key Mixing):密钥混淆是将48位的数据与密钥进行异或运算,以增加加密的复杂性。

- S盒替代(S-Box Substitution):S盒替代是将48位的数据分成8个6位的数据块,并根据S盒中预先定义的替代规则进行替代。

S盒替代是DES算法的核心步骤,它对密文数据进行非线性转换,增加了加密的强度。

- P盒置换(P-Box Permutation):P盒置换是将32位的数据按照规定的顺序进行重排,以增加加密的随机性。

3. 最终置换(Final Permutation):最终置换是将经过16轮迭代加密后的数据进行一个最终的变换,以得到加密的最终输出。

最终置换和初始置换相反,将经过加密处理的数据重新排列成最终输出。

DES加密算法的JAVA实现

DES加密算法的JAVA实现

目录摘要 (3)一、目的与意义 (4)二、DES概述 (5)三、DES加解密算法原理 (7)1.加密 (6)2.子密钥生成 (11)3.解密 (13)四、加解密算法的实现 (14)1.软件版本 (14)2.平台 (14)3.源代码 (14)4.运行结果 (24)五、总结 (25)【摘要】1973年5月15 日,美国国家标准局(现在的美国国家标准就是研究所,即NIST)在联邦记录中公开征集密码体制,这一举措最终导致了数据加密标准(DES)的出现,它曾经成为世界上最广泛使用的密码体制。

DES由IBM开发,它是早期被称为Lucifer体制的改进。

DES在1975年3月17日首次在联邦记录中公布,在经过大量的公开讨论后,1977年2月15日DES被采纳为“非密级”应用的一个标准。

最初预期DES作为标准只能使用10~15年;然而,事实证明DES要长寿得多。

被采纳后,大约每隔5年就被评审一次。

DES的最后一次评审是在1999年1月。

本文阐述了DES发展现状及对网络安全的重要意义,并在此基础上对DES算法原理进行详细的介绍和分析。

通过应用DES算法加解密的具体实现,进一步加深对DES算法的理解,论证了DES算法具有加密快速且强壮的优点,适合对含有大量信息的文件进行加密,同时分析了DES算法密钥过短(56位)所带来的安全隐患。

【关键词】DES 加密解密明文密文一、目的与意义随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。

信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。

现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。

在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。

密码学的神秘面纱从此被揭开。

二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。

DES加密解密算法的实现(Java基本要求)

DES加密解密算法的实现(Java基本要求)

成都信息工程学院课程设计报告DES加密解密算法的实现(Java)课程名称:应用密码算法程序设计学生姓名:李文浩学生学号: 2007122054专业班级:信安072班任课教师:万武南2009年 11 月 11 日附件:课程设计成绩评价表目录1.引言 (1)1.1 背景 (1)1.2 目的 (1)1.3 本设计的主要任务 (1)2.系统设计 (2)2.1系统主要目标 (2)2.1.1主要软件需求(运行环境) (2)2.2 系统结构 (2)2.2.2 软件操作流程 (2)2.2.3功能模块 (3)3 系统功能程序设计 (3)3.1循环移位 (3)3.2获取RoundKey (4)3.3 IP置换,逆置换,E扩展,置换P (5)3.4 Fnew函数(F函数) (5)3.5异或 (7)3.6 S盒代替 (7)3.7十六进制转二进制 (7)3.8二进制转十六进制 (8)3.9加密 (9)3.10解密 (9)3.11程序界面预览 (10)4. 测试报告 (11)5.结论 (14)参考文献 (14)1.引言1.1 背景数据加密标准(Data Encryption Standard,,DES)曾被美国国家标准局(NBS,现为国家标准与技术研究所NIST)确定为联邦信息处理标准(FIPS PUB 46),得到过广泛使用,特别是在金融领域,曾是对称密码体制事实上的世界标准。

目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS,A TM,智能卡,加油站,高速公路收费站等领域被广泛使用,以此来实现关键数据加密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

DES起源于1973年美国国家标准局NBS征求国家密码标准方案。

IBM就提交了其在20世纪60年代末设立的一个计算机密码编码学方面的研究项目的结果,这个项目在1971年结束时研制出了一种称为Lucifer算法。

Java实现DES加解密算法解析

Java实现DES加解密算法解析

Java实现DES加解密算法解析本⽂实例讲述了Java实现DES加解密算法解析。

分享给⼤家供⼤家参考,具体如下:简介:数据加密算法(Data Encryption Algorithm,DEA)是⼀种对称加密算法,很可能是使⽤最⼴泛的密钥系统,特别是在保护⾦融数据的安全中,最初开发的DEA是嵌⼊硬件中的。

通常,⾃动取款机(Automated Teller Machine,ATM)都使⽤DEA。

它出⾃IBM的研究⼯作,IBM也曾对它拥有⼏年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使⽤费⽽使⽤。

1977年被美国政府正式采纳。

1998年后实⽤化DES破译机的出现彻底宣告DES算法已不具备安全性,1999年NIST颁布新标准,规定DES算法只能⽤于遗留加密系统,但不限制使⽤DESede算法。

当今DES算法正是推出历史舞台,AES算法称为他的替代者。

加密原理:DES 使⽤⼀个 56 位的密钥以及附加的 8 位奇偶校验位,产⽣最⼤ 64 位的分组⼤⼩。

这是⼀个迭代的分组密码,使⽤称为Feistel 的技术,其中将加密的⽂本块分成两半。

使⽤⼦密钥对其中⼀半应⽤循环功能,然后将输出与另⼀半进⾏“异或”运算;接着交换这两半,这⼀过程会继续下去,但最后⼀个循环不交换。

DES 使⽤ 16 个循环,使⽤异或,置换,代换,移位操作四种基本运算。

JDK对DES算法的⽀持密钥长度:56位⼯作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128填充⽅式:Nopadding/PKCS5Padding/ISO10126Padding/Java 加密解密之对称加密算法DESedeDESede 即三重DES加密算法,也被称为3DES或者Triple DES。

使⽤三(或两)个不同的密钥对数据块进⾏三次(或两次)DES 加密(加密⼀次要⽐进⾏普通加密的三次要快)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

成都信息工程学院课程设计报告DES加密解密算法的实现(Java)课程名称:应用密码算法程序设计学生姓名:李文浩学生学号: 2007122054专业班级:信安072班任课教师:万武南2009年 11 月 11 日附件:课程设计成绩评价表目录1.引言 (1)1.1 背景 (1)1.2 目的 (1)1.3 本设计的主要任务 (1)2.系统设计 (2)2.1系统主要目标 (2)2.1.1主要软件需求(运行环境) (2)2.2 系统结构 (2)2.2.2 软件操作流程 (2)2.2.3功能模块 (3)3 系统功能程序设计 (3)3.1循环移位 (3)3.2获取RoundKey (4)3.3 IP置换,逆置换,E扩展,置换P (5)3.4 Fnew函数(F函数) (5)3.5异或 (7)3.6 S盒代替 (7)3.7十六进制转二进制 (7)3.8二进制转十六进制 (8)3.9加密 (9)3.10解密 (9)3.11程序界面预览 (10)4. 测试报告 (11)5.结论 (14)参考文献 (14)1.引言1.1 背景数据加密标准(Data Encryption Standard,,DES)曾被美国国家标准局(NBS,现为国家标准与技术研究所NIST)确定为联邦信息处理标准(FIPS PUB 46),得到过广泛使用,特别是在金融领域,曾是对称密码体制事实上的世界标准。

目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS,A TM,智能卡,加油站,高速公路收费站等领域被广泛使用,以此来实现关键数据加密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

DES起源于1973年美国国家标准局NBS征求国家密码标准方案。

IBM就提交了其在20世纪60年代末设立的一个计算机密码编码学方面的研究项目的结果,这个项目在1971年结束时研制出了一种称为Lucifer算法。

它是当时提出来的最好的算法,因而在1977年被选为数据加密标准,有效期为5年,随后在1983年、1987年、和1993年三次再度授权该算法续用5年。

DES使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。

这是一个迭代的分组密码,使用称为Feistel 的技术,其中将加密的文本块分成两半。

使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。

DES 使用16 个循环。

1.2 目的在一些特殊场合,人们交换信息并不希望被其他人知道,需要把消息进行一系列转换后在公共信道中传输,接收方再通过一些手段将消息转换回来,本程序用DES对称密钥加密算法加解密一组长度为64bit的十六进制数,达到保密传递信息的目的.1.3 本设计的主要任务根据DES加密算法实现一组长度为64bit的十六进制数加密解密。

向用户提供良好的交互,具有良好的操作性。

可完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值。

2.系统设计2.1系统主要目标2.1.1主要软件需求(运行环境)本软件适用java语言编写,编译成功后的.class文件可以在装有JDK开发环境的任何计算机上使用。

本软件设计符合DES程序设计基本要求:(1)在深入理解DES加密/解密算法理论的基础上,设计一个DES加密/解密软件系统;(2)完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;(3)程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;(4)要求提供所设计系统的报告及完整的软件。

输入:加密:8字节定长的十六进制明文(16个十六进制数)。

解密:8字节定长的十六进制密文(16个十六进制数)。

输出:加密:8字节定长的十六进制已加密的密文(16个十六进制数)。

解密:8字节定长的十六进制的正常解密的明文(16个十六进制数)。

测试平台:Windows Vista Home Basic/Windows XP Professional2.2 系统结构2.2.2 软件操作流程加密:(1)按提示选择“1”进行加密过程,程序将正常执行下面的加密过程。

(2)按提示输入你加密所需要的长度为16个十六进制的密钥。

(3)按提示输入你要加密的长度为16个十六进制的明文。

(4)加密后,每轮加密结果和最终加密结果(即密文)将显示给用户。

解密:(1)按提示选择“0”进行解密过程,程序将正常执行下面的解密过程。

(2)按提示输入你解密所需要的长度为16个十六进制的密钥。

(3)按提示输入你要解密的长度为16个十六进制的密文。

(4)解密后,每轮解密的结果和最终解密出的明文将显示给用户。

2.2.3功能模块3 系统功能程序设计3.1循环移位实现循环移位,由于DES算法涉及到得只有循环左移一位或者两位,我考虑用穷举的方法,因为只有两种情况,因此用if条件语句判断每轮循环的位数。

我定义了4个中间变量co,do,c1,d1存放中间结果。

V oid LwhDES::LeftBitMove(int[] k, int offset){int i;// 循环移位操作函数int[] c0 = new int[28];int[] d0 = new int[28];int[] c1 = new int[28];int[] d1 = new int[28];for (i = 0; i < 28; i++){c0[i] = k[i];d0[i] = k[i + 28];}if (offset == 1) {for (i = 0; i < 27; i++) { // 循环左移一位c1[i] = c0[i + 1];d1[i] = d0[i + 1];}c1[27] = c0[0];d1[27] = d0[0];}else if (offset == 2) {for (i = 0; i < 26; i++) { // 循环左移两位c1[i] = c0[i + 2];d1[i] = d0[i + 2];}c1[26] = c0[0];d1[26] = d0[0];c1[27] = c0[1];d1[27] = d0[1];}for (i = 0; i < 28; i++) {k[i] = c1[i];k[i + 28] = d1[i];}}3.2获取RoundKey生成轮子密钥前调用了PC1变换函数,循环过程中调用了循环移位函数和PC2变换函数,最终生成了KeyArray[16][48]的轮子密钥。

int[][] LwhDES::KeyInitialize(int[] key){int i;int j;int[][] keyarray=new int[16][48];int[] K0 = new int[56];for (i = 0; i < 56; i++) {K0[i] = key[PC_1[i] - 1]; // 密钥进行PC-1变换}for (i = 0; i < 16; i++) {LeftBitMove(K0, LeftMove[i]);for (j = 0; j < 48; j++) {keyarray[i][j] = K0[PC_2[j] - 1]; // 生成子密钥keyarray[i][j]}}return keyarray;}3.3 IP置换,逆置换,E扩展,置换P置换使用的是简单的查表置换,table置换,即将输出的数据与输入的数据相应的数组的对应项查出来。

IP置换:for (i = 0; i < 64; i++){M[i] = timeData[IP[i] - 1]; // 明文IP变换,IP[]为IP置换表……}IP逆置换:for (i = 0; i < 64; i++){MIP_1[i] = M[IP_1[i] - 1]; // 进行IP-1运算,IP_1[]为IP逆置换表……}E扩展:for (i = 0; i < 48; i++) {RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位}置换P:for (i = 0; i < 32; i++){RP[i] = sV alue[P[i] - 1]; // 经过P变换,P[]为P置换表……}3.4 Fnew函数(F函数)F函数为该加密程序最关键的地方,里面涉及到E扩展,与密钥异或,S盒压缩,P置换,每轮都要使用此函数,此函数编写的好坏很大程度上影响整个程序的执行效率。

注意,此处的Fnew函数与标准F函数略有不同,Fnew函数将F函数后Lo,Ro的异或和换位都已经实现。

V oid LwhDES::private void LoopF(int[] M, int times, int flag, int[][] keyarray){int i,j;int[] L0 = new int[32];int[] R0 = new int[32];int[] L1 = new int[32];int[] R1 = new int[32];int[] RE = new int[48]; //存放经过E扩展的消息int[][] S = new int[8][6]; //存放成8行六列,以便进行S盒压缩int[] sBoxData = new int[8]; //每一行查出的数int[] sV alue = new int[32]; //int[] RP = new int[32]; //经过置换P的数for (i = 0; i < 32; i++) {L0[i] = M[i]; // 明文左侧的初始化R0[i] = M[i + 32]; // 明文右侧的初始化}for (i = 0; i < 48; i++) {RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位RE[i] = RE[i] + keyarray[times][i]; // 与KeyArray[times][i]按位作不进位加法运算if (RE[i] == 2) { //与48位密钥异或RE[i] = 0;}}for (i = 0; i < 8; i++) { // 48位分成8组for (j = 0; j < 6; j++) { /每组六位S[i][j] = RE[(i * 6) + j];}// 下面经过S盒,得到8个数sBoxData[i] = S_Box [i] [(S[i][0] << 1) + S[i][5]] [ (S[i][1] << 3) + (S[i][2] << 2) + (S[i][3] << 1) + S[i][4] ];// 8个数变换输出二进制for (j = 0; j < 4; j++) {sV alue[((i * 4) + 3) - j] = sBoxData[i] % 2; //从右边一位一位的取数存放sBoxData[i] = sBoxData[i] / 2;}}for (i = 0; i < 32; i++) {RP[i] = sV alue[P[i] - 1]; // 经过P变换L1[i] = R0[i]; // 右边移到左边R1[i] = L0[i] + RP[i];if (R1[i] == 2) { //异或R1[i] = 0;}// 重新合成M,返回数组M// 最后一次变换时,左右不进行互换。

相关文档
最新文档