24小时热门版块排行榜    

查看: 380  |  回复: 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 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +7 ASdOkHsho7FD 2026-08-28 11/550 2026-08-30 05:40 by ZPa0EcMwuECS
[硕博家园] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 01:49 by ZPa0EcMwuECS
[公派出国] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +4 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 01:45 by ZPa0EcMwuECS
[博后之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 gy1nBQXYQJqL 2026-08-29 6/300 2026-08-30 01:36 by ZPa0EcMwuECS
[考博] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 01:34 by ZPa0EcMwuECS
[考研] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +5 ASdOkHsho7FD 2026-08-28 7/350 2026-08-30 01:03 by ZPa0EcMwuECS
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +5 ASdOkHsho7FD 2026-08-28 7/350 2026-08-30 00:52 by ZPa0EcMwuECS
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +4 ASdOkHsho7FD 2026-08-28 5/250 2026-08-30 00:52 by ZPa0EcMwuECS
[基金申请] 有没有仍没收到信息的 +5 德尚中行 2026-08-27 6/300 2026-08-29 18:10 by manplx
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 我就是申请一个面上项目而已,这评审意见是按照杰青的条件评的吧? +6 gouxfjh 2026-08-28 9/450 2026-08-29 09:59 by jklily
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +12 Kittylucky 2026-08-27 13/650 2026-08-29 00:04 by superceng
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +5 yuleib84 2026-08-26 6/300 2026-08-28 00:02 by yudaoqian88
[基金申请] 申请删除本帖 +6 lyz123lyz 2026-08-27 7/350 2026-08-27 17:31 by 宁静致远sy
[文学芳草园] 梦想 +3 myrtle 2026-08-26 3/150 2026-08-27 10:01 by angelyueyi
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 能否退出参与的面上项目解除限项 +23 koalala 2026-08-24 26/1300 2026-08-26 14:29 by 宝贝虫子
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
信息提示
请填处理意见