您的位置:首页 > 编程语言 > Java开发

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

2016-04-29 03:27 513 查看
今天用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 {

private
static final
int BASELENGTH = 128;

private
static final
int LOOKUPLENGTH = 64;

private
static final
int TWENTYFOURBITGROUP = 24;

private
static final
int EIGHTBIT = 8;

private
static final
int SIXTEENBIT = 16;

private
static final
int FOURBYTE = 4;

private
static final
int SIGN = -128;

private
static char
PAD =
'=';

private
static byte[]
base64Alphabet =
new byte[BASELENGTH];

private
static
char[] lookUpBase64Alphabet =
new
char[LOOKUPLENGTH];

static {

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

base64Alphabet[i] = -1;

}

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

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

}

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

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

}

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

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

}

base64Alphabet['+'] = 62;

base64Alphabet['/'] = 63;

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

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

}

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

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

}

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

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

}

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

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

}

private
static boolean isWhiteSpace(char
octect) {

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

}

private
static boolean isPad(char
octect) {

return (octect ==
PAD);

}

private
static boolean isData(char
octect) {

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) {

return
null;

}

int
lengthDataBits = binaryData.length *
EIGHTBIT;

if (lengthDataBits == 0) {

return
"";

}

int
fewerThan24bits = lengthDataBits %
TWENTYFOURBITGROUP;

int
numberTriplets = lengthDataBits /
TWENTYFOURBITGROUP;

int
numberQuartet = fewerThan24bits != 0 ?
numberTriplets + 1 : numberTriplets;

char
encodedData[] = null;

encodedData =
new
char[numberQuartet * 4];

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

int
encodedIndex = 0;

int
dataIndex = 0;

for (int
i = 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;

} else
if (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 Array
containind decoded data.

*/

public
static byte[] decode(String
encoded) {

if (encoded ==
null) {

return
null;

}

char[]
base64Data = encoded.toCharArray();

// remove white spaces

int
len = removeWhiteSpace(base64Data);

if (len %
FOURBYTE != 0) {

return
null;// should be divisible by four

}

int
numberQuadruple = (len /
FOURBYTE);

if (numberQuadruple == 0) {

return
new byte[0];

}

byte
decodedData[] = null;

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

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

int
i = 0;

int
encodedIndex = 0;

int
dataIndex = 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++]))) {

return
null;

} // 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++]))) {

return
null;// 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

{

return
null;

}

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

{

return
null;

}

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 {

return
null;

}

} 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);

}

return
decodedData;

}

/**

* 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 (int
i = 0; i <
len; i++) {

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

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

}

}

return
newSize;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: