• 技术文章 >Java >Java基础

    java中rsa乱码介绍

    尚2019-12-03 10:43:25原创1604

    在对安全性要求比较高的报文做加密的时候,算法有很多种,我这里主要用到的就是AES加密算法。由于在国内使用,所以不可避免的要对中文进行加密和解密,而在这个过程中,发现,如果不做处理,很容易会出现中文乱码。(推荐:java视频教程

    下面是常见的情况:

    一、中文乱码

    不对密码进行编码处理

    byte[] decryptResult = decrypt(encryptResult, password);
         System.out.println("解密后:" + new String(decryptResult));

    运行后

    加密前:我是shoneworn
    解密后:鎴戞槸shoneworn

    二、对文字进行编码处理,但是在传输过程中草率的将byte[]转成String, String code = new String(bytes); 由于AES加密算法要求密文是16位的倍数。所以,这么处理,在解密的时候,就会报各种错。比如下面的。

    String code = new String(encryptResult);        
    byte[] decryptResult = decrypt(code.getBytes(), password);

    AES加密时会将被加密数据转换成编码格式的字节数组也就是String.getBytes()方法,当getBytes方法不设置参数时,默认使用本机默认编码格式,改成String.getBytes(“utf-8”)问题解决。

    使用rsa加密解密示例:

    package com.ailin.test;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AES {    /**
         * 加密
         * 
         * @param content
         *            需要加密的内容
         * @param password
         *            加密密码
         * @return
         */
        public static byte[] encrypt(String content, String password) {        try {
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(password.getBytes()));
                SecretKey secretKey = kgen.generateKey();            byte[] enCodeFormat = secretKey.getEncoded();
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                byte[] byteContent = content.getBytes("utf-8");
                cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
                byte[] result = cipher.doFinal(byteContent);            return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            }        return null;
        }    /**
         * 解密
         * 
         * @param content
         *            待解密内容
         * @param password
         *            解密密钥
         * @return
         */
        public static byte[] decrypt(byte[] content, String password) {        try {
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(password.getBytes()));
                SecretKey secretKey = kgen.generateKey();            byte[] enCodeFormat = secretKey.getEncoded();
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
                byte[] result = cipher.doFinal(content);            return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            }        return null;
        }    /**
         * 将二进制转换成16进制
         * 
         * @param buf
         * @return
         */
        public static String parseByte2HexStr(byte buf[]) {
            StringBuffer sb = new StringBuffer();        for (int i = 0; i < buf.length; i++) {
                String hex = Integer.toHexString(buf[i] & 0xFF);            if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                sb.append(hex.toUpperCase());
            }        return sb.toString();
        }    /**
         * 将16进制转换为二进制
         * 
         * @param hexStr
         * @return
         */
        public static byte[] parseHexStr2Byte(String hexStr) {        if (hexStr.length() < 1)            return null;        byte[] result = new byte[hexStr.length() / 2];        for (int i = 0; i < hexStr.length() / 2; i++) {            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
                result[i] = (byte) (high * 16 + low);
            }        return result;
        }    /**
         * 加密
         *
         * @param content
         *            需要加密的内容
         * @param password
         *            加密密码
         * @return
         */
        public static byte[] encrypt2(String content, String password) {        try {
                SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");            byte[] byteContent = content.getBytes("utf-8");
                cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
                byte[] result = cipher.doFinal(byteContent);            return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            }        return null;
        }    public static void main(String[] args) throws UnsupportedEncodingException {
            String content = "我是shoneworn";
            String password = "12345678";        // 加密
            System.out.println("加密前:" + content);        byte[] encode = encrypt(content, password);        
            //传输过程,不转成16进制的字符串,就等着程序崩溃掉吧
            String code = parseByte2HexStr(encode);
            System.out.println("密文字符串:" + code);        byte[] decode = parseHexStr2Byte(code);        // 解密
            byte[] decryptResult = decrypt(decode, password);
            System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码            
             }
    }

    更多java知识请关注java基础教程栏目。

    以上就是java中rsa乱码介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:java
    上一篇:java中url乱码解决方法 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • java重载和重写的区别• java中常用的数据类型有哪些• java中的常用集合类有哪些• Java项目报400错误的原因与解决方法
    1/1

    PHP中文网