RSA加密参考https://blog.csdn.net/qq_18870023/article/details/52596808
byte负数转换参考https://bbs.csdn.net/topics/257493

  下图是一个使用new String(); String.getBytes();方法进行转换时变量的值。

  在java中的byte[] 与 String 转换,是遍历byte[] 把每个byte元素数值转化为char 在放到String的char数组里,例如byte[0] = 115 对应的char字符为 ‘s’ 。
  如果都是这样的话,看起来直接用String方法进行转换就行。

  但是, 观察上图 tempArr1,加密返回的byte[]中存在负值,例如-116 。众所周知,负数在Ascii码中是没有对应的值。

  在下图中,由于new String(),采用文件默认字符集UTF-8,处理时遇到解析不了的值,会用 ‘\uFFFD’代替,显示为 ‘�’

  所以,再把byte[]进行转换到String时,有负数就会出现错误,在上图中就会展示为�。 此时,如果再把char � 转换回byte的话 ,由于找不到对应的Ascii值,所以也就无法还原回以前的值。造成数据错误。
如图所示

  在上图中,(byte)140显示-116 是int 强转只保留后八位。byte数组 b 中有-116,55,其中-166被转换成 �, 55被转换成 7。再获取 s.getBytes(); 可以发现 � 被转换成了-17,-65,-67。
  此时的数组b1.length > b .length。 在使用Cipher解密时就会抛出异常。字符串长度超出。

  附上转换工具类。

public class HexUtils {private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};public static String bytesToHexString(byte[] data) {String string = "";try {char[] chars = new char[data.length << 1];//十六进制数一个四位,byte一个八位for (int i = 0, j = 0; i < data.length; i++) {chars[j++] = DIGITS[(data[i] >> 4) & 0x0F];chars[j++] = DIGITS[data[i] & 0x0F];}string = new String(chars);} catch (Exception e) {e.printStackTrace();}return string;}public static byte[] hexStringToBytes(String data) {//两个四位十六进制字符合成一个八位bytebyte[] bytes = new byte[data.length() / 2];char[] chars = data.toCharArray();for (int i = 0; i < bytes.length; i++) {bytes[i] = (byte) ((hexCharToByte(chars[i * 2]) << 4) | hexCharToByte(chars[i * 2 + 1]));}return bytes;}private static byte hexCharToByte(char c) {return (byte) "0123456789ABCDEF".indexOf(c);}
}

  附上运行输出图

java:RSA加解密字符串与byte[]数组转换 不用String方法的原因相关推荐

  1. openresty 与 java RSA加解密

    上一篇搞定了openresty与java之间的aes加解密.这一篇就来说说openresty与java之间RSA的加解密.在测试的过程中.发现了与aes同样的问题.就是openresty支持的填充模式 ...

  2. 几种字符串到byte[] 数组转化为String 的方法

    < language="javascript" src="/ad/js/edu_left_300-300.js" type="text/java ...

  3. Byte数组转换成string 的方法积累

    .net的加密算法,返回的都是byte[] 类型,在存贮起来让人非常头疼,最简单的方法就是把byte[]转换成string来存贮,当然如果数据量大的话,另当别论. 所以我就把byte[]转换成stri ...

  4. c#中如何将byte数组转换成string从而在textbox中显示出来?

    c# string和byte[]的转换(2008-07-16 16:48:26)标签:c string byte[] it   分类:小鱼的工作 正好用到,总结一下: 1. byte[] byteAr ...

  5. java 数组转换成String方法

    一.方法列表 Arrays.toString(Object[] obj); // 返回指定数组内容的字符串表示形式. 其他参数详见图: 二.返回String类型格式: 逗号分隔 [xx, xx, xx ...

  6. Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  7. Java字节序,java整型数与网络字节序 byte[] 数组转换关系

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  8. java byte(字节_Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutpu......

    /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络程序进行通讯时,需要进行相应的转换 * 高.低字节之间的转换 * windows的字节序为低字 ...

  9. 十六进制字符串与byte数组与ASCII码互相转换

    日常工作中,对接一些硬件使用tcp通信,需要将输入输出流转16进制字符串再在表中找到与其对应的ASCII码,并转换作为结果.因此,这里整理了一个工具类,用于这三者的相互转换. 十六进制字符串转byte ...

最新文章

  1. 怎样学习linux系统管理员,linux系统管理员学习笔记
  2. SVN 提交子文件夹问题
  3. 17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限
  4. 1· linux命令:查看依赖的共享库 - ldd命令
  5. VS2010编译驱动程序
  6. 在Centos6.8上为安装Django1.11.1升级Python2.6到Python3.5
  7. @RequestParam使用须知
  8. 录像机CIF、D1、720P、960P、1080P分辨率及硬盘所占空间
  9. Java-简易加法计算器代码优化
  10. hive动态分区 MapReduce 虚拟内存不足
  11. 赛码浪潮笔试题库软件实施岗位_校园招聘在线笔试,原来大家都在用赛码
  12. bixby怎么编程_Bixby将优先考虑Yahoo和AOL内容,因为三星获得了报酬
  13. Typora超级纯净免费记笔记软件分享给大家
  14. VB无所不能之七:VB的多线程(2)
  15. AT24C16页写和多页写
  16. 泵引理 Pumping Lemma
  17. python人脸识别第三方库_GitHub - bennystar/face_collection: python的face_recognition人脸识别库的使用...
  18. Mobvista港交所上市:募集资产12亿港元 段威持股近13%
  19. 如何将格式工厂添加到右键
  20. 保持冷静、继续前行——《白说》读后感

热门文章

  1. 网络安全 kali虚拟机中的渗透实验
  2. 中级软件设计师2011上半年上午试题
  3. 输出平行四边形的底和高,求平行四边形的面积
  4. 1091. Acute Stroke
  5. 数据结构---线性表的静态/动态分配与顺序/链式存储
  6. 文档服务器地址如何进入,知道服务器地址 怎么进入
  7. 弹性力学基本方程的矩阵表示
  8. JamesBin专属Python博客导航
  9. Linux中的update和upgrade的区别
  10. c 语言如何扫描输入的字符,如何在C中对单个字符进行扫描