typedef unsigned long ULONG;
/*初始化秘钥*/
void rc4_init(unsigned char *s, unsigned char *data,unsigned Len) { //初始化函数
int i,state[256];
int index1=0;
int index2=0;
unsigned char k[256] = {0},tmp;
for(i = 0;i < 256;i++) {
// s[i] = i;
state[i] = i;
}
for(i = 0; i < 256; i++) {
index2 = ((data[index1]%256)+(state[i]%256)+index2)%256;
tmp = state[i];
state[i] = state[index2]; //交换s[i]和s[j]
state[index2] = tmp;
index1=(index1+1)%strlen(data);
// s[i]=state[i];
}
for (i=0; i < 256; i++) {
s[i]=state[i];
}
}
/*加解密主函数*/
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len, unsigned char tdata[]) { //加解密
int x = 0, y = 0,xorIndex = 0;
unsigned char tmp,var[2];
unsigned char result[200];
int k = 0;
int i = 0;
for(k = 0;k < Len;k++) {
x = (x + 1)%256;
y = ((s[x]%256)+y)%256;
tmp = s[x];
s[x] = s[y]; //交换s[x]和s[y]
s[y] = tmp;
xorIndex = ((s[x]%256)+(s[y]%256))%256;
result[k] =Data[k]^s[xorIndex];
Data[k]=result[k];
sprintf(var,"%02x",Data[k]&0xff);
strcat(tdata,var);
}
}
/*十六进制类型的字符串转换为char类型的字符串*/
void toChar(unsigned char data[]){
unsigned char tmp[2],rdata[5000]={0};
unsigned char sss;
int i = 0,k=0,c=0;
int first,second;
memcpy(rdata,data,strlen(data));
memset(data,0,strlen(data));
for(;i<strlen(rdata);){
tmp[0] = rdata[i];
tmp[1] = rdata[i+1];
if(tmp[0]>'9'){
first=(tmp[0]&0x0f)+9;
}else{
first=(tmp[0]&0x0f);
}
if(tmp[1]>'9'){
second=(tmp[1]&0x0f)+9;
}else{
second=tmp[1]&0x0f;
}
data[k]=(first<<4)|(second);
k=k+1;
i=i+2;
}
}
/*
*加解密的总入口函数
*key:秘钥
*pData:json请求串中的内容
*url:json请求串的url
*compValue:校验返回值是否正确
*reValue:解密后的返回值,留做解析返回值中的内容
*/
void testaa(char* key, char* pData, char* url, char* compValue, char* reValue){
unsigned char s[256] = {0},st[256] = {0},tmp, tdata[5000] = {0}, ddata[5000] = {0}; //S-box
int i = 0;
// char key[256] = "0123456jac";
// char pData[] = "{\"isLogin\":\"N\",\"os\":\"Android 4.0.3\",\"device_serial_no\":\"2F96000200000001\",\"channelId\":\"jacChannel010\",\"baiDuAppId\":\"3090323\",\"imei\":\"861519010138649\",\"cpu_serial_no\":\"0000000000000000\",\"uuidType\":\"UDID\",\"mac\":\"24:db:ac:43:34:30\",\"resolution\":\"720 * 1280\",\"udid\":\"BF7FC743925337187AF72F0CB382A0A9\",\"openType\":\"Normal\",\"version\":\"1.2.0\",\"netWork\":\"wifi\",\"ip\":\"172.20.105.2\",\"phoneNo\":\"\",\"baiDuUserId\":\"1140712534359588480\",\"deviceNo\":\"BF7FC743925337187AF72F0CB382A0A9\",\"baiDuChannelId\":\"3730713738835285959\",\"ua\":\"HUAWEI U9500\",\"imsi\":\"460025101003722\",\"clientType\":\"3\"}";
ULONG len = strlen(pData);
lr_log_message("pData = %s, length = %d\n\n",pData,len);
rc4_init(s,(unsigned char *)key,strlen(key)); //初始化
for(i = 0; i < 256;i++) { //用st[i]暂时保留经过初始化的s[i],很重要的!!!
st[i] = s[i];
}
rc4_crypt(s,(unsigned char *)pData,len,tdata);//加密
lr_save_string((char*)tdata,"JSONHEAD");
lr_save_string(url,"URL");
lr_rendezvous("集结点");
lr_start_transaction(url);
web_reg_save_param("viewBenefit",
"LB=\n",
"RB=",
LAST);
web_custom_request("web_custom_request",
"URL={URL}",
"Method=POST",
"Resource=0",
"RecContentType=application/json",
"Referer=",
"Mode=HTTP",
"EncType=application/json",
"Body=phoneNum=@@@@@@={JSONHEAD}",
LAST);
lr_end_transaction(url, LR_AUTO);
memset(tdata, 0, sizeof(tdata));
for (i=0;i<strlen(lr_eval_string("{viewBenefit}"));i++) {
tmp = lr_eval_string("{viewBenefit}")[i];
ddata[i]=tmp;
}
toChar(ddata);
rc4_init(s,(unsigned char *)key,strlen(key)); //初始化密钥
rc4_crypt(st,(unsigned char *)ddata,strlen(ddata),tdata);//解密
if(strstr(ddata,compValue) != NULL){
lr_log_message("test OK : %s",url);
}
memcpy(reValue,ddata,strlen(ddata));
}
/*
*reValue:保存json请求返回的字符串
*keyWord:根据左边界和右边界截取出的字符串,保存下来作为后续json请求串的参数
*left:查找keyWord所需要的左边界
*right:查找keyWord所需要的右边界
*/
void getValue(char* left, char* right, char* keyWord, char* reValue){
char *p1,*p2;
int i;
p1=(char*)strstr(reValue,left);
p2=(char*)strstr(reValue,right);
for (i=0; i<p2-p1-strlen(left); i++) {
keyWord[i] = *(p1+strlen(left)+i);
}
}
Action()
{
char reValue[5000] = {0};//存储返回的内容
char keyWord[256] = {0};//要获取的值
char compValue[]="status\":\"000000";//存储待匹配的内容
char pdata[]="{\"isLogin\":\"N\",\"os\":\"Android 4.0.3\",\"device_serial_no\":\"2F96000200000001\",\"channelId\":\"jacChannel010\",\"baiDuAppId\":\"3090323\",\"imei\":\"861519010138649\",\"cpu_serial_no\":\"0000000000000000\",\"uuidType\":\"UDID\",\"mac\":\"24:db:ac:43:34:30\",\"resolution\":\"720 * 1280\",\"udid\":\"BF7FC743925337187AF72F0CB382A0A9\",\"openType\":\"Normal\",\"version\":\"1.2.0\",\"netWork\":\"wifi\",\"ip\":\"172.20.105.2\",\"phoneNo\":\"\",\"baiDuUserId\":\"1140712534359588480\",\"deviceNo\":\"BF7FC743925337187AF72F0CB382A0A9\",\"baiDuChannelId\":\"3730713738835285959\",\"ua\":\"HUAWEI U9500\",\"imsi\":\"460025101003722\",\"clientType\":\"3\"}";
/*接口json内容*/
char key[]="0123456jac";//固定加密秘钥
char url[]="http://192.168.100.11:9092/juaicai-user/apkLogin/userLogUpload.jsonx";//请求接口
char left[50]="dataCode\":\"";//待查找的左边界
char right[50]="\",\"dataName";//待查找的右边界
web_set_max_html_param_len("10000000");//设置最大缓冲区
testaa(key,pdata,url,compValue,reValue);//加解密入口
lr_log_message("reValue = %s\n\n",reValue);
getValue(left,right,keyWord,reValue);//从返回的json串中查找需要的内容,保存在keyWord中,供后续接口请求中使用
lr_log_message("keyWord11111111 = %s, len = %d\n",keyWord,strlen(keyWord));
return 0;
}