| 查看: 334 | 回复: 1 | |||
| 当前主题已经存档。 | |||
[资源]
关于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) |
» 猜你喜欢
基金申报
已经有5人回复
基金委咋了?2026年的指南还没有出来?
已经有7人回复
国自然申请面上模板最新2026版出了吗?
已经有17人回复
纳米粒子粒径的测量
已经有8人回复
疑惑?
已经有5人回复
计算机、0854电子信息(085401-058412)调剂
已经有5人回复
Materials Today Chemistry审稿周期
已经有5人回复
溴的反应液脱色
已经有7人回复
推荐一本书
已经有12人回复
常年博士招收(双一流,工科)
已经有4人回复
|
例程 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











回复此楼
; System.exit(1);