24小时热门版块排行榜    

查看: 381  |  回复: 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一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +3 G6APbkg8SA6w 2026-08-29 4/200 2026-08-30 07:17 by ZPa0EcMwuECS
[考博] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 gy1nBQXYQJqL 2026-08-29 5/250 2026-08-30 07:05 by ZPa0EcMwuECS
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 06:57 by ZPa0EcMwuECS
[基金申请] 投票:  有多少人是今天查系统知道结果的? +16 爱看书的可乐 2026-08-26 18/900 2026-08-30 05:48 by winsaint
[硕博家园] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +6 ASdOkHsho7FD 2026-08-28 13/650 2026-08-30 05:38 by ZPa0EcMwuECS
[考研] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +4 G6APbkg8SA6w 2026-08-29 5/250 2026-08-30 02:40 by ZPa0EcMwuECS
[论文投稿] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +4 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 02:09 by ZPa0EcMwuECS
[论文投稿] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +5 gy1nBQXYQJqL 2026-08-29 6/300 2026-08-30 01:58 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一区文章,我:8.O.551.O.5.4,科目全,可伽急 +4 ASdOkHsho7FD 2026-08-28 5/250 2026-08-30 01:03 by ZPa0EcMwuECS
[论文投稿] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 ASdOkHsho7FD 2026-08-28 5/250 2026-08-30 00:41 by ZPa0EcMwuECS
[基金申请] 中青基了要发朋友圈吗? +4 349506619 2026-08-28 4/200 2026-08-29 22:41 by alongwaytogo
[教师之家] 导师吐槽:我怎么摊上了这么个极品研究生! +9 苏东坡二世 2026-08-23 9/450 2026-08-29 14:41 by hustersqt
[基金申请] 麻烦专家们看看评委们的意见(F口面上) +5 gdd2018 2026-08-28 10/500 2026-08-29 14:10 by Jacob678
[基金申请] 基金不中,共勉 +11 eulota 2026-08-26 11/550 2026-08-28 14:22 by 火星超人xi
[基金申请] 怎么看青基中了没有啊 +5 叶九微 2026-08-26 5/250 2026-08-27 10:35 by l_zh2008
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 国合现在查不到了吗? +10 chengyan1220 2026-08-24 20/1000 2026-08-26 08:57 by peasantsprig
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
信息提示
请填处理意见