DES加密算法的JAVA实现

合集下载

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算法提供CBC, OFB, CFB, ECB四种模式,MAC是基于ECB实现的。

一、数据补位DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节(通常补00或者FF,根据实际要求不同)进行计算,之后按照顺序将计算所得的数据连在一起即可。

这里有个问题就是为什么要进行数据补位?主要原因是DES算法加解密时要求数据必须为8个字节。

二、ECB模式DES ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

三、CBC模式DES CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。

其实现的机理如下:加密步骤如下:1)首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C24)之后的数据以此类推,得到Cn5)按顺序连为即为加密结果。

解密是加密的逆过程,步骤如下:)首先将数据按照8个字节一组进行分组得到2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D24)之后依此类推,得到Dn5)按顺序连为D1D2D3......Dn即为解密结果。

这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。

*** DES算法*/public class DES {/**** @return DES算法密钥*/public static byte[] generateKey() {try {// DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();// 生成一个DES算法的KeyGenerator对象KeyGenerator kg = KeyGenerator.getInstance("DES");kg.init(sr);// 生成密钥SecretKey secretKey = kg.generateKey();// 获取密钥数据byte[] key = secretKey.getEncoded();return key;} catch (NoSuchAlgorithmException e) {System.err.println("DES算法,生成密钥出错!");e.printStackTrace();}return null;}/*** 加密函数** @param data* 加密数据* @param key* 密钥* @return 返回加密后的数据*/public static byte[] encrypt(byte[] data, byte[] key) {try {// DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密匙工厂,然后用它把DESKeySpec转换成// 一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretKey = keyFactory.generateSecret(dks);// using DES in ECB modeCipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 用密匙初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);// 执行加密操作byte encryptedData[] = cipher.doFinal(data);return encryptedData;} catch (Exception e) {System.err.println("DES算法,加密数据出错!");e.printStackTrace();}return null;}/*** 解密函数** @param data* 解密数据* @param key* 密钥* @return 返回解密后的数据*/public static byte[] decrypt(byte[] data, byte[] key) {try {// DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();// byte rawKeyData[] = /* 用某种方法获取原始密匙数据*/;// 从原始密匙数据创建一个DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成// 一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks);// using DES in ECB modeCipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");// 用密匙初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);// 正式执行解密操作byte decryptedData[] = cipher.doFinal(data);return decryptedData;} catch (Exception e) {System.err.println("DES算法,解密出错。

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加密算法及其在Java中的实现

DES加密算法及其在Java中的实现
DES用56位密钥对64位的明文数据块进行加密 ,每次加密 可 以 对 64位 的 明 文 数 据 进 行 16轮 编 码 ,经 过 一 系 列 替 换 和 移 位 后,输出完全不同的64位密纹数据。 DES入口参数有3个:Key、 Data、Mode,其中Key为7个 字 节 共56位 (另 有8位 作 为 奇 偶 校 验 位,这样保证了明文与密钥长度的一致性 ),是DES算法的工作 密钥;Data为8位字节64位, 是要被加密或解密的数据;Mode为 DES的工作方式,由两种:加密、解密。 由于DES算法使用64位的 标准算法和逻辑运算、运算速度快、密钥产生容易,因此适合当 前大多数计算机上用软件方法实现, 同时也适用于专用芯片 上。
利 用 DES算 法 加 密 的 步 骤 如 下 : (1)生成一个安全密钥。 在加密或解密任何数据之前需要 有一个密钥。密钥是随同被加密的应用程序一起发布的一段数 据,密钥代码如下所示。 // 生成一个可信任的随机数源 Secure Random sr=new SecureRandom(); // 为我们选择的DES算法生成一个KeyGenerator对象 KeyGenerator kg=KeyGenerator.getInstance ("DES"); Kg.init(sr); // 生成密钥 Secret Key key=kg.generateKey(); // 将密钥数据保存为文件供以后使用, 其中key Filename 为保存的文件名 Util.writeFile (key Filename, key.getEncoded()); (2)加密数据 。 得到密钥之后 ,接 下 来 就 可以 用 它 加 密 数 据。 密钥加密原始数据如下所示。 // 产生一个可信任的随机数源 SecureRandom sr=new SecureRandom(); //从密钥文件key Filename中得到密钥数据 Byte rawKeyData[]=Util.readFile(key Filename); // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks=new DESKeySpec(rawKeyData); // 创建一个密钥工厂,然后用它把DESKeySpec转 换成Secret Key对象 SecretKeyFactory key Factory = SecretKeyFactory.getInstance ("DES"); Secret Key key=keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher=Cipher.getInstance("DES"); // 用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE,key,sr); // 通过读类文件获取需要加密的数据 Byte data []=Util.readFile(filename); // 执行加密操作

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)课程名称:应用密码算法程序设计学生姓名:李文浩学生学号: 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算法。

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是一种对称加密算法,它将明文划分为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实现

信息安全概论JAVA实现DES加密算法学号:********* 姓名:高玉林Java实现DES加密算法目录DES算法概述 (3)DES的加密过程 (4)DES算法细节 (4)DES的解密过程 (8)源代码与结果(使用Java实现) (9)源代码 (9)运行结果截图 (21)默认密钥(“这不是密码”) (21)用户自定义密钥(以“nuaasillydes”为例) (21)总结 (22)DES算法概述DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。

它是ANSI的数据加密算法和ISO的DEA-1,成为一个世界范围内的标准已经近30年。

尽管DES带有过去时代的特征,但是它很好的抵抗住了多年的密码分析,除可能的最强有力的敌手外,对其他的攻击仍是安全的。

DES是一个分组加密算法,它以64位为一组对数据进行加密。

64位一组的明文从算法的一端输入,64位的密文从另一端输出。

DES是一个对称算法:加密与解密用的是同一算法(除密钥编排不同以外)。

密钥的长度为56位,通常表示为64位的数,但是每个第八位都用作奇偶校验,可以忽略。

密钥可以是任意的56位的数,且可在任意的时候改变。

DES的整体结构为:DES的加密过程DES的加密过程如下。

(1)64位的密钥经子密钥产生算法产生出16个子密钥K1,K2,……,K16,分别供第1次,第2次,……,第16次加密迭代使用。

(2)64位明文首先经过初始置换IP(Initial Permutation),将数据打乱重新排列并分成左右两半。

左边32位构成L,右边32为构成R。

(3)由加密函数f实现子密钥k1对R0的加密,结果得到32位的数据组f(R0,K1)。

F(R0,K1)再与L0异或,又得到一个32位的数据组L0➕f(R0,K1)。

以L0➕f(R0,K1)作为第2次加密迭代的R1,以R0作为第2次加密迭代的L1。

至此,第1次加密迭代结束。

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

目录摘要 (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(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。

在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。

而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。

虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DES(DoubleDES,DDES)和三重DES(Triple DES,TDES)。

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

DES加密体制是ISO颁布的数据加密标准。

因此研究DES还是有非常重要的意义。

二、DES概述DES的前身是IBM的Lucifer算法,后经美国联邦采用这个算法后更名为数据加密标准。

DES是一种块加密算法,每块长64比特。

DES的密钥长度也是64比特,但由于其中的8,16,24,32,48,56,64为作为奇偶校验位,所以实际的密钥只有56比特。

DES利用了香农提出的混淆和扩散的概念。

DES共有16论,每一轮都进行混淆和扩散。

DES主要有三个步骤:(1)利用初始置换函数IP对64比特明文块进行初始置换。

将初始置换的输出分成联邦,分别表示为左明文L0和右明文R0。

(2)进行16次迭代,迭代规则如下:L i=R i,R i=L i-1⊕f(R i-1,K i)。

其中L i和R i分别表示第i轮的左半部和右半部。

f()是运算函数,K i是长为48位的子密钥。

子密钥K1,K2,……,K16是根据56比特的密钥K计算而来的。

(3)对比特串R16L16使用逆置换IP-1得到密文。

在DES被提出时,曾出现过很多批评,其中之一就是针对S盒。

DES里的所有计算,除了S盒,全是线性的也就是说,计算两个输出的异或与先将两个对应输入异或再计算其输出是相同的。

作为非线性部分,S盒对密码体制的安全性至关重要。

在DES刚提出时就有人怀疑S盒里隐藏了“陷门(trapdoor)”,而美国国家安全局能够轻易的解密消息。

当然,无法否定这样的猜测,但到目前为止也没有任何证据能证明DES里有陷门。

事实上,后来表明DES里的S盒是被设计来防止模型攻击的。

对DES最中肯的批评是,密钥空间的规模是256,对实际安全而言确实太小了。

对于穷举法,一台每毫秒执行一次DES加密的计算机需要一千年才能破解密文。

然而,早在1977年Diffie和Hellman就指出,若用现有技术造一台并行机,它带有1百万个加密机,每个加密机都可以每毫秒执行一次DES 加密,那么穷举时间大约10小时。

他们估计这台计算机造价两千万。

1998年7月当EFF(Electronic Frontier Foundation)宣布一台造价不到25万美元、为特殊目的设计的“DES破译机”破译了DES时,DES终于被清楚地证明是不安全的。

三、DES算法加解密原理DES算法由加密、子密钥和解密的生成三部分组成。

现将DES算法介绍如下。

1.加密DES算法处理的数据对象是一组64比特的明文串。

设该明文串为m=m1m2…m64 (mi=0或1)。

明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。

其加密过程图示如下:DES算法加密过程对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下:IP58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 7该比特串被分为32位的L0和32位的R0两部分。

R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。

运算规则为:f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。

L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。

最后生成R16和L16。

其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。

R16与L16合并成64位的比特串。

值得注意的是R16一定要排在L16前面。

R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下:IP-1 40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25经过置换IP-1后生成的比特串就是密文e.。

变换f(Ri-1,Ki):它的功能是将32比特的输入再转化为32比特的输出。

其过程如图所示:f变换说明:输入Ri-1(32比特)经过变换E(扩展置换E)后,膨胀为48比特。

膨胀后的比特串的下标列表如下:E: 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1膨胀后的比特串分为8组,每组6比特。

各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。

该32比特经过P变换(压缩置换P)后,其下标列表如下:P: 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 13 30 6 22 11 4 25经过P变换后输出的比特串才是32比特的f(Ri-1,Ki).S盒的变换过程: 任取一S盒。

见图:在其输入b1,b2,b3,b4,b5,b6中,计算出x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再从Si表中查出x 行,y 列的值Sxy。

将Sxy化为二进制,即得Si盒的输出。

(S表如图所示)以上是DES算法加密原理加密过程实现(JAVA主要源代码)●输入64位明文串,经过IP置换:for (i = 0; i < 64; i++) {M[i] = timeData[IP[i] - 1];}●迭代(由于各次迭代的方法相同只是输入输出不同,因此以任意一次为例):首先进行S盒的运算。

输入32位比特串, 经过E变换,由32位变为48位:for (i = 0; i < 48; i++) {RE[i] = R0[E[i] - 1];与keyarray[times][i]按位作不进位加法运:RE[i] = RE[i] + keyarray[times][i];if (RE[i] == 2) {RE[i] = 0;}48位分成8组:for(i=0;i<8;i++){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++) {sValue[((i * 4) + 3) - j] = sBoxData[i] % 2;sBoxData[i] = sBoxData[i] / 2;}经过P变换:RP[i] = sValue[P[i] - 1];至此,S盒运算完成左右交换:L1[i] = R0[i];R1[i] = L0[i] + RP[i];Ri为Li-1与f(R,K)进行不进位二进制加法运算结果:R1[i] = L0[i] + RP[i];if (R1[i] == 2) {R1[i] = 0; }各次迭代类似,可以依此类推。

相关文档
最新文档