精华内容
下载资源
问答
  • Java实现DES加密解密

    万次阅读 多人点赞 2018-11-09 16:27:01
    DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥。 加密原理: DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的...

    DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥

    加密原理:

    DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用 Feistel 技术,将其中加密的文本块分成两半,实现了子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

    不过,DES已可破解,所以针对保密级别特别高的数据推荐使用非对称加密算法。

    下面介绍基于Java实现的DES加解密方法,该方法同样适用于Android平台,使用的是JDK1.8。

    public class DESUtil {
    
        /**
         * 偏移变量,固定占8位字节
         */
        private final static String IV_PARAMETER = "12345678";
        /**
         * 密钥算法
         */
        private static final String ALGORITHM = "DES";
        /**
         * 加密/解密算法-工作模式-填充模式
         */
        private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
        /**
         * 默认编码
         */
        private static final String CHARSET = "utf-8";
    
        /**
         * 生成key
         *
         * @param password
         * @return
         * @throws Exception
         */
        private static Key generateKey(String password) throws Exception {
            DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
            return keyFactory.generateSecret(dks);
        }
    
    
        /**
         * DES加密字符串
         *
         * @param password 加密密码,长度不能够小于8位
         * @param data 待加密字符串
         * @return 加密后内容
         */
        public static String encrypt(String password, String data) {
            if (password== null || password.length() < 8) {
                throw new RuntimeException("加密失败,key不能小于8位");
            }
            if (data == null)
                return null;
            try {
                Key secretKey = generateKey(password);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
                cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
                byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));
    
                //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
                //Android平台可以使用android.util.Base64
                return new String(Base64.getEncoder().encode(bytes));
    
            } catch (Exception e) {
                e.printStackTrace();
                return data;
            }
        }
    
        /**
         * DES解密字符串
         *
         * @param password 解密密码,长度不能够小于8位
         * @param data 待解密字符串
         * @return 解密后内容
         */
        public static String decrypt(String password, String data) {
            if (password== null || password.length() < 8) {
                throw new RuntimeException("加密失败,key不能小于8位");
            }
            if (data == null)
                return null;
            try {
                Key secretKey = generateKey(password);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
                cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
                return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
            } catch (Exception e) {
                e.printStackTrace();
                return data;
            }
        }
    
        /**
         * DES加密文件
         *
         * @param srcFile  待加密的文件
         * @param destFile 加密后存放的文件路径
         * @return 加密后的文件路径
         */
        public static String encryptFile(String password, String srcFile, String destFile) {
    
            if (password== null || password.length() < 8) {
                throw new RuntimeException("加密失败,key不能小于8位");
            }
            try {
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv);
                InputStream is = new FileInputStream(srcFile);
                OutputStream out = new FileOutputStream(destFile);
                CipherInputStream cis = new CipherInputStream(is, cipher);
                byte[] buffer = new byte[1024];
                int r;
                while ((r = cis.read(buffer)) > 0) {
                    out.write(buffer, 0, r);
                }
                cis.close();
                is.close();
                out.close();
                return destFile;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }
    
        /**
         * DES解密文件
         *
         * @param srcFile  已加密的文件
         * @param destFile 解密后存放的文件路径
         * @return 解密后的文件路径
         */
        public static String decryptFile(String password, String srcFile, String destFile) {
            if (password== null || password.length() < 8) {
                throw new RuntimeException("加密失败,key不能小于8位");
            }
            try {
                File file = new File(destFile);
                if (!file.exists()) {
                    file.getParentFile().mkdirs();
                    file.createNewFile();
                }
                IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, generateKey(key), iv);
                InputStream is = new FileInputStream(srcFile);
                OutputStream out = new FileOutputStream(destFile);
                CipherOutputStream cos = new CipherOutputStream(out, cipher);
                byte[] buffer = new byte[1024];
                int r;
                while ((r = is.read(buffer)) >= 0) {
                    cos.write(buffer, 0, r);
                }
                cos.close();
                is.close();
                out.close();
                return destFile;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }
    }
    

     

    展开全文
  • 主要介绍了使用java自带des加密算法实现文件加密和字符串加密的示例,需要的朋友可以参考下
  • Java实现的DES加密算法

    2010-05-13 23:19:46
    Java实现的DES算法,可对文件进行加密解密
  • Java实现AES和des对文件加密解密。Java实现AES和des对文件加密解密Java实现AES和des对文件加密解密
  • 使用Java实现3DES加密解密

    千次阅读 2019-07-10 23:14:03
    它相当于是每个数据块应用三次DES加密算法。密钥长度是128位(bit)和192位(bit)。原版DES容易被破解,新的3DES出现,增加了加密安全性,避免被暴力破解。它同样是对称性加密,同样涉及到加密模式和填充方式。加密...

    1. 介绍

    3DES又称Triple DES,是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。密钥长度是128位(bit)和192位(bit)。原版DES容易被破解,新的3DES出现,增加了加密安全性,避免被暴力破解。它同样是对称性加密,同样涉及到加密模式和填充方式。加密模式有ECB、CBC、CTR、OFB、CFB。填充方式有PKCS5Padding、PKCS7Padding、ZeroPadding、ISO10126、Ansix923。

    这里提供一个在线进行3DES加密解密:http://tool.chacuo.net/crypt3des

    2. 具体实现

    加密后对数据的输出采用2种方式:Base64、Hex,其中Base64使用的是Android SDK里面的API,具体代码如下:

    package com.fantasy.blogdemo.crypto.utils;
    
    import android.util.Base64;
    
    import com.fantasy.blogdemo.utils.ConvertUtils;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * 3DES加解密工具类
     * <pre>
     *     author  : Fantasy
     *     version : 1.1, 2019-07-12
     *     since   : 1.0, 2019-07-10
     * </pre>
     */
    public class TripleDESUtils {
        private static final String CHARSET = "UTF-8";
    
        /**
         * 加密,输出Base64字符串密文
         *
         * @param data           明文
         * @param key            密钥
         * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,
         *                       相关取值可以查看下列两个文档:
         *                       <ul>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
         *                       中的 javax.crypto.Cipher</li>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
         *                       Standard Algorithm Name Documentation</a></li>
         *                       </ul>
         * @param iv             偏移量,ECB模式不需要,传null
         * @return 密文
         * @throws Exception 异常
         */
        public static String encryptBase64(String data, String key, String transformation, String iv) throws Exception {
            return Base64.encodeToString(handle(data.getBytes(CHARSET), key, transformation, iv, true), Base64.NO_WRAP);
        }
    
        /**
         * 解密,密文为Base64字符串
         *
         * @param data           密文
         * @param key            密钥
         * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,
         *                       相关取值可以查看下列两个文档:
         *                       <ul>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
         *                       中的 javax.crypto.Cipher</li>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
         *                       Standard Algorithm Name Documentation</a></li>
         *                       </ul>
         * @param iv             偏移量,ECB模式不需要,传null
         * @return 明文
         * @throws Exception 异常
         */
        public static String decryptBase64(String data, String key, String transformation, String iv) throws Exception {
            return new String(handle(Base64.decode(data, Base64.NO_WRAP), key, transformation, iv, false), CHARSET);
        }
    
        /**
         * 加密,输出十六进制字符串密文
         *
         * @param data           明文
         * @param key            密钥
         * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,
         *                       相关取值可以查看下列两个文档:
         *                       <ul>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
         *                       中的 javax.crypto.Cipher</li>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
         *                       Standard Algorithm Name Documentation</a></li>
         *                       </ul>
         * @param iv             偏移量,ECB模式不需要,传null
         * @return 密文
         * @throws Exception 异常
         */
        public static String encryptHex(String data, String key, String transformation, String iv) throws Exception {
            return ConvertUtils.bytesToHexString(handle(data.getBytes(CHARSET), key, transformation, iv, true));
        }
    
        /**
         * 解密,密文为十六进制字符串
         *
         * @param data           密文
         * @param key            密钥
         * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,
         *                       相关取值可以查看下列两个文档:
         *                       <ul>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
         *                       中的 javax.crypto.Cipher</li>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
         *                       Standard Algorithm Name Documentation</a></li>
         *                       </ul>
         * @param iv             偏移量,ECB模式不需要,传null
         * @return 明文
         * @throws Exception 异常
         */
        public static String decryptHex(String data, String key, String transformation, String iv) throws Exception {
            return new String(handle(ConvertUtils.hexStringToBytes(data), key, transformation, iv, false), CHARSET);
        }
    
        /**
         * 处理数据,加密或解密
         *
         * @param data           数据
         * @param key            密钥
         * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:<i>DESede/CBC/PKCS5Padding</i>。<br/>
         *                       相关取值可以查看下列两个文档:
         *                       <ul>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
         *                       中的 javax.crypto.Cipher</li>
         *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
         *                       Standard Algorithm Name Documentation</a></li>
         *                       </ul>
         * @param iv             偏移量,ECB模式不需要,传null
         * @param isEncrypt      如果是加密,则为true;如果为解密,则为false
         * @return 加密后或解密后的字节数组
         * @throws Exception 异常
         */
        private static byte[] handle(byte[] data, String key, String transformation, String iv,
                                     boolean isEncrypt) throws Exception {
            SecretKey secretKey = new SecretKeySpec(key.getBytes(CHARSET), "DESede"); // 构造密钥
            Cipher cipher = Cipher.getInstance(transformation);
            if (iv == null || iv.length() == 0) {
                cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey);
            } else {
                IvParameterSpec ips = new IvParameterSpec(iv.getBytes(CHARSET));
                cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey, ips);
            }
            return cipher.doFinal(data);
        }
    
    }

    3. 使用方式

    这里以"DESede/CBC/PKCS5Padding"模式为例

    String transformation = "DESede/CBC/PKCS5Padding";
    String key = "QSfg26hg433BV42DKJN234SD"; // 密钥长度16位、24位
    String iv = "CI2390NK"; // IV偏移量的长度必须为8位
    String data = "blogDemo123"; // 待加密的数据
    
    // 加密结果:xyHZl10iOlBxi2RbR547cA==
    String result1 = TripleDESUtils.encryptBase64(data, key, transformation, iv);
    
    // 解密结果:blogDemo123
    String result2 = TripleDESUtils.decryptBase64(result1, key, transformation, iv);

    想看更多例子可以到我的GitHub上面看看BlogDemo

     

    如果想进一步交流和学习的同学,可以加一下QQ群哦!

    展开全文
  • Java实现三重DES加密算法

    千次阅读 2018-04-12 09:37:14
    信息安全原理课,本以为会学刺激的攻防,各种注入渗透,然而事实上学的是加密解密。下面代码是抄书的一个实验。 本着学习DES算法的心态我手敲了一遍,然而完全就是写界面,核心算法用的是包里的。。 anyway,既然...

    信息安全原理课,本以为会学刺激的攻防,各种注入渗透,然而事实上学的是加密解密。下面代码是抄书的一个实验。
    本着学习DES算法的心态我手敲了一遍,然而完全就是写界面,核心算法用的是包里的。。
    anyway,既然代码已经敲出来了就贴一下吧,java 写的一个桌面版程序,虽然丑了点,但也不是太难写。

    代码很冗余,写这段代码的人程序能力肯定不行,但是我也没去改啦:

    import java.awt.*;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.DESedeKeySpec;
    import javax.swing.*;
    import java.awt.event.*;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    
    
    public class FileEncrypter extends JFrame{
        public static void main(String[] args) {
            FileEncrypter fe = new FileEncrypter();
            fe.show();
        }
    
        FileEncrypter(){
            this.setSize(550,200);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocation(400,300);
            this.setTitle("吟游诗人--3DES加密工具");
            Container c = this.getContentPane();
            c.setLayout(new FlowLayout());
            JLabel label = new JLabel("选择文件");
            c.add(label);
            final JTextField fileText = new JTextField(35);
            c.add(fileText);
    
            JButton chooseButton = new JButton("浏览");
            chooseButton.addActionListener(new ActionListener(){
                //浏览按钮的点击事件监听
                @Override
                public void actionPerformed(ActionEvent e){
                    JFileChooser chooser = new JFileChooser();
                    chooser.setCurrentDirectory(new File("."));
                    int result = chooser.showOpenDialog(null);
                    if(result == JFileChooser.APPROVE_OPTION){
                        //获得文件绝对路径
                        String path = chooser.getSelectedFile().getAbsolutePath();
                        fileText.setText(path);
                    }
                }
            });
    
            c.add(chooseButton);
            JLabel label2 = new JLabel("秘钥(24个字符):");
            c.add(label2);
            final JTextField keyText = new JTextField(35);
            c.add(keyText);
            JButton jbe = new JButton("加密");
            c.add(jbe);
            jbe.addActionListener(new ActionListener(){
                //以下编写"加密"按钮的监听和事件
                @Override
                public void actionPerformed(ActionEvent event) {
                    String wenjian,miyao;
                    wenjian = fileText.getText();
                    miyao = keyText.getText();
                    if("".equals(wenjian) || wenjian == null){
                        JOptionPane.showMessageDialog(null,"请选择文件!","提示",JOptionPane.OK_OPTION);
                    }else{
                        if("".equals(miyao) || miyao == null){
                            JOptionPane.showMessageDialog(null,"请输入24字节秘钥!","提示",JOptionPane.OK_OPTION);
                        }else{
                            if(miyao.length() != 24){
                                JOptionPane.showMessageDialog(null, "秘钥必须为24字节!","提示",JOptionPane.OK_OPTION);
                            }else{
                                //将三个秘钥分别 存入三个字节型数组中
                                byte[] key1 = miyao.substring(0,8).getBytes();
                                byte[] key2 = miyao.substring(8,16).getBytes();
                                byte[] key3 = miyao.substring(16,24).getBytes();
    
                                File file = new File(wenjian);
                                //读取明文并存入字节型数组plain中
                                byte[] plain = bytefromfile(file);
    
                                try {
                                    byte[] bytOut = encryptByDES(encryptByDES(encryptByDES(plain,key1),key2),key3);
                                    String fileOut = wenjian + ".tdes";
                                    FileOutputStream fos = new FileOutputStream(fileOut);
                                    for(int i = 0; i < bytOut.length; i++){
                                        fos.write((int)bytOut[i]);
                                    }
                                    fos.close();
                                    JOptionPane.showMessageDialog(null,"加密成功!","提示",JOptionPane.INFORMATION_MESSAGE);
                                } catch (Exception e) {
                                    //e.printStackTrace();
                                    JOptionPane.showMessageDialog(null,"加密失败!请检查文件或者秘钥","提示",JOptionPane.OK_OPTION);
                                }
    
                            }
                        }
                    }
                }
    
            });
    
    
            JButton jbD = new JButton("解密");
            c.add(jbD);
            //解密按钮点击事件
            jbD.addActionListener(new ActionListener(){
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    String wenjian,wenjian1,miyao;
                    wenjian = fileText.getText();
                    miyao = keyText.getText();
                    if("".equals(wenjian) || wenjian == null){
                        JOptionPane.showMessageDialog(null,"请选择文件!","提示",JOptionPane.OK_OPTION);
                        return;
                    }
                    if(wenjian.substring(wenjian.length() - 5).toLowerCase().equals(".tdes")){
                        if(miyao.length()!=24){
                            JOptionPane.showMessageDialog(null, "秘钥必须为24字节!","提示",JOptionPane.OK_OPTION);
                            return;
                        }else{
                            wenjian1 = wenjian.substring(0,wenjian.length() - 5);
                            JFileChooser chooser = new JFileChooser();
                            chooser.setCurrentDirectory(new File("."));
                            //用户指定要保存的文件的位置
                            chooser.setSelectedFile(new File(wenjian1));
                            int ret = chooser.showSaveDialog(null);
                            if(ret == 0){
                                byte[] key1 = miyao.substring(0,8).getBytes();
                                byte[] key2 = miyao.substring(8,16).getBytes();
                                byte[] key3 = miyao.substring(16,24).getBytes();
    
                                File file = new File(wenjian);
                                //读取密文
                                byte[] miwen = bytefromfile(file);
                                try{
                                    //解密
                                    byte[] bytOut = decryptByDES(decryptByDES(decryptByDES(miwen,key3),key2),key1);
    
                                    File fileOut = chooser.getSelectedFile();
                                    fileOut.createNewFile();
                                    FileOutputStream fos = new FileOutputStream(fileOut);
    
                                    for(int i = 0; i < bytOut.length; i++){
                                        fos.write((int) bytOut[i]);
                                    }
    
                                    fos.close();
                                    JOptionPane.showMessageDialog(null, "解密成功!","提示",JOptionPane.INFORMATION_MESSAGE);
    
                                }catch (Exception e) {
                                    JOptionPane.showMessageDialog(null, "解密失败!请检查文件或秘钥","提示",JOptionPane.OK_OPTION);
                                }
    
    
                            }
                        }
                    }else{
                        JOptionPane.showMessageDialog(null, "不是合法的加密文件!","提示",JOptionPane.OK_OPTION);
                    }
                }
    
            });
    
    
    
        }
    
    
        //从输入的文件中读取字节,保存于TextofFile数组中,并返回
        private byte[] bytefromfile(File filein){
            byte[] TextofFile = new byte[(int)filein.length()];
            try{
                FileInputStream fin = new FileInputStream(filein);
                for(int i = 0; i < filein.length(); i++){
                    TextofFile[i] = (byte)fin.read();
                }
                fin.close();
            }catch(IOException e){
                e.printStackTrace();
            }
            return TextofFile;
        }
    
        //根据输入的明文进行加密 
        private byte[] encryptByDES(byte[] bytP, byte[] bytKey) throws Exception{
            DESKeySpec desKS = new DESKeySpec(bytKey);
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey sk = skf.generateSecret(desKS);
            Cipher cip = Cipher.getInstance("DES");
            cip.init(Cipher.ENCRYPT_MODE, sk);
            return cip.doFinal(bytP);
        }
    
        //根据密文和秘钥进行解密
        private byte[] decryptByDES(byte[] bytE, byte[] bytKey) throws Exception{
            DESKeySpec desKS = new DESKeySpec(bytKey);
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey sk = skf.generateSecret(desKS);
            Cipher cip = Cipher.getInstance("DES");
            cip.init(Cipher.DECRYPT_MODE, sk);
            return cip.doFinal(bytE);
        }
    
    
    }
    

    运行截图:

    这里写图片描述

    展开全文
  • 实现DES算法对文件进行加密加密后生成密钥文件,和加密文件
  • 当然,小菜在开发中也遇到了,这里呢,小菜想说的是JAVA简单实现DES加密。 今天就简单实现一下如何DES加密解密。话不多说,代码如下。直接可用。希望能成为你项目中的一个很好的工具类。 public class ...

    前言:相信很多小伙伴在开发过程中都会加密问题。当然,小菜在开发中也遇到了,这里呢,小菜想说的是JAVA简单实现DES加密。

    今天就简单实现一下如何DES加密解密。话不多说,代码如下。直接可用。希望能成为你项目中的一个很好的工具类。

    public class DesEncrypt {
    
        // DES加密密钥key
        public static String key = "sdfDA12r3JHV214IJrwerDSO892BK2345nrekk35oewr4wrwrenlklknsdlemifzkw8iiiifegJG7649UJNDFJSvgsfdjFGDFGj435jUhjhjbkajb12kj987gsjh9834tbAXiudhf9B3PM4bt98dyf9Q2m97jjyf417aliD";
    
        // DES加密明文plaintext
        @SuppressWarnings("static-access")
        public static String encryptDES(String plaintext) {
            try {
                // 首先,DES算法要求有一个可信任的随机数源,可以通过 SecureRandom类,内置两种随机数算法,NativePRNG和SHA1PRNG
                SecureRandom random = new SecureRandom();
                // 创建一个DESKeySpec对象
                DESKeySpec desKey = new DESKeySpec(key.getBytes());
                // 创建一个密匙工厂
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
                // 将DESKeySpec对象转换成SecretKey对象
                SecretKey securekey = keyFactory.generateSecret(desKey);
                // Cipher对象实际完成加密操作
                Cipher cipher = Cipher.getInstance("DES");
                // 用密匙初始化Cipher对象
                cipher.init(cipher.ENCRYPT_MODE, securekey, random);
                // 加密生成密文byte数组
                byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());
                // 将密文byte数组转化为16进制密文
                String ciphertext = byteToHex(cipherBytes);
                return ciphertext;
            } catch (Throwable e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        // DES解密
        @SuppressWarnings("static-access")
        public static String decryptDES(String ciphertext) {
            try {
                // DES算法要求有一个可信任的随机数源,SecureRandom内置两种随机数算法,NativePRNG和SHA1PRNG,
           // 通过new来初始化,默认来说会使用NativePRNG算法生成随机数,但是也可以配置-Djava.security参数来修改调用的算法,
           // 如果是/dev/[u]random两者之一就是NativePRNG,否则就是SHA1PRNG。
    SecureRandom random = new SecureRandom(); // 创建一个DESKeySpec对象 DESKeySpec desKey = new DESKeySpec(key.getBytes()); // 创建一个密匙工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 将DESKeySpec对象转换成SecretKey对象 SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(cipher.DECRYPT_MODE, securekey, random); // 将16进制密文转化为密文byte数组 byte[] cipherBytes = hexToByte(ciphertext); // 真正开始解密操作 String plaintext = new String(cipher.doFinal(cipherBytes)); return plaintext; } catch (Throwable e) { e.printStackTrace(); } return null; } // 将byte转化为16进制 public static String byteToHex(byte[] bs) { if (0 == bs.length) { return ""; } else { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bs.length; i++) { String s = Integer.toHexString(bs[i] & 0xFF); if (1 == s.length()) { sb.append("0"); } sb = sb.append(s.toUpperCase()); } return sb.toString(); } } // 将16进制转化为byte public static byte[] hexToByte(String ciphertext) { byte[] cipherBytes = ciphertext.getBytes(); if ((cipherBytes.length % 2) != 0) { throw new IllegalArgumentException("长度不为偶数"); } else { byte[] result = new byte[cipherBytes.length / 2]; for (int i = 0; i < cipherBytes.length; i += 2) { String item = new String(cipherBytes, i, 2); result[i / 2] = (byte) Integer.parseInt(item, 16); } return result; } }
       // 进行测试
    public static void main(String[] args) { // 当前时间戳 long timestamp = System.currentTimeMillis(); System.out.println(timestamp); // 待加密内容 String str = "测试内容:Mr.JimYi" + timestamp; // 密码,长度要是8的倍数 String ciphertext = encryptDES(str); System.out.println("加密后:" + ciphertext); String plaintext = decryptDES(ciphertext); System.out.println("解密后:" + plaintext); String t = plaintext.substring(plaintext.length() - 13, plaintext.length()); System.out.println(t); } }

     

    转载于:https://www.cnblogs.com/JimYi/p/10330888.html

    展开全文
  • JAVA实现三重DES加密软件

    千次阅读 2015-12-13 11:22:39
    三重DES加密算法安全性较高,该软件仅仅能加密8字节倍数长度的文件,后续将会持续开发。
  • DES加密 java源文件

    2010-03-05 19:36:31
    DES加密 java源文件DES加密 java源文件DES加密 java源文件DES加密 java源文件
  • java c# des加密解密

    2011-09-18 12:33:30
    C#通过des对文件进行加密java通过密钥C#加密文件进行解密
  • JAVA DES 配置文件加密解密

    千次阅读 2015-04-28 10:24:24
    简单的JAVA DES 配置文件进行加密解密
  • 是哪里写的不对,请高手指点,我的目的是从 index.jsp 把值(product_id)进行加密,在 Action 里面取出 加密后的字符串,进行解密,但解密那一块有问题,可能是 DES 类写的有问题,请高手帮忙在原有的代码基础上...
  • JAVA实现DES加密

    2020-05-30 22:38:07
    通过使用Java标准库的密码学算法调用DES对称加密算法,能够编写简单的实验代码进行正确的DES加密和解密 二、实验要求 1. 掌握搭建JAVA语言的开发环境; 2. 掌握Java标准库中密码学算法的使用方法; 3. 熟悉DES...
  • java实现的DES加密

    2011-11-23 20:20:25
    应用密码学的课程大作业,写了挺久的...可将一段文字用你给定的密钥加密成一长串01序列,只要在电脑上装了jdk并配置好环境变量,双击里面的“点我开始玩.bat”文件就可运行程序,程序界面也有帮助按钮,需要时可查看!
  • Java进行3DES加密解密

    万次阅读 2015-08-18 19:56:14
    package com.shanhy.tools.packers; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec;... * 3DES加密 * * @author SHAN
  • java实现的des加密

    2014-08-17 23:23:58
    DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准 ,是1972年美国IBM 公司研制...虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的
  • JAVA中3DES加密示例

    万次阅读 2018-10-17 16:32:44
    本问只简要讲解在JAVA中如何使用几种加密的代码示例,关于加密算法和数学知识不在本文讨论范围。 package com.util; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; ...
  • java写的DES加密

    2018-03-12 19:22:30
    import java.awt.Container; import javax.swing.*; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputS...
  • 由于有两万五千多的用户必须的通过代码来自动加密,直接用poi的包可以实现读写excel,但是我这里是临时加密一份excel表所以不考虑用这种,我将excel表中的数据提取出来放到txt文件中,然后读取这份txt文件加密后再...
  • des加密算法(js+java)加密与解密结果相同 包含三个文件 : des.js des.html ,用于实现前端脚本的加密与解密 des.java 用于后台的加密解密操作; 项目中正好用到,已经过验证,两个加密解密结果相同,分享给...
  • java DES加密

    2014-01-17 11:27:11
    DES加密: 首先网上搜索了一个DES加密算法工具类: import java.security.*; import javax.crypto.*; public class DesHelper {  private static String strDefaultKey = "national";    private ...
  • JAVA-DES加密解密

    2018-12-27 15:41:29
    一、DES加密算法介绍 1、要求密钥必须是8个字节,即64bit长度。 2、因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用。 3、加密、解密都需要通过字节数组作为数据和密钥进行...
  • DES文件加密 java

    2014-09-25 23:20:38
    使用DES算法实现文件加密加密的数据可读取文件。有图形界面,简单易操作。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,272
精华内容 5,308
关键字:

java对文件des加密

java 订阅