package com.ivan.security.algorithm;
/**
* 对字符流进行对称的DES加密
* @author Ivan
* @DataTime 2006-12-11 12:34
*
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.iuxi.security.util.*;
public class DESUtil ...{
private static String Algorithm = "DESede"; //"DESede" for Triple DES
private static KeyGenerator keyGen = null;
private static SecretKey desKey = null;
private static Cipher c = null;
private static byte[] cipherByte = null;
public DESUtil() ...{
init();
}
public static void init() ...{
try ...{
c = Cipher.getInstance(Algorithm);
} catch (NoSuchAlgorithmException e) ...{
System.err.println("初始化错误,原因:所指定的算法无效!");
e.printStackTrace();
} catch (NoSuchPaddingException e) ...{
e.printStackTrace();
}
}
public static String getAlgorithm() ...{
return Algorithm;
}
public static void setAlgorithm(String algorithm) ...{
DESUtil.Algorithm = algorithm;
}
public static void setDesKey (SecretKey desKey) ...{
DESUtil.desKey = desKey;
}
/** *//**
* 保存密钥信息到磁盘
* @param filepath 保存路径
* @return
*/
public static void saveKey(String filePath) ...{
if (desKey != null) ...{
try ...{
FileOutputStream fos = new FileOutputStream(filePath);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(desKey);
}catch (IOException e) ...{
System.err.println("保存密钥信息出错!");
e.printStackTrace();
}
}
else ...{
System.err.println("保存密钥失败,密钥不存在!");
}
}
/** *//**
* 从磁盘读取密钥信息
* @param filePath
* @return
*/
public static SecretKey readKey(String filePath) ...{
try ...{
FileInputStream fis = new FileInputStream(filePath);
fis = new FileInputStream(filePath);
ObjectInputStream ois = new ObjectInputStream(fis);
desKey = (SecretKey) ois.readObject();
ois.close();
fis.close();
}catch (FileNotFoundException e) ...{
System.err.println("读取密钥信息出错,原因:找不到指定的文件!");
} catch (IOException ex) ...{
System.err.println("读取密钥信息出错,原因:IO错误!");
ex.printStackTrace();
} catch (Exception ex) ...{
ex.printStackTrace();
}
return desKey;
}
/** *//**
* 按照指定的算法生成密钥
* @param algorithm 所指定的算法
* @return 生成的密钥
*/
public static SecretKey genKey (String algorithm) ...{
try ...{
keyGen = KeyGenerator.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) ...{
System.err.println("生成密钥失败,原因:所指定的算法无效!");
e.printStackTrace();
}
desKey = keyGen.generateKey();
return desKey;
}
/** *//**
* 加密已转化为字节串的字符流
* @param rawByte 原始字节串
* @return 加密后的字节串
*/
public static byte[] encryptData(byte[] rawByte) ...{
if(desKey != null) ...{
try ...{
c.init(Cipher.ENCRYPT_MODE, desKey);
cipherByte = c.doFinal(rawByte);
} catch (java.security.InvalidKeyException ex) ...{
System.err.println("加密失败,密钥无效!");
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) ...{
System.err.println("加密失败!");
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) ...{
System.err.println("加密失败!");
ex.printStackTrace();
} catch (Exception ex) ...{
System.err.println("加密失败!");
ex.printStackTrace();
}
}
else ...{
System.err.println("加密失败,原因:密钥不存在!");
}
return cipherByte;
}
/** *//**
* 解密字节串
* @param cipherByte 密文字节串
* @return 解密后的字节串
*/
public static byte[] decryptor(byte[] cipherByte) ...{
if(desKey != null) ...{
try ...{
c.init(Cipher.DECRYPT_MODE, desKey);
cipherByte = c.doFinal(cipherByte);
} catch (java.security.InvalidKeyException ex) ...{
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) ...{
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) ...{
ex.printStackTrace();
} catch (Exception ex) ...{
ex.printStackTrace();
}
return (cipherByte);
}
else ...{
System.err.println("解密失败,原因:密钥不存在!");
return null;
}
}
public static void main(String[] args) throws Exception ...{
DESUtil.init();
DESUtil.genKey("DESede");
DESUtil.saveKey("desKey.dat");
byte[] cipherData = DESUtil.encryptData("This is just a test!".getBytes());
String cipherString = new String(new BASE64Encoder().encode(cipherData));
System.out.println("密文数据为:" + cipherString);
byte[] cipherByte = new BASE64Decoder().decodeBuffer(cipherString);
String rawString = new String(DESUtil.decryptor(cipherByte));
System.out.println("解密后的原文为:" + rawString);
}
}
分享到:
相关推荐
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括 DES、3DES、AES 等。非对称加密算法采用加密钥匙(公钥)和解密钥匙(私钥),常用的算法包括 RSA、DSA、ECC 等。 在选择加密算法时,需要根据实际情况...
DES使用64位的密钥,对数据进行64次迭代操作,每轮迭代包括置换、异或等步骤,使得加密过程复杂且难以破解。加密后的DES信息是一个密文,对于外人来说几乎是不可读的,从而提高了数据的保密性。 在文件传输过程中,...
3. **加密操作**:调用`Cipher`对象的`init(Cipher.ENCRYPT_MODE, key)`方法初始化加密过程,然后使用`doFinal()`方法对文件数据进行加密,得到加密后的字节数组。 4. **解密操作**:与加密类似,先初始化`Cipher`...
在描述中提到的C++实现的DES加密解密算法,主要是针对TXT文本文件进行操作的。TXT文件是一种常见的文本格式,通常用于存储纯文本信息。DES算法在处理这种文件时,会将文件内容视为二进制数据流,然后按照64位的块...
在标题所提到的"对文件进行对称加密(源代码)"中,我们可以推测这是一段实现了对文件加密功能的程序代码。它可能支持用户选择不同的对称加密算法,例如AES,通过提供一个加密与解密的类,使得用户能够对任意类型的...
本文将深入探讨标题中提及的两种主要加密算法:DES(Data Encryption Standard)和RSA,并介绍如何利用它们对文件进行加密。我们将结合描述中的“提供了方便文件加密接口”来阐述如何在实际应用中实现这些加密方法。...
6. **解密过程**:使用相同的密钥和模式,对加密文件进行解密,恢复原始内容。 7. **安全存储密钥**:密钥的安全存储至关重要,因为一旦丢失或遗忘,加密的数据将无法恢复。 在实际应用中,由于DES的安全性限制,...
在给定的“des加密例程”中,可能包含了一个调用动态链接库(DLL)实现DES加密解密的示例代码。DLL是Windows操作系统中的一种共享库,可以被多个程序同时调用,节省内存资源并便于代码复用。这个示例可能涉及以下...
本篇文章将深入探讨如何使用C#语言实现DES对文件的加密和解密操作。 首先,了解DES算法的基础知识。DES是一种块加密算法,每个数据块大小为64位,实际用于加密的有效数据为56位,因为8位用于奇偶校验。它采用了一种...
DES是一种广泛使用的对称加密算法,它基于Feistel结构,以64位的数据块和64位的密钥进行操作。实验步骤如下: 1. **明文处理**:首先,从文件中读取明文,将其转换为ASCII码,再转换为比特流。每64位分为一组,不足...
在SQL Server中进行DES加密是保护敏感数据的一种常见方法,特别是在C#应用程序中与数据库交互时。DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥进行加密和解密,提供了一种相对快速的数据...
标题中的“3DES加密”指的是Triple DES(三重数据加密标准),它是一种广泛使用的对称加密算法,基于DES(Data Encryption Standard)并将其安全性增强了三倍。DES原本使用56位密钥,3DES通过三次独立的DES加密过程...
总的来说,DES加密算法是计算机科学中对称加密的经典例子,虽然在现代已不再作为主要加密标准,但它仍然是理解加密原理和学习密码学的重要教材。通过C++实现DES,不仅可以提升编程技能,还能增强对信息安全的理解。
通过对DES加密算法实验的学习,我们不仅掌握了对称加密算法的基本概念,还深入了解了DES算法的具体实现细节。这种理论与实践相结合的学习方式有助于加深对信息安全技术的理解,对于从事相关领域的技术人员来说尤为...
6. **执行D3DES**:首先用第一个密钥执行DES加密,然后用第二个密钥执行DES解密,最后再用第一个密钥进行一次DES加密。这个过程就是D3DES的核心。 7. **密文后处理**:加密完成后,对密文进行逆初始置换,得到最终...
【用C++6.0可直接使用】 1、DES算法工作的基本原理:DES是基于Feistel密码结构的分组密码,其 入口参数有三个:key、data、mode。...当模式为解密模式时,key用于对64位的密文分组进行解密,以 恢复明文。
这通常涉及读取文件内容,按块进行DES加密,然后将加密后的数据写回文件。 7. **解密过程**:与加密相反,解密是通过应用逆操作来恢复原始数据。源代码中应该包含对应的解密函数,使用相同的密钥和逆向操作还原数据...
DES加密需要在数据发送前进行,接收数据后进行解密,这通常涉及在socket编程中集成加密库,如OpenSSL。 4. **安全性和性能**:尽管DES由于其56位密钥的长度现在被认为是不够安全的,但通过三重DES(3DES)可以提高...
这个实现可能包含了密钥的处理、CBC模式的实现以及加密解密的核心逻辑,可以帮助我们理解和应用DES加密算法。然而,由于安全性的考虑,现在更推荐使用更强大的加密算法,如AES(Advanced Encryption Standard)。
DES对称加密 支持IOS,mac编译