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

最近做个项目,服务器使用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!代码上传完毕,需要注意的是数据的二进制和十六进制的转换,映射对应表必须一一对应,否则就会出错了。

初次写博客,不好的地方,希望大家指出,不要喷。谢谢谅解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值