用Base64加解密时发现的问题(其实时java基础问题byte[]转String)

来源:互联网 发布:java重写的作用 编辑:程序博客网 时间:2024/06/05 18:54

今天用Base64进行加解密发现 能加密哪是解密总是一堆看不懂的东西:

原文:zhouzhou

密文:V8y2RvWHiNE2Z/6GxyDLiA==

解密得到明文:[B@73035e27

项目时间比较紧,就是不知道怎么回事,急的不行不行的。

最后发现问题时byte[]转String的问题。

所以写了一个byte[]转String的测试:

如下:

byte []b = new byte[]{'h','y','e','n','h'};

System.out.println(b); //System.out.println(b.toString()); 也是不行的。


打印为:[B@73035e27


byte []b = new byte[]{'z','h','o','u','z','h','o','u'};

System.out.println(new String(b));

打印为:zhouzhou

所以byte[]转String时用 new String(b);


ps:Base64的工具网上有很多 一般的字符串在结尾会带上“=”号等特殊符号。有时候不利于在网络中传输 可能会出错。下面贴出一个改进的Base64算法:


public final class Base64 {


privatestatic finalint BASELENGTH = 128;

privatestatic finalint LOOKUPLENGTH = 64;

privatestatic finalint TWENTYFOURBITGROUP = 24;

privatestatic finalint EIGHTBIT = 8;

privatestatic finalint SIXTEENBIT = 16;

privatestatic finalint FOURBYTE = 4;

privatestatic finalint SIGN = -128;

privatestatic charPAD = '=';

privatestatic byte[]base64Alphabet =new byte[BASELENGTH];

privatestatic char[] lookUpBase64Alphabet =new char[LOOKUPLENGTH];


static {

for (inti = 0; i < BASELENGTH; ++i) {

base64Alphabet[i] = -1;

}

for (inti = 'Z'; i >= 'A'; i--) {

base64Alphabet[i] = (byte) (i -'A');

}

for (inti = 'z'; i >= 'a'; i--) {

base64Alphabet[i] = (byte) (i -'a' + 26);

}


for (inti = '9'; i >= '0'; i--) {

base64Alphabet[i] = (byte) (i -'0' + 52);

}


base64Alphabet['+'] = 62;

base64Alphabet['/'] = 63;


for (inti = 0; i <= 25;i++) {

lookUpBase64Alphabet[i] = (char) ('A' + i);

}


for (inti = 26, j = 0;i <= 51; i++,j++) {

lookUpBase64Alphabet[i] = (char) ('a' + j);

}


for (inti = 52, j = 0;i <= 61; i++,j++) {

lookUpBase64Alphabet[i] = (char) ('0' + j);

}

lookUpBase64Alphabet[62] = (char)'+';

lookUpBase64Alphabet[63] = (char)'/';


}


privatestatic boolean isWhiteSpace(charoctect) {

return (octect == 0x20 ||octect == 0xd || octect == 0xa ||octect == 0x9);

}


privatestatic boolean isPad(charoctect) {

return (octect ==PAD);

}


privatestatic boolean isData(charoctect) {

return (octect <BASELENGTH && base64Alphabet[octect] != -1);

}


/**

* Encodes hex octects into Base64

* @param binaryData

*            Array containing binaryData

* @return Encoded Base64 array

*/

public static String encode(byte[] binaryData) {


if (binaryData ==null) {

returnnull;

}


intlengthDataBits = binaryData.length *EIGHTBIT;

if (lengthDataBits == 0) {

return"";

}


intfewerThan24bits = lengthDataBits %TWENTYFOURBITGROUP;

intnumberTriplets = lengthDataBits /TWENTYFOURBITGROUP;

intnumberQuartet = fewerThan24bits != 0 ?numberTriplets + 1 : numberTriplets;

charencodedData[] = null;


encodedData =new char[numberQuartet * 4];


byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;


intencodedIndex = 0;

intdataIndex = 0;


for (inti = 0; i < numberTriplets; i++) {

b1 =binaryData[dataIndex++];

b2 =binaryData[dataIndex++];

b3 =binaryData[dataIndex++];


l = (byte) (b2 & 0x0f);

k = (byte) (b1 & 0x03);


byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);

byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);

byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);


encodedData[encodedIndex++] =lookUpBase64Alphabet[val1];

encodedData[encodedIndex++] =lookUpBase64Alphabet[val2 | (k << 4)];

encodedData[encodedIndex++] =lookUpBase64Alphabet[(l << 2) |val3];

encodedData[encodedIndex++] =lookUpBase64Alphabet[b3 & 0x3f];

}


// form integral number of 6-bit groups

if (fewerThan24bits ==EIGHTBIT) {

b1 =binaryData[dataIndex];

k = (byte) (b1 & 0x03);


byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);

encodedData[encodedIndex++] =lookUpBase64Alphabet[val1];

encodedData[encodedIndex++] =lookUpBase64Alphabet[k << 4];

encodedData[encodedIndex++] =PAD;

encodedData[encodedIndex++] =PAD;

} elseif (fewerThan24bits ==SIXTEENBIT) {

b1 =binaryData[dataIndex];

b2 =binaryData[dataIndex + 1];

l = (byte) (b2 & 0x0f);

k = (byte) (b1 & 0x03);


byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);

byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);


encodedData[encodedIndex++] =lookUpBase64Alphabet[val1];

encodedData[encodedIndex++] =lookUpBase64Alphabet[val2 | (k << 4)];

encodedData[encodedIndex++] =lookUpBase64Alphabet[l << 2];

encodedData[encodedIndex++] =PAD;

}


return new String(encodedData);

}


/**

* Decodes Base64 data into octects

* @param encoded

*            string containing Base64 data

* @return Arraycontainind decoded data.

*/

public static byte[] decode(String encoded) {


if (encoded ==null) {

returnnull;

}


char[] base64Data = encoded.toCharArray();

// remove white spaces

int len = removeWhiteSpace(base64Data);


if (len %FOURBYTE != 0) {

returnnull;// should be divisible by four

}


intnumberQuadruple = (len /FOURBYTE);


if (numberQuadruple == 0) {

returnnew byte[0];

}


bytedecodedData[] = null;

byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;

char d1 = 0, d2 = 0, d3 = 0, d4 = 0;


int i = 0;

intencodedIndex = 0;

intdataIndex = 0;

decodedData =new byte[(numberQuadruple) * 3];


for (; i < numberQuadruple - 1; i++) {


if (!isData((d1 =base64Data[dataIndex++])) || !isData((d2 =base64Data[dataIndex++]))

|| !isData((d3 =base64Data[dataIndex++])) || !isData((d4 =base64Data[dataIndex++]))) {

returnnull;

} // if found "no data" just return null


b1 =base64Alphabet[d1];

b2 =base64Alphabet[d2];

b3 =base64Alphabet[d3];

b4 =base64Alphabet[d4];


decodedData[encodedIndex++] = (byte) (b1 << 2 |b2 >> 4);

decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));

decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);

}


if (!isData((d1 =base64Data[dataIndex++])) || !isData((d2 =base64Data[dataIndex++]))) {

returnnull;// if found "no data" just return null

}


b1 =base64Alphabet[d1];

b2 =base64Alphabet[d2];


d3 =base64Data[dataIndex++];

d4 =base64Data[dataIndex++];

if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters

if (isPad(d3) && isPad(d4)) {

if ((b2 & 0xf) != 0)// last 4 bits should be zero

{

returnnull;

}

byte[] tmp = new byte[i * 3 + 1];

System.arraycopy(decodedData, 0,tmp, 0, i * 3);

tmp[encodedIndex] = (byte) (b1 << 2 |b2 >> 4);

return tmp;

} else if (!isPad(d3) && isPad(d4)) {

b3 =base64Alphabet[d3];

if ((b3 & 0x3) != 0)// last 2 bits should be zero

{

returnnull;

}

byte[] tmp = new byte[i * 3 + 2];

System.arraycopy(decodedData, 0,tmp, 0, i * 3);

tmp[encodedIndex++] = (byte) (b1 << 2 |b2 >> 4);

tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));

return tmp;

} else {

returnnull;

}

} else {// No PAD e.g 3cQl

b3 =base64Alphabet[d3];

b4 =base64Alphabet[d4];

decodedData[encodedIndex++] = (byte) (b1 << 2 |b2 >> 4);

decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));

decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);


}


returndecodedData;

}


/**

* remove WhiteSpace from MIME containing encoded Base64 data.

* @param data

*            the byte array of base64 data (with WS)

* @return the new length

*/

private static int removeWhiteSpace(char[]data) {

if (data ==null) {

return 0;

}


// count characters that's not whitespace

int newSize = 0;

int len = data.length;

for (inti = 0; i < len; i++) {

if (!isWhiteSpace(data[i])) {

data[newSize++] =data[i];

}

}

returnnewSize;

}


}









0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水泡破了感染了怎么办 夏天腋下出汗会弄湿衣服怎么办 夏天腋下出汗多弄湿衣服怎么办 上眼皮干燥起皮怎么办 怀孕下面湿又痒怎么办 内裤穿久了有异味怎么办 刨腹产私处捂烂了怎么办 猫咬手指出血了怎么办 老有白带涌出来怎么办 耳朵里塞了珠子怎么办 树脂发光字烧了怎么办 马蹄莲长得太高怎么办 百合球的芽断了怎么办 种的百合开败怎么办 盆栽百合花开完之后怎么办 土养百合花谢了怎么办 多肉叶子不饱满怎么办 冬天富贵竹叶子发黄怎么办水养 富贵竹叶子发黄怎么办水养 水养富贵竹有虫怎么办 水养的富贵竹叶子发黄怎么办 百合花水里的盐放多了怎么办 芦荟叶子发黄干瘪了怎么办 水插百合不开花怎么办 干百合冷水泡了怎么办 牡丹籽油过期了怎么办 ps画布建小了怎么办 腰突然疼的受不了了怎么办 微信里面打不开表格怎么办? 浏览器未正常加载相关控件怎么办 猫的眼睛发炎了怎么办 橡胶手机壳松了怎么办 橡胶手机壳小了怎么办 苹果手机下载不了软件了怎么办 苹果手机浏览器下载不了软件怎么办 小狗吃了硬的棉花怎么办 小狗吃了隔尿垫里的棉花怎么办 眼睫毛掉进眼睛里怎么办 爱掉头发怎么办吃什么 头皮屑多头发干燥脱发怎么办 剪了头发后悔了怎么办