LoadRunner RC4加解密

来源:互联网 发布:南方电网 知乎 编辑:程序博客网 时间:2024/05/17 00:07


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;
}
0 0
原创粉丝点击