24小时热门版块排行榜    

查看: 334  |  回复: 1
当前主题已经存档。

modigfkl

铁虫 (初入文坛)


[资源] 关于DES对称加密及参考程序

对称加密的原理是加密和解密使用的是同一个密钥,用P表示明文,K表示加密密钥,M表示加密算法,E表示密文,则有如下规则成立: E = MK(P); P = MK(E);
就是明文加密以后成为密文,密文加密以后成为明文。
附件是一个插入盐值的对称加密的源文件,以下是在本人计算机上操作实例,供参考。
F:\>javac FileEncryptorDES.java 创建密钥,用密码wuqingping加密密钥
F:\>java FileEncryptorDES -c wuqingping 正在产生 DES 密钥...... 密钥产生完毕!
F:\>dir *.bin 驱动器 F 中的卷是 DATA 卷的序列号是 884F-8D43 F:\ 的目录 2005-08-19 13:24 24 DESkey.bin 1 个文件 24 字节 0 个目录 3,076,030,464 可用字节 用密钥加密文件,
需要输入密钥的保护密码 F:\>java FileEncryptorDES -e wuqingping FileEncryptorDES.java FileEncryptorDES.java.en
正在装载密钥..... 已经正确装载密钥!
正在初始化安全随机数....... 初始化Cipher...... 正在加密输入的指定文件...... 用密钥解密文件,
需要输入密钥的保护密码 F:\>java FileEncryptorDES -d wuqingping FileEncryptorDES.java.en FileEncryptorDES.java.de
正在装载密钥...... 已经正确装载密钥!
初始化Cipher...... 正在解密指定的文件...... F:\>dir File*DES.* 驱动器 F 中的卷是 DATA 卷的序列号是 884F-8D43
F:\ 的目录 2005-08-19 13:23 5,326 FileEncryptorDES.java 2005-08-19 13:24 3,968 FileEncryptorDES.class 2005-08-19 13:25 5,328 FileEncryptorDES.java.en 2005-08-19 13:25 5,326 FileEncryptorDES.java.de 5 个文件
25,278 字节 0 个目录 3,075,981,312 可用字节
输入错误的保护密码的例子(即没有权限使用该密钥):

F:\>java FileEncryptorDES -e errorpass FileEncryptorDES.java FileEncryptorDES.java.en 正在装载密钥..... Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_h.b(DashoA6275) at com.sun.crypto.provider.SunJCE_h.b(DashoA6275)
at com.sun.crypto.provider.SunJCE_ae.b(DashoA6275)
atcom.sun.crypto.provider.PBEWithMD5AndDESCipher.engineDoFinal(DashoA6275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at FileEncryptorDES.loadKey(FileEncryptorDES.java:97)
at FileEncryptorDES.encrypt(FileEncryptorDES.java:110)
at FileEncryptorDES.main(FileEncryptorDES.java:26)
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

modigfkl

铁虫 (初入文坛)


例程
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
// 采用对称加密方式,使用56位的DES密钥,密钥文件以加密方式保存于本地文件系统
public class FileEncryptorDES
{
private static String KEY_FILENAME="DESkey.bin"; //保存在本地文件系统的密钥文件名
private static int ITERATIONS=1000;
public static void main (String[] args) throws Exception
{
if ((args.length < 2) || (args.length > 4))
{
System.err.println("Usage: java FileEncryptorDES -c|-e|-d password [inputfile] [outputfile]"; System.exit(1);
} // 把密码保存到数组中

char[] password = new char[args[1].length()];
args[1].getChars(0, args[1].length(), password, 0);
if ("-c".equals(args[0])) createKey(password);
else if ("-e".equals(args[0])) encrypt(password, args[2], args[3]);
else if ("-d".equals(args[0])) decrypt(password, args[2], args[3]);
} //创建56位DES密钥并保存在文件系统中,文件名为
$KEY_FILENAME private static void createKey(char[] password) throws Exception { System.out.println("正在产生 DES 密钥......";
// 创建 DES 密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES";
keyGenerator.init(56);
Key key = keyGenerator.generateKey(); System.out.println("密钥产生完毕!"; // 用密码加密密钥

byte[] salt = new byte[8]; SecureRandom random = new SecureRandom(); random.nextBytes(salt); // 创建基于密码的加密

PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES";
SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, ITERATIONS);
Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES";
cipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); // 密钥加密
byte[] encryptedKeyBytes = cipher.doFinal(key.getEncoded()); // 把加密以后的密钥写入文件
FileOutputStream fos = new FileOutputStream(KEY_FILENAME);
fos.write(salt); fos.write(encryptedKeyBytes);
fos.close();
} //从文件系统密钥文件中取出密钥
private static Key loadKey(char[] password) throws Exception
{
// 读取加密的密钥文件的内容
FileInputStream fis = new FileInputStream(KEY_FILENAME);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = 0;
while ((i=fis.read()) != -1) { baos.write(i); } fis.close();
byte[] saltAndKeyBytes = baos.toByteArray();
baos.close(); // 从开始的8个字节获取盐值
byte[] salt = new byte[8];
System.arraycopy(saltAndKeyBytes,0,salt,0,; // 读取剩下的加密的密钥内容
int length = saltAndKeyBytes.length - 8; byte[] encryptedKeyBytes = new byte[length];
System.arraycopy(saltAndKeyBytes,8,encryptedKeyBytes,0,length); // 创建基于密码的加密
PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES";
SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, ITERATIONS);
Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES";
cipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec); // 解密加密的密钥
byte[] decryptedKeyBytes = cipher.doFinal(encryptedKeyBytes); // 从密钥内容中还原出密钥并返回
SecretKeySpec key = new SecretKeySpec(decryptedKeyBytes, "DES";
return key;
} //从文件系统中装载DES密钥(需要给出正确的保护密码),并加密一个文件

private static void encrypt(char[] password, String fileInput, String fileOutput) throws Exception {
System.out.println("正在装载密钥.....";
Key key = loadKey(password); System.out.println("已经正确装载密钥!";
// 创建Cipher,并用装载的密钥初始化
Cipher cipher = Cipher.getInstance("DES";
System.out.println("正在初始化安全随机数.......";
FileInputStream fis = new FileInputStream(fileInput);
FileOutputStream fos = new FileOutputStream(fileOutput);
System.out.println("初始化Cipher......";
cipher.init(Cipher.ENCRYPT_MODE, key);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
System.out.println("正在加密输入的指定文件......";
int theByte = 0; while ((theByte = fis.read()) != -1)
{
cos.write(theByte); } fis.close();
cos.close();
} //从文件系统中装载DES密钥(需要给出正确的保护密码),并解密相应的文件
private static void decrypt(char[] password, String fileInput, String fileOutput) throws Exception
{
System.out.println("正在装载密钥......";
Key key = loadKey(password);
System.out.println("已经正确装载密钥!"; // 创建Cipher,并用装载的密钥初始化
Cipher cipher = Cipher.getInstance("DES";
FileInputStream fis = new FileInputStream(fileInput);
FileOutputStream fos = new FileOutputStream(fileOutput);
System.out.println("初始化Cipher......";
cipher.init(Cipher.DECRYPT_MODE, key);
CipherInputStream cis = new CipherInputStream(fis, cipher);
System.out.println("正在解密指定的文件......";
int theByte = 0;
while ((theByte = cis.read()) != -1)
{
fos.write(theByte); } cis.close(); fos.close();
}
}
2楼2006-12-13 18:16:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 modigfkl 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见