`
wlhok
  • 浏览: 56895 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DES加密/解密操作

    博客分类:
  • Java
阅读更多

生成DES密钥、保存密钥到文件、从文件读取密钥、加密、解密等操作。

java 代码
  1. import java.io.ByteArrayOutputStream;   
  2. import java.io.File;   
  3. import java.io.FileInputStream;   
  4. import java.io.FileNotFoundException;   
  5. import java.io.FileOutputStream;   
  6. import java.io.IOException;   
  7. import java.io.OutputStream;   
  8. import java.security.InvalidKeyException;   
  9. import java.security.Key;   
  10. import java.security.NoSuchAlgorithmException;   
  11. import java.security.SecureRandom;   
  12. import java.security.Security;   
  13. import java.security.spec.InvalidKeySpecException;   
  14. import javax.crypto.Cipher;   
  15. import javax.crypto.KeyGenerator;   
  16. import javax.crypto.SecretKeyFactory;   
  17. import javax.crypto.spec.DESKeySpec;   
  18. import org.apache.commons.configuration.ConfigurationException;   
  19. import org.apache.commons.configuration.PropertiesConfiguration;   
  20. import com.sun.crypto.provider.SunJCE;   
  21.   
  22. public class DESTest {   
  23.     private static final String ALGORITHM = "DES";   
  24.   
  25.     /**  
  26.      * 获得DES加密的密钥。在交易处理的过程中应该定时更 换密钥。需要JCE的支持,如果jdk版本低于1.4,则需要  
  27.      * 安装jce-1_2_2才能正常使用。  
  28.      *   
  29.      * @return Key 返回对称密钥  
  30.      * @throws java.security.NoSuchAlgorithmException  
  31.      * @see util.EncryptUtil 其中包括加密和解密的方法  
  32.      */  
  33.     public Key generateKey() throws EncryptException {   
  34.         try {   
  35.             Security.insertProviderAt(new SunJCE(), 1);   
  36.             KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);   
  37.             generator.init(new SecureRandom());   
  38.             Key key = generator.generateKey();   
  39.             return key;   
  40.         } catch (NoSuchAlgorithmException e) {   
  41.             throw new EncryptException(e);   
  42.         }   
  43.     }   
  44.   
  45.     /**  
  46.      * 得到一个密钥的密码  
  47.      *   
  48.      * @param key  
  49.      *            密钥  
  50.      * @param cipherMode  
  51.      *            密码的类型  
  52.      * @return Cipher  
  53.      * @throws util.EncryptException  
  54.      *             当加密出现异常情况时,产生异常信息  
  55.      */  
  56.     public Cipher getCipher(Key key, int cipherMode) throws EncryptException {   
  57.         try {   
  58.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");   
  59.             cipher.init(cipherMode, key);   
  60.             return cipher;   
  61.         } catch (Exception e) {   
  62.             // e.printStackTrace();   
  63.             throw new EncryptException("Generate Cipher occurs Exception.["  
  64.                     + e.getMessage() + "]");   
  65.         }   
  66.     }   
  67.   
  68.     public void saveKey(Key key, String filename) throws EncryptException {   
  69.         if (key == null) {   
  70.             return;   
  71.         }   
  72.   
  73.         File file = new File(filename);   
  74.         try {   
  75.             file.createNewFile();   
  76.         } catch (IOException e1) {   
  77.             throw new EncryptException(e1);   
  78.         }   
  79.   
  80.         try {   
  81.             PropertiesConfiguration publicConfig = new PropertiesConfiguration(   
  82.                     filename);   
  83.             publicConfig.setProperty("Key", Utils.bytesToHexStr(key   
  84.                     .getEncoded()));   
  85.             publicConfig.save();   
  86.         } catch (ConfigurationException e) {   
  87.             throw new EncryptException(e);   
  88.         }   
  89.     }   
  90.   
  91.     public Key loadKey(String filename) throws EncryptException {   
  92.         try {   
  93.             PropertiesConfiguration config = new PropertiesConfiguration(   
  94.                     new File(filename));   
  95.             String privateKeyValue = config.getString("Key");   
  96.             // 从原始密钥数据创建DESKeySpec对象   
  97.             DESKeySpec dks = new DESKeySpec(Utils   
  98.                     .hexStrToBytes(privateKeyValue));   
  99.             // 创建一个密钥工厂,然后用它把DESKeySpec转换成Secret Key对象   
  100.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
  101.             Key key = keyFactory.generateSecret(dks);   
  102.             return key;   
  103.         } catch (ConfigurationException e) {   
  104.             throw new EncryptException(e);   
  105.         } catch (NoSuchAlgorithmException e) {   
  106.             throw new EncryptException(e);   
  107.         } catch (InvalidKeyException e) {   
  108.             throw new EncryptException(e);   
  109.         } catch (InvalidKeySpecException e) {   
  110.             throw new EncryptException(e);   
  111.         }   
  112.     }   
  113.   
  114.     public byte[] doEncrypt(Key key, byte[] data) throws EncryptException {   
  115.         try {   
  116.             // Get a cipher object   
  117.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");   
  118.   
  119.             // Encrypt   
  120.             cipher.init(Cipher.ENCRYPT_MODE, key);   
  121.             // byte[] stringBytes = amalgam.getBytes("UTF8");   
  122.             byte[] raw = cipher.doFinal(data);   
  123.             // BASE64Encoder encoder = new BASE64Encoder();   
  124.             // String base64 = encoder.encode(raw);   
  125.             return raw;   
  126.         } catch (Exception e) {   
  127.             e.printStackTrace();   
  128.             throw new EncryptException("Do encrypt occurs Exception.["  
  129.                     + e.getMessage() + "]");   
  130.         }   
  131.     }   
  132.   
  133.     public byte[] doDecrypt(Key key, byte[] raw) throws EncryptException {   
  134.         try {   
  135.             // Get a cipher object   
  136.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");   
  137.             // Decrypt   
  138.             cipher.init(Cipher.DECRYPT_MODE, key);   
  139.             // BASE64Decoder decoder = new BASE64Decoder();   
  140.             // byte[] raw = decoder.decodeBuffer(data);   
  141.             byte[] data = cipher.doFinal(raw);   
  142.             // String result = new String(stringBytes, "UTF8");   
  143.             // System.out.println("the decrypted data is: " + result);   
  144.             return data;   
  145.         } catch (Exception e) {   
  146.             e.printStackTrace();   
  147.             throw new EncryptException("Do decrypt occurs Exception.["  
  148.                     + e.getMessage() + "]");   
  149.         }   
  150.     }   
  151.   
  152.     public static void main(String[] args) {   
  153.         DESTest bean = new DESTest();   
  154.         String keyFilename = "d:/key.txt";   
  155.         String srcFilename = "d:/temp/1.txt";   
  156.         String encryptFilename = "D:/temp/encrypt_result.dat";   
  157.         String decryptFilename = "D:/temp/decrypt_result.txt";   
  158.   
  159.         Key key = bean.initKey(keyFilename);   
  160.         DESEncrypt encrypt = DESEncryptImpl.getInstance();   
  161.   
  162.         try {   
  163.             // encrypt   
  164.             System.out.println("encrypt begin ...");   
  165.             FileInputStream in = new FileInputStream(srcFilename);   
  166.             ByteArrayOutputStream bout = new ByteArrayOutputStream();   
  167.             byte[] tmpbuf = new byte[1024];   
  168.             int count = 0;   
  169.             while ((count = in.read(tmpbuf)) != -1) {   
  170.                 bout.write(tmpbuf, 0, count);   
  171.                 tmpbuf = new byte[1024];   
  172.             }   
  173.             in.close();   
  174.             byte[] orgData = bout.toByteArray();   
  175.             byte[] raw = encrypt.doEncrypt(key, orgData);   
  176.   
  177.             OutputStream out = new FileOutputStream(new File(encryptFilename));   
  178.             out.write(raw);   
  179.             out.close();   
  180.             System.out.println("encrypt done ...");   
  181.   
  182.             // decrypt   
  183.             System.out.println("decrypt begin ...");   
  184.             in = new FileInputStream(encryptFilename);   
  185.             bout = new ByteArrayOutputStream();   
  186.             tmpbuf = new byte[1024];   
  187.             count = 0;   
  188.             while ((count = in.read(tmpbuf)) != -1) {   
  189.                 bout.write(tmpbuf, 0, count);   
  190.                 tmpbuf = new byte[1024];   
  191.             }   
  192.             in.close();   
  193.             orgData = bout.toByteArray();   
  194.             byte[] data = encrypt.doDecrypt(key, orgData);   
  195.             out = new FileOutputStream(new File(decryptFilename));   
  196.             out.write(data);   
  197.             out.flush();   
  198.             out.close();   
  199.             System.out.println("decrypt done ...");   
  200.         } catch (FileNotFoundException e) {   
  201.             e.printStackTrace();   
  202.         } catch (IOException e) {   
  203.             e.printStackTrace();   
  204.         } catch (EncryptException e) {   
  205.             e.printStackTrace();   
  206.         }   
  207.     }   
  208.   
  209.     /*  
  210.      * test  
  211.      */  
  212.     public Key initKey(String keyFilename) {   
  213.         DESControl control = DESControlImpl.getInstance();   
  214.         File keyFile = new File(keyFilename);   
  215.         Key key = null;   
  216.         try {   
  217.             if (!keyFile.exists()) {   
  218.                 System.out.println("generate Key.");   
  219.                 key = control.generateKey();   
  220.                 control.saveKey(key, keyFilename);   
  221.                 return key;   
  222.   
  223.             } else {   
  224.                 System.out.println("load Key.");   
  225.                 key = control.loadKey(keyFilename);   
  226.                 return key;   
  227.             }   
  228.         } catch (EncryptException e) {   
  229.             e.printStackTrace();   
  230.         }   
  231.         return key;   
  232.     }   
  233. }   
分享到:
评论
1 楼 hywill 2010-04-14  
您好,我最近在做文件压缩加密的功能,请问密钥从哪儿获取呢?
key.txt里面是什么?还望您的指教

相关推荐

    DES加密/解密

    使用java技术编写的Des加密/解密,的工具类,已亲测可完全正确使用,无bug

    Java DES 加密/解密

    Java版标准3DES加密/解密方法,加密函数desedeEncoder(String paramString1, String key) 解密函数desedeDecoder(String dest, String key)

    DES加密/解密 小工具

    des 加密解密工具 1、将要 加密/解密 的密码 2、公钥 3、加密button 解密 botton 4、 加密或解密出来的结果

    PHP 3des加密/解密类

    PHP 3DES加密/解密类,兼容支付宝、微信等。

    C# DES加密/解密类成熟的加密解密类,适合项目开发,可以对于明文进行

    DES加密/解密类成熟的加密解密类,适合项目开发,可以对于明文进行加密

    VB6 DES 加密/解密算法 插件

    des算法是从网上找的,里面有作者名称。 这里只说明PHP用法,ASP等其他用法雷同,不再复述。 $str="加密前字符串"; $mi=new COM("encryp.act"); $co=$mi->encode($str); echo($co);//输出加密后的字符串。 $co=$mi-...

    DES加密/解密 BCB XE2 可直接加入程序使用

    DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于64位的数据块进行操作,使用56位的密钥。...同时,通过提供的字符串与二进制数据之间的转换函数,使得非二进制数据的加密解密变得更加便捷。

    Hi3520/Hi3515 CIPHER API参考 加密/解密

    它支持硬件加速,相比于纯软件实现的加密解密过程具有显著的速度优势。这套API特别适合于需要高效处理大量数据的场景,例如视频监控系统、网络通信安全等领域。 ### 加密/解密的重要性 在当今数字化的世界里,信息...

    DES/3DES加密解密工具

    对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密

    DES加密解密 java + js

    这个模块提供了与Java类似的API,可以创建`Cipher`对象并执行加密解密操作。然而,JavaScript中的实现可能需要额外的库,如`crypto-js`,来支持3DES和PKCS7填充。 在实际应用中,为了确保Java和JavaScript之间的互...

    C语言实现DES加密解密算法

    DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...

    DES加密前端js和后台java互通代码

    CryptoJS提供了完整的DES加密和解密功能,支持CBC(Cipher Block Chaining)和其他模式。以下是一个简单的示例: ```javascript // 导入CryptoJS库 const CryptoJS = require("crypto-js"); // 定义密钥和初始化...

    3DES加密解密工具

    标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...

    java 3des加密、解密工具类

    java 3des加密、解密工具类 java的3DES加密/解密

    des加密解密_Des加密解密_DES加密_

    在给定的“des加密例程”中,可能包含了一个调用动态链接库(DLL)实现DES加密解密的示例代码。DLL是Windows操作系统中的一种共享库,可以被多个程序同时调用,节省内存资源并便于代码复用。这个示例可能涉及以下...

    VB实现DES加密解密算法,vb加密和解密,VBA

    这需要创建一个.NET类库项目,实现DES加密解密功能,然后在VBA中通过CreateObject或早绑定的方式调用这些函数。 以下是VB.NET中实现DES加密解密的简单示例代码: ```vbnet Imports System.IO Imports System....

    java-des加密解密程序

    java-des加密解密程序,基于java编写的des,3des加密程序,包括MAC校验,MD5校验等

    对称密码技术的实现

    (1)熟悉相应的DES加密/解密函数的使用,在单机完成对特定文件(test-1.txt)的单重DES加密/解密; (2)针对DES密钥特点(8字节,64比特位,其中真正起作用的为56比特位),设计一次一密的密钥产生机制(即每次...

    C#加密解密DeEncryptHelper.zip

    DES加密/解密类。 加密 加密数据 解密 解密数据 得到随机安全码(哈希加密)。 得到随机哈希加密字符串 哈希加密一个字符串 RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密...

    MagicCrypt 是一个Rust 库,用于加密/解密字符串、文件或数据,使用数据加密标准 (DES) 或高级加密标准

    MagicCrypt 是一个 Java/PHP/NodeJS/Rust 库,用于加密/解密字符串、文件或数据,使用数据加密标准 (DES) 或高级加密标准 (AES) 算法。它支持 CBC 分组密码模式、PKCS5 填充和 64、128、192 或 256 位密钥长度。

Global site tag (gtag.js) - Google Analytics