您的位置:首页 > 编程语言 > C语言/C++

数据通信之数据转码字节映射加密发送:客户端c++和服务器java

2014-07-14 17:00 337 查看
最近做个项目,服务器使用java开发的,客户端用c++,通信打包格式用的json,领导要求做个简单的加密,让数据看起来不是那么明显就好,于是乎想到了转码发送数据的方法,具体如下,

服务器(java):

由于是单向通信,所以服务器存放发送字节映射表

import java.io.UnsupportedEncodingException;

public class Encrypt {

/**

* 发送字节映射表

*/

private static byte[] m_SendByteMap = {

(byte) 0x70, (byte) 0x2F, (byte) 0x40, (byte) 0x5F, (byte) 0x44, (byte) 0x8E, (byte) 0x6E, (byte) 0x45, (byte) 0x7E, (byte) 0xAB,

(byte) 0x2C, (byte) 0x1F, (byte) 0xB4, (byte) 0xAC, (byte) 0x9D, (byte) 0x91, (byte) 0x0D, (byte) 0x36, (byte) 0x9B, (byte) 0x0B,

(byte) 0xD4, (byte) 0xC4, (byte) 0x39, (byte) 0x74, (byte) 0xBF, (byte) 0x23, (byte) 0x16, (byte) 0x14, (byte) 0x06, (byte) 0xEB,
//--30

(byte) 0x04, (byte) 0x3E, (byte) 0x12, (byte) 0x5C, (byte) 0x8B, (byte) 0xBC, (byte) 0x61, (byte) 0x63, (byte) 0xF6, (byte) 0xA5,

(byte) 0xE1, (byte) 0x65, (byte) 0xD8, (byte) 0xF5, (byte) 0x5A, (byte) 0x07, (byte) 0xF0, (byte) 0x13, (byte) 0xF2, (byte) 0x20,
//--50

(byte) 0x6B, (byte) 0x4A, (byte) 0x24, (byte) 0x59, (byte) 0x89, (byte) 0x64, (byte) 0xD7, (byte) 0x42, (byte) 0x6A, (byte) 0x5E,

(byte) 0x3D, (byte) 0x0A, (byte) 0x77, (byte) 0xE0, (byte) 0x80, (byte) 0x27, (byte) 0xB8, (byte) 0xC5, (byte) 0x8C, (byte) 0x0E,

(byte) 0xFA, (byte) 0x8A, (byte) 0xD5, (byte) 0x29, (byte) 0x56, (byte) 0x57, (byte) 0x6C, (byte) 0x53, (byte) 0x67, (byte) 0x41,
//--80

(byte) 0xE8, (byte) 0x00, (byte) 0x1A, (byte) 0xCE, (byte) 0x86, (byte) 0x83, (byte) 0xB0, (byte) 0x22, (byte) 0x28, (byte) 0x4D,

(byte) 0x3F, (byte) 0x26, (byte) 0x46, (byte) 0x4F, (byte) 0x6F, (byte) 0x2B, (byte) 0x72, (byte) 0x3A, (byte) 0xF1, (byte) 0x8D,
//--100

(byte) 0x97, (byte) 0x95, (byte) 0x49, (byte) 0x84, (byte) 0xE5, (byte) 0xE3, (byte) 0x79, (byte) 0x8F, (byte) 0x51, (byte) 0x10,

(byte) 0xA8, (byte) 0x82, (byte) 0xC6, (byte) 0xDD, (byte) 0xFF, (byte) 0xFC, (byte) 0xE4, (byte) 0xCF, (byte) 0xB3, (byte) 0x09,
//120

(byte) 0x5D, (byte) 0xEA, (byte) 0x9C, (byte) 0x34, (byte) 0xF9, (byte) 0x17, (byte) 0x9F, (byte) 0xDA, (byte) 0x87, (byte) 0xF8,

(byte) 0x15, (byte) 0x05, (byte) 0x3C, (byte) 0xD3, (byte) 0xA4, (byte) 0x85, (byte) 0x2E, (byte) 0xFB, (byte) 0xEE, (byte) 0x47,
//140

(byte) 0x3B, (byte) 0xEF, (byte) 0x37, (byte) 0x7F, (byte) 0x93, (byte) 0xAF, (byte) 0x69, (byte) 0x0C, (byte) 0x71, (byte) 0x31,

(byte) 0xDE, (byte) 0x21, (byte) 0x75, (byte) 0xA0, (byte) 0xAA, (byte) 0xBA, (byte) 0x7C, (byte) 0x38, (byte) 0x02, (byte) 0xB7,
//160

(byte) 0x81, (byte) 0x01, (byte) 0xFD, (byte) 0xE7, (byte) 0x1D, (byte) 0xCC, (byte) 0xCD, (byte) 0xBD, (byte) 0x1B, (byte) 0x7A,

(byte) 0x2A, (byte) 0xAD, (byte) 0x66, (byte) 0xBE, (byte) 0x55, (byte) 0x33, (byte) 0x03, (byte) 0xDB, (byte) 0x88, (byte) 0xB2,
//180

(byte) 0x1E, (byte) 0x4E, (byte) 0xB9, (byte) 0xE6, (byte) 0xC2, (byte) 0xF7, (byte) 0xCB, (byte) 0x7D, (byte) 0xC9, (byte) 0x62,

(byte) 0xC3, (byte) 0xA6, (byte) 0xDC, (byte) 0xA7, (byte) 0x50, (byte) 0xB5, (byte) 0x4B, (byte) 0x94, (byte) 0xC0, (byte) 0x92,
//200

(byte) 0x4C, (byte) 0x11, (byte) 0x5B, (byte) 0x78, (byte) 0xD9, (byte) 0xB1, (byte) 0xED, (byte) 0x19, (byte) 0xE9, (byte) 0xA1,

(byte) 0x1C, (byte) 0xB6, (byte) 0x32, (byte) 0x99, (byte) 0xA3, (byte) 0x76, (byte) 0x9E, (byte) 0x7B, (byte) 0x6D, (byte) 0x9A,
//220

(byte) 0x30, (byte) 0xD6, (byte) 0xA9, (byte) 0x25, (byte) 0xC7, (byte) 0xAE, (byte) 0x96, (byte) 0x35, (byte) 0xD0, (byte) 0xBB,

(byte) 0xD2, (byte) 0xC8, (byte) 0xA2, (byte) 0x08, (byte) 0xF3, (byte) 0xD1, (byte) 0x73, (byte) 0xF4, (byte) 0x48, (byte) 0x2D,
//240

(byte) 0x90, (byte) 0xCA, (byte) 0xE2, (byte) 0x58, (byte) 0xC1, (byte) 0x18, (byte) 0x52, (byte) 0xFE, (byte) 0xDF, (byte) 0x68,

(byte) 0x98, (byte) 0x54, (byte) 0xEC, (byte) 0x60, (byte) 0x43, (byte) 0x0F };

/**

* 发送数据时映射数据

*

* @param cbData

* byte

* @return byte

*/

static private byte mapSendByte(byte cbData) {

int index = -1;

if (cbData < 0) {

index = 256 + cbData;

}

else {

index = cbData;

}

if (index > 255) {

index -= 256;

}

byte cbMap = m_SendByteMap[index];

return cbMap;

}

/**

* 加密

* @param data

* @return

*/

public static byte[] encrypted(String data) {

try {

byte[] byteContent = data.getBytes("utf-8");

// 字节映射

for (int i = 0; i < byteContent.length; i++) {

byteContent[i] = mapSendByte(byteContent[i]);

}

return byteContent;

} catch (UnsupportedEncodingException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

return null;

}

/**将二进制转换成16进制

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

}

在需要使用的地方加上几行代码即可

String json = "测试数据";

byte[] encryptByte = Encrypt.encrypted(json);

String tsr = Encrypt.parseByte2HexStr(encryptByte);

以上为服务器代码,下来看客户端代码,

unsigned char m_RecvByteMap[256];

unsigned char recvByteMap[256] = {

(byte) 0x51, (byte) 0xA1, (byte) 0x9E, (byte) 0xB0, (byte) 0x1E,

(byte) 0x83, (byte) 0x1C, (byte) 0x2D, (byte) 0xE9, (byte) 0x77,
//10

(byte) 0x3D, (byte) 0x13, (byte) 0x93, (byte) 0x10, (byte) 0x45,

(byte) 0xFF, (byte) 0x6D, (byte) 0xC9, (byte) 0x20, (byte) 0x2F,
//20

(byte) 0x1B, (byte) 0x82, (byte) 0x1A, (byte) 0x7D, (byte) 0xF5,

(byte) 0xCF, (byte) 0x52, (byte) 0xA8, (byte) 0xD2, (byte) 0xA4,
//30

(byte) 0xB4, (byte) 0x0B, (byte) 0x31, (byte) 0x97, (byte) 0x57,

(byte) 0x19, (byte) 0x34, (byte) 0xDF, (byte) 0x5B, (byte) 0x41,
//40

(byte) 0x58, (byte) 0x49, (byte) 0xAA, (byte) 0x5F, (byte) 0x0A,

(byte) 0xEF, (byte) 0x88, (byte) 0x01, (byte) 0xDC, (byte) 0x95,
//50

(byte) 0xD4, (byte) 0xAF, (byte) 0x7B, (byte) 0xE3, (byte) 0x11,

(byte) 0x8E, (byte) 0x9D, (byte) 0x16, (byte) 0x61, (byte) 0x8C,
//60

(byte) 0x84, (byte) 0x3C, (byte) 0x1F, (byte) 0x5A, (byte) 0x02,

(byte) 0x4F, (byte) 0x39, (byte) 0xFE, (byte) 0x04, (byte) 0x07,
//70

(byte) 0x5C, (byte) 0x8B, (byte) 0xEE, (byte) 0x66, (byte) 0x33,

(byte) 0xC4, (byte) 0xC8, (byte) 0x59, (byte) 0xB5, (byte) 0x5D,
//80

(byte) 0xC2, (byte) 0x6C, (byte) 0xF6, (byte) 0x4D, (byte) 0xFB,

(byte) 0xAE, (byte) 0x4A, (byte) 0x4B, (byte) 0xF3, (byte) 0x35,
//90

(byte) 0x2C, (byte) 0xCA, (byte) 0x21, (byte) 0x78, (byte) 0x3B,

(byte) 0x03, (byte) 0xFD, (byte) 0x24, (byte) 0xBD, (byte) 0x25,
//100

(byte) 0x37, (byte) 0x29, (byte) 0xAC, (byte) 0x4E, (byte) 0xF9,

(byte) 0x92, (byte) 0x3A, (byte) 0x32, (byte) 0x4C, (byte) 0xDA,
//110

(byte) 0x06, (byte) 0x5E, (byte) 0x00, (byte) 0x94, (byte) 0x60,

(byte) 0xEC, (byte) 0x17, (byte) 0x98, (byte) 0xD7, (byte) 0x3E,
//120

(byte) 0xCB, (byte) 0x6A, (byte) 0xA9, (byte) 0xD9, (byte) 0x9C,

(byte) 0xBB, (byte) 0x08, (byte) 0x8F, (byte) 0x40, (byte) 0xA0,
//130

(byte) 0x6F, (byte) 0x55, (byte) 0x67, (byte) 0x87, (byte) 0x54,

(byte) 0x80, (byte) 0xB2, (byte) 0x36, (byte) 0x47, (byte) 0x22,
//140

(byte) 0x44, (byte) 0x63, (byte) 0x05, (byte) 0x6B, (byte) 0xF0,

(byte) 0x0F, (byte) 0xC7, (byte) 0x90, (byte) 0xC5, (byte) 0x65,
//150

(byte) 0xE2, (byte) 0x64, (byte) 0xFA, (byte) 0xD5, (byte) 0xDB,

(byte) 0x12, (byte) 0x7A, (byte) 0x0E, (byte) 0xD8, (byte) 0x7E,
//160

(byte) 0x99, (byte) 0xD1, (byte) 0xE8, (byte) 0xD6, (byte) 0x86,

(byte) 0x27, (byte) 0xBF, (byte) 0xC1, (byte) 0x6E, (byte) 0xDE,
//170

(byte) 0x9A, (byte) 0x09, (byte) 0x0D, (byte) 0xAB, (byte) 0xE1,

(byte) 0x91, (byte) 0x56, (byte) 0xCD, (byte) 0xB3, (byte) 0x76,
//180

(byte) 0x0C, (byte) 0xC3, (byte) 0xD3, (byte) 0x9F, (byte) 0x42,

(byte) 0xB6, (byte) 0x9B, (byte) 0xE5, (byte) 0x23, (byte) 0xA7,
//190

(byte) 0xAD, (byte) 0x18, (byte) 0xC6, (byte) 0xF4, (byte) 0xB8,

(byte) 0xBE, (byte) 0x15, (byte) 0x43, (byte) 0x70, (byte) 0xE0,
//200

(byte) 0xE7, (byte) 0xBC, (byte) 0xF1, (byte) 0xBA, (byte) 0xA5,

(byte) 0xA6, (byte) 0x53, (byte) 0x75, (byte) 0xE4, (byte) 0xEB,
//210

(byte) 0xE6, (byte) 0x85, (byte) 0x14, (byte) 0x48, (byte) 0xDD,

(byte) 0x38, (byte) 0x2A, (byte) 0xCC, (byte) 0x7F, (byte) 0xB1,
//220

(byte) 0xC0, (byte) 0x71, (byte) 0x96, (byte) 0xF8, (byte) 0x3F,

(byte) 0x28, (byte) 0xF2, (byte) 0x69, (byte) 0x74, (byte) 0x68,
//230

(byte) 0xB7, (byte) 0xA3, (byte) 0x50, (byte) 0xD0, (byte) 0x79,

(byte) 0x1D, (byte) 0xFC, (byte) 0xCE, (byte) 0x8A, (byte) 0x8D,
//240

(byte) 0x2E, (byte) 0x62, (byte) 0x30, (byte) 0xEA, (byte) 0xED,

(byte) 0x2B, (byte) 0x26, (byte) 0xB9, (byte) 0x81, (byte) 0x7C,
//250

(byte) 0x46, (byte) 0x89, (byte) 0x73, (byte) 0xA2, (byte) 0xF7,

(byte) 0x72 };

memcpy(m_RecvByteMap, recvByteMap, 256);

void XXXX::NetCallBackFuncByServer(CCHttpClient* client, CCHttpResponse* response)

{

//--从服务器获取的数据

std::vector<char> *buffer = response->getResponseData();

std::string bufffff(buffer->begin(),buffer->end());

//--进行转码

std::vector<char>* buf = new std::vector<char>;

parseHexStr2Byte(buf, bufffff.c_str(), bufffff.length());

CCLOG("parseHexStr2Byte end");

//--RecvByteMap

vector<char>::iterator iter = buf->begin();

while (iter != buf->end())

{

*iter = (unsigned char)mapRecvByte(*iter);

iter++;

}

std::string outBuf(buf->begin(),buf->end());

const char* outData = outBuf.c_str();

CCLOG("outData = %s", outData);

}

unsigned char XXXX::mapRecvByte(char cbData) {

int index = cbData;

if (index < 0) {

index += 256;

}

unsigned char cbMap = m_RecvByteMap[index];

return cbMap;

}

void XXXX::parseHexStr2Byte(std::vector<char>* outData, const char* data, int length) {

CCLOG("length = %d", length);

if (length < 1)

return;

char highByte, lowByte, outByte;

for (int i = 0; i < length / 2; i++) {

highByte = data[i * 2];

lowByte = data[i * 2 + 1];

CCLOG("**********************************************");

CCLOG("old ----highByte = %d, lowByte = %d", highByte, lowByte);

if (highByte > 0x39)

highByte -= 0x37;

else

highByte -= 0x30;

if (lowByte > 0x39)

lowByte -= 0x37;

else

lowByte -= 0x30;

CCLOG("new ------highByte = %d, lowByte = %d", highByte, lowByte);

outByte = (highByte << 4) | lowByte;

CCLOG("%d---outByte = %d", i, outByte);

outData->push_back(outByte);

}

}

Ok!代码上传完毕,需要注意的是数据的二进制和十六进制的转换,映射对应表必须一一对应,否则就会出错了。

初次写博客,不好的地方,希望大家指出,不要喷。谢谢谅解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: