24小时热门版块排行榜    

Znn3bq.jpeg
查看: 363  |  回复: 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 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 0854调剂 +10 长弓傲 2026-04-11 11/550 2026-04-13 10:38 by wp06
[考研] 化工求调剂! +37 RichLi_ 2026-04-06 37/1850 2026-04-13 10:25 by sophia_93
[考研] 材料085601调剂 +30 何润采123 2026-04-10 32/1600 2026-04-13 09:51 by szhize
[考研] 材料299专硕求调剂 +11 +21 2026-04-09 11/550 2026-04-13 08:57 by lhj2009
[考研] 211本科材料化工求调剂 +17 YHLAH 2026-04-11 20/1000 2026-04-13 08:46 by Sammy2
[考研] 368化学求调剂 +14 wwwwabcde 2026-04-07 15/750 2026-04-13 08:36 by lhj2009
[考研] 327求调剂 +14 Xxjc1107. 2026-04-06 14/700 2026-04-13 08:31 by Delta2012
[考研] 279求调剂 +9 张番茄不炒蛋 2026-04-11 9/450 2026-04-12 22:22 by paopaotu326
[考研] 一志愿2110,化学学硕310分,本科重点双非求调剂 +19 努力奋斗112 2026-04-08 19/950 2026-04-12 17:01 by lhj2009
[考研] 085404 293求调剂 +9 勇远库爱314 2026-04-08 9/450 2026-04-12 02:24 by 秋豆菜芽
[考研] 调剂 +6 青灯不负 2026-04-09 6/300 2026-04-11 20:35 by dongdian1
[考研] 283求调剂 086004考英二数二 +17 那个噜子 2026-04-10 18/900 2026-04-11 16:27 by 明月此时有
[考研] 085501机械专硕 302分 不挑专业求调剂 +7 汪某. 2026-04-09 7/350 2026-04-11 14:37 by luhong1990
[考研] 还有化工二轮调剂的学校吗 5+14 化工人999 2026-04-09 48/2400 2026-04-11 10:27 by 89436494
[考研] 288求调剂 +15 代fish 2026-04-09 16/800 2026-04-11 10:26 by wwj2530616
[考研] 368求调剂 +3 17385968172 2026-04-10 3/150 2026-04-10 20:12 by 电子奥德彪
[考研] 一志愿京区985,085401,与本科专业一致,电子信息工程, +4 阳光开朗的男孩 2026-04-10 4/200 2026-04-10 18:27 by shenrf
[考研] 293调剂 +25 yj1221 2026-04-08 26/1300 2026-04-10 15:02 by 柴小白
[考研] 一志愿厦大生物学332求调剂 +10 池池池池池池 2026-04-08 10/500 2026-04-09 17:10 by 独醉梦孤城
[考研] 085801 总分275 本科新能源 求调剂 +8 bradoner 2026-04-08 9/450 2026-04-09 13:43 by only周
信息提示
请填处理意见