站长资讯网
最全最丰富的资讯网站

java中rsa乱码介绍

java中rsa乱码介绍

在对安全性要求比较高的报文做加密的时候,算法有很多种,我这里主要用到的就是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")); //不转码会乱码                      } }

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号