• 字符串加密


    无聊写个字符串加密的小工具,功能:设置相应的字符串,可进行相应的加密方式,有MD5加密,SHA加密,DES加密。

    字符串加密

    加密类:

    package secret;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;
    import java.security.Signature;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    
    
    /**   
     * 加密解密   
     *    
     * @author 毛兴宇   
     * @since  http://blog.csdn.net/powmxypow  
     */    
    public class Secret {
        /**   
         * 进行MD5加密   
         *    
         * @param info 要加密的信息   
         * @return String 加密后的字符串   
         */    
        public String encryptToMD5(String info) {     
            byte[] digesta = null;     
            try {     
                // 得到一个md5的消息摘要     
                MessageDigest alga = MessageDigest.getInstance("MD5");     
                // 添加要进行计算摘要的信息     
                alga.update(info.getBytes());     
                // 得到该摘要     
                digesta = alga.digest();     
            } catch (NoSuchAlgorithmException e) {     
                e.printStackTrace();     
            }     
            // 将摘要转为字符串     
            String rs = byte2hex(digesta);     
            return rs;     
        }     
        /**   
         * 进行SHA加密   
         *    
         * @param info 要加密的信息   
         * @return String 加密后的字符串   
         */    
        public String encryptToSHA(String info) {     
            byte[] digesta = null;     
            try {     
                // 得到一个SHA-1的消息摘要     
                MessageDigest alga = MessageDigest.getInstance("SHA-1");     
                // 添加要进行计算摘要的信息     
                alga.update(info.getBytes());     
                // 得到该摘要     
                digesta = alga.digest();     
            } catch (NoSuchAlgorithmException e) {     
                e.printStackTrace();     
            }     
            // 将摘要转为字符串     
            String rs = byte2hex(digesta);     
            return rs;     
        }     
        ////////////////////////////////////////////////////////////////////////////     
        /**   
         * 创建密匙   
         *    
         * @param algorithm 加密算法,可用 DES,DESede,Blowfish   
         * @return SecretKey 秘密(对称)密钥   
         */    
        public SecretKey createSecretKey(String algorithm) {     
            // 声明KeyGenerator对象     
            KeyGenerator keygen;     
            // 声明 密钥对象     
            SecretKey deskey = null;     
            try {     
                // 返回生成指定算法的秘密密钥的 KeyGenerator 对象     
                keygen = KeyGenerator.getInstance(algorithm);     
                // 生成一个密钥     
                deskey = keygen.generateKey();     
            } catch (NoSuchAlgorithmException e) {     
                e.printStackTrace();     
            }     
            // 返回密匙     
            return deskey;     
        }     
        /**   
         * 根据密匙进行DES加密   
         *    
         * @param key 密匙   
         * @param info 要加密的信息   
         * @return String 加密后的信息   
         */    
        public String encryptToDES(SecretKey key, String info) {     
            // 定义 加密算法,可用 DES,DESede,Blowfish     
            String Algorithm = "DES";     
            // 加密随机数生成器 (RNG),(可以不写)     
            SecureRandom sr = new SecureRandom();     
            // 定义要生成的密文     
            byte[] cipherByte = null;     
            try {     
                // 得到加密/解密器     
                Cipher c1 = Cipher.getInstance(Algorithm);     
                // 用指定的密钥和模式初始化Cipher对象     
                // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)     
                c1.init(Cipher.ENCRYPT_MODE, key, sr);     
                // 对要加密的内容进行编码处理,     
                cipherByte = c1.doFinal(info.getBytes());     
            } catch (Exception e) {     
                e.printStackTrace();     
            }     
            // 返回密文的十六进制形式     
            return byte2hex(cipherByte);     
        }     
        /**   
         * 根据密匙进行DES解密   
         *    
         * @param key 密匙   
         * @param sInfo 要解密的密文   
         * @return String 返回解密后信息   
         */    
        public String decryptByDES(SecretKey key, String sInfo) {     
            // 定义 加密算法,     
            String Algorithm = "DES";     
            // 加密随机数生成器 (RNG)     
            SecureRandom sr = new SecureRandom();     
            byte[] cipherByte = null;     
            try {     
                // 得到加密/解密器     
                Cipher c1 = Cipher.getInstance(Algorithm);     
                // 用指定的密钥和模式初始化Cipher对象     
                c1.init(Cipher.DECRYPT_MODE, key, sr);     
                // 对要解密的内容进行编码处理     
                cipherByte = c1.doFinal(hex2byte(sInfo));     
            } catch (Exception e) {     
                e.printStackTrace();     
            }     
            // return byte2hex(cipherByte);     
            return new String(cipherByte);     
        }     
        // /////////////////////////////////////////////////////////////////////////////     
        /**   
         * 创建密匙组,并将公匙,私匙放入到指定文件中   
         *    
         * 默认放入mykeys.bat文件中   
         */    
        public void createPairKey() {     
            try {     
                // 根据特定的算法一个密钥对生成器     
                KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");     
                // 加密随机数生成器 (RNG)     
                SecureRandom random = new SecureRandom();     
                // 重新设置此随机对象的种子     
                random.setSeed(1000);     
                // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器     
                keygen.initialize(512, random);// keygen.initialize(512);     
                // 生成密钥组     
                KeyPair keys = keygen.generateKeyPair();     
                // 得到公匙     
                PublicKey pubkey = keys.getPublic();     
                // 得到私匙     
                PrivateKey prikey = keys.getPrivate();     
                // 将公匙私匙写入到文件当中     
                doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });     
            } catch (NoSuchAlgorithmException e) {     
                e.printStackTrace();     
            }     
        }     
        /**   
         * 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中   
         *    
         * @param info 要签名的信息   
         * @param signfile 存入的文件   
         */    
        public void signToInfo(String info, String signfile) {     
            // 从文件当中读取私匙     
            PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);     
            // 从文件中读取公匙     
            PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);     
            try {     
                // Signature 对象可用来生成和验证数字签名     
                Signature signet = Signature.getInstance("DSA");     
                // 初始化签署签名的私钥     
                signet.initSign(myprikey);     
                // 更新要由字节签名或验证的数据     
                signet.update(info.getBytes());     
                // 签署或验证所有更新字节的签名,返回签名     
                byte[] signed = signet.sign();     
                // 将数字签名,公匙,信息放入文件中     
                doObjToFile(signfile, new Object[] { signed, mypubkey, info });     
            } catch (Exception e) {     
                e.printStackTrace();     
            }     
        }     
        /**   
         * 读取数字签名文件 根据公匙,签名,信息验证信息的合法性   
         *    
         * @return true 验证成功 false 验证失败   
         */    
        public boolean validateSign(String signfile) {     
            // 读取公匙     
            PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);     
            // 读取签名     
            byte[] signed = (byte[]) getObjFromFile(signfile, 1);     
            // 读取信息     
            String info = (String) getObjFromFile(signfile, 3);     
            try {     
                // 初始一个Signature对象,并用公钥和签名进行验证     
                Signature signetcheck = Signature.getInstance("DSA");     
                // 初始化验证签名的公钥     
                signetcheck.initVerify(mypubkey);     
                // 使用指定的 byte 数组更新要签名或验证的数据     
                signetcheck.update(info.getBytes());     
                System.out.println(info);     
                // 验证传入的签名     
                return signetcheck.verify(signed);     
            } catch (Exception e) {     
                e.printStackTrace();     
                return false;     
            }     
        }     
        /**   
         * 将二进制转化为16进制字符串   
         *    
         * @param b 二进制字节数组   
         * @return String   
         */    
        public String byte2hex(byte[] b) {     
            String hs = "";     
            String stmp = "";     
            for (int n = 0; n < b.length; n++) {     
                stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));     
                if (stmp.length() == 1) {     
                    hs = hs + "0" + stmp;     
                } else {     
                    hs = hs + stmp;     
                }     
            }     
            return hs.toUpperCase();     
        }     
        /**   
         * 十六进制字符串转化为2进制   
         *    
         * @param hex   
         * @return   
         */    
        public byte[] hex2byte(String hex) {     
            byte[] ret = new byte[8];     
            byte[] tmp = hex.getBytes();     
            for (int i = 0; i < 8; i++) {     
                ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);     
            }     
            return ret;     
        }     
        /**   
         * 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF   
         *    
         * @param src0 byte   
         * @param src1 byte   
         * @return byte   
         */    
        public static byte uniteBytes(byte src0, byte src1) {     
            byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))     
                    .byteValue();     
            _b0 = (byte) (_b0 << 4);     
            byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))     
                    .byteValue();     
            byte ret = (byte) (_b0 ^ _b1);     
            return ret;     
        }     
        /**   
         * 将指定的对象写入指定的文件   
         *    
         * @param file 指定写入的文件   
         * @param objs 要写入的对象   
         */    
        public void doObjToFile(String file, Object[] objs) {     
            ObjectOutputStream oos = null;     
            try {     
                FileOutputStream fos = new FileOutputStream(file);     
                oos = new ObjectOutputStream(fos);     
                for (int i = 0; i < objs.length; i++) {     
                    oos.writeObject(objs[i]);     
                }     
            } catch (Exception e) {     
                e.printStackTrace();     
            } finally {     
                try {     
                    oos.close();     
                } catch (IOException e) {     
                    e.printStackTrace();     
                }     
            }     
        }     
        /**   
         * 返回在文件中指定位置的对象   
         *    
         * @param file 指定的文件   
         * @param i 从1开始   
         * @return   
         */    
        public Object getObjFromFile(String file, int i) {     
            ObjectInputStream ois = null;     
            Object obj = null;     
            try {     
                FileInputStream fis = new FileInputStream(file);     
                ois = new ObjectInputStream(fis);     
                for (int j = 0; j < i; j++) {     
                    obj = ois.readObject();     
                }     
            } catch (Exception e) {     
                e.printStackTrace();     
            } finally {     
                try {     
                    ois.close();     
                } catch (IOException e) {     
                    e.printStackTrace();     
                }     
            }     
            return obj;     
        }     
        /**   
         * 测试   
         *    
         * @param args   
         */  
        public static void main(String[] args) {     
        	Secret jiami = new Secret();     
            // 执行MD5加密"Hello world!"     
            System.out.println("Hello经过MD5:" + jiami.encryptToMD5("Hello"));    
            //执行SHA加密"Hello world!"
            System.out.println("Hello world!经过SHA加密:"+jiami.encryptToSHA("Hello world!"));
            // 生成一个DES算法的密匙     
            SecretKey key = jiami.createSecretKey("DES");     
            // 用密匙加密信息"Hello world!"     
            String str1 = jiami.encryptToDES(key, "Hello");     
            System.out.println("使用des加密信息Hello为:" + str1);     
            // 使用这个密匙解密     
            String str2 = jiami.decryptByDES(key, str1);     
            System.out.println("解密后为:" + str2);     
            // 创建公匙和私匙     
            jiami.createPairKey();     
            // 对Hello world!使用私匙进行签名     
            jiami.signToInfo("Hello", "mysign.bat");     
            // 利用公匙对签名进行验证。     
            if (jiami.validateSign("mysign.bat")) {     
                System.out.println("Success!");     
            } else {     
                System.out.println("Fail!");     
            }     
        }
    }
    

    UI类:

    package secret;
    
    import java.awt.EventQueue;
    
    import javax.crypto.SecretKey;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.Document;
    
    
    public class SecretUI implements  DocumentListener  {
    
    	/**
    	 * @author 毛兴宇
    	 * @param 加密解密UI界面
    	 */
    	private JFrame jframe;
    	private JTextField textfield;
    	private JTextField textfieldMD5;
    	private JTextField textfieldSHA;
    	private JTextField textfieldDES;
    	
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					SecretUI window = new SecretUI();
    					window.jframe.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    		
    	}
    	
    	
    	public SecretUI() { 
    		initialize();
    	}
    
    	private void initialize() {
    		jframe = new JFrame();
    		jframe.setTitle("u5B57u7B26u4E32u52A0u5BC6 By:u6BDBu5174u5B87");
    		jframe.setBounds(100, 100, 424, 199);
    		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jframe.getContentPane().setLayout(null);
            int w = jframe.getToolkit().getScreenSize().width;//宽度  
            int h = jframe.getToolkit().getScreenSize().height;//高度  
            jframe.setLocation(w/2-212,h/2-99);  
    		jframe.setResizable(false);
    		
    		JLabel label = new JLabel("u9700u52A0u5BC6u5B57u7B26u4E32:");
    		label.setBounds(16, 14, 82, 15);
    		jframe.getContentPane().add(label);
    		
    		JLabel labelMD5 = new JLabel("MD5u52A0u5BC6:");
    		labelMD5.setBounds(30, 50, 54, 15);
    		jframe.getContentPane().add(labelMD5);
    		
    		JLabel labelSHA = new JLabel("SHAu52A0u5BC6:");
    		labelSHA.setBounds(30, 86, 54, 15);
    		jframe.getContentPane().add(labelSHA);
    		
    		JLabel labelDES = new JLabel("DESu52A0u5BC6:");
    		labelDES.setBounds(30, 122, 54, 15);
    		jframe.getContentPane().add(labelDES);
    		
    		textfield = new JTextField();
    		textfield.setBounds(102, 11, 304, 21);
    		jframe.getContentPane().add(textfield);
    		textfield.setColumns(10);
    		
    		Document dt = textfield.getDocument();
    		dt.addDocumentListener(this);
    		
    		textfieldMD5 = new JTextField();
    		textfieldMD5.setColumns(10);
    		textfieldMD5.setBounds(102, 47, 304, 21);
    		jframe.getContentPane().add(textfieldMD5);
    		
    		textfieldSHA = new JTextField();
    		textfieldSHA.setColumns(10);
    		textfieldSHA.setBounds(102, 83, 304, 21);
    		jframe.getContentPane().add(textfieldSHA);
    		
    		textfieldDES = new JTextField();
    		textfieldDES.setColumns(10);
    		textfieldDES.setBounds(102, 119, 304, 21);
    		jframe.getContentPane().add(textfieldDES);
    	}
    
    
        /** 
        * 实现DocumentListener接口changedUpdate方法 
        * 该方法可以跟踪当文本框中已存在的内容改变时,获取相应的值 
        */  
    	public void changedUpdate(DocumentEvent e) {
    		Secret sr = new Secret();
    		textfieldMD5.setText(sr.encryptToMD5(textfield.getText()));
    		textfieldSHA.setText(sr.encryptToSHA(textfield.getText()));
    		SecretKey key = sr.createSecretKey("DES");
    		textfieldDES.setText(sr.encryptToDES(key, textfield.getText()));
    		
    	}
    
    
        /** 
        * 实现DocumentListener接口中insertUpdate方法 
        * 该方法可以跟踪文本框中输入的内容 
        */  
    	public void insertUpdate(DocumentEvent e) {
    		Secret sr = new Secret();
    		textfieldMD5.setText(sr.encryptToMD5(textfield.getText()));
    		textfieldSHA.setText(sr.encryptToSHA(textfield.getText()));
    		SecretKey key = sr.createSecretKey("DES");
    		textfieldDES.setText(sr.encryptToDES(key, textfield.getText()));
    		
    	}
    
    
        /** 
        * 实现DocumentListener接口removeUpdate方法 
        * 该方法可以跟踪文本框中移除的内容,例如:在文本框中点击Backspace 
        */  
    	public void removeUpdate(DocumentEvent e) {
    		Secret sr = new Secret();
    		textfieldMD5.setText(sr.encryptToMD5(textfield.getText()));
    		textfieldSHA.setText(sr.encryptToSHA(textfield.getText()));
    		SecretKey key = sr.createSecretKey("DES");
    		textfieldDES.setText(sr.encryptToDES(key, textfield.getText()));
    		
    		
    	}
    	
    
    }
    


    转载请注明出处:(毛兴宇http://blog.csdn.net/powmxypow/)

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3293999.html
Copyright © 2020-2023  润新知