//不用十六进制转换,是为了 ,保护在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();
}
}