des 填充信息的保护,正确加密与解密,中文签名错误异常原因



 //不用十六进制转换,是为了 ,保护在DES加密过程中末位填充信息,以此加密8个字节,否则,在还原机密的时候,填充信息丢失,报错需要在传输的时候,,而还原的时候步伐还原。
 public static String byteArrayToHex(byte[] byteArray) {
  // 首先初始化一个字符数组,用来存放每个16进制字符
  char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 'F' };
  // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
  char[] resultCharArray = new char[byteArray.length * 2];
  // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
  int index = 0;
  for (byte b : byteArray) {
   resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
   resultCharArray[index++] = hexDigits[b & 0xf];
  }
  // 字符数组组合成字符串返回
  return new String(resultCharArray);
 }


//用秘密密钥生成DESkey,采用对称加密数据并返回 ,java6密钥默认长度56位


byte [] bt = (new BASE64Decoder()).decodeBuffer(key)字符串-》字节

string Code_str = (new BASE64Encoder()).encodeBuffer(key)字节--》字符串。
待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。


---

md5签名中问题(中文验证不通过)

无论什么样字符集,获得对方原始值后,直接先做签名验证,再做转码。这个规律所有语言都适用!!!

md5函数:以传入字节码为内容进行签名验证。因此,需要签名结果一致,只需要传入参数字节码是相同的,那么md5签名结果就相同。

相同汉字不同字节码:


以下以汉字“中”为例:


gb2312 字节码是:D6D0


utf-8    字节码是:E4B8AD


在2个程序里面,默认字符集不同,看是都是相同中文,md5结果自然就不同了。

无论什么样字符集,获得对方原始值后,直接先做签名验证,再做转码。这个规律所有语言都适用!!

模拟将解决中文编码问题传输,签名,加密等预处理代码

 public static void main(String[] args) {
  String serviceContent = "replySyncStatus_WebService服务内容中文字符";
     String utfcontent = null;
  try {
   String hesString = byteArray2HexStr(serviceContent.getBytes("utf-8"));
   System.out.println("转化后的内容:" + hesString);
   //发送 ···
   
   
   //接收到
   byte[] bytesContent = hexStr2ByteArray(hesString);
   String strContent = null;
   try {
    strContent = new String(bytesContent, "utf-8");
    System.out.println("转化后的内容:" + strContent);
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } 
 }






你可能感兴趣的:(java,位运算,加密,string)