After the underlying device C language RC4 is encrypted, why can't Java use rc4 to decrypt, but other people's PHP programs can decrypt successfully?
PHP中文网
PHP中文网 2017-06-17 09:15:15
0
1
1253

The underlying device is a wifi probe that regularly pushes data to a service. This service address receives the data and uses rc4 to decrypt it.
The underlying device rc4 encryption is written in c language.

javaReceiver

@RequestMapping("/acc")
public void acc1(HttpServletRequest request,HttpServletResponse response) throws Exception{
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    System.out.println(sdf.format(new Date())+"-->post begin.......");
     BufferedReader reader = new BufferedReader(
             new InputStreamReader(request.getInputStream(),"UTF-8"));
     String line=null;
     StringBuilder buffer = new StringBuilder();
     while((line = reader.readLine())!=null){
             buffer.append(line);
           }
     System.out.println("recive:   "+buffer.toString());
     String key = buffer.toString().substring(0, 16);
     String content =  buffer.toString().substring(16);
     System.out.println("before 16 string:    "+key);
     System.out.println("content :    "+content);
     System.out.println("decrypt :       "+RC4.HloveyRC4(content, key));
     
    System.out.println(sdf.format(new Date())+"-->post end.......");
}

java rc4 decryption program:
public class RC4 {

public static String HloveyRC4(String aInput,String aKey) {   
    int[] iS = new int[256];   
    byte[] iK = new byte[256];   
    for (int i=0;i<256;i++)   
        iS[i]=i;   
    int j = 1;   
    for (short i= 0;i<256;i++) {   
        iK[i]=(byte)aKey.charAt((i % aKey.length()));   
    }   
    j=0;   
    for (int i=0;i<255;i++){   
        j=(j+iS[i]+iK[i]) % 256;   
        int temp = iS[i];   
        iS[i]=iS[j];   
        iS[j]=temp;   
    }   
    int i=0; j=0;   
    char[] iInputChar = aInput.toCharArray();   
    char[] iOutputChar = new char[iInputChar.length];   
    for(short x = 0;x<iInputChar.length;x++) {   
        i = (i+1) % 256;   
        j = (j+iS[i]) % 256;   
        int temp = iS[i];   
        iS[i]=iS[j];   
        iS[j]=temp;   
        int t = (iS[i]+(iS[j] % 256)) % 256;   
        int iY = iS[t];   
        char iCY = (char)iY;   
        iOutputChar[x] =(char)( iInputChar[x] ^ iCY) ;      
    }   
    return new String(iOutputChar);   
}  }


php decryption program can decrypt successfully
$json=file_get_contents('php://input');

if ($json) {

$time_str=date('YmdHms',time());

//开始RC4解密
$key = substr($json,0,16);                               
$json = rc4($key, substr($json,16));

$json=mb_convert_encoding($json,"UTF-8","auto");

}

function rc4($pwd, $data)//$pwd key $data needs to be encrypted string
{

    $key[] ="";
    $box[] ="";
    $cipher="";
    $pwd_length = strlen($pwd);
    $data_length = strlen($data);
 
    for ($i = 0; $i < 256; $i++)
    {
        $key[$i] = ord($pwd[$i % $pwd_length]);
        $box[$i] = $i;
    }
 
    for ($j = $i = 0; $i < 256; $i++)
    {
        $j = ($j + $box[$i] + $key[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
 
    for ($a = $j = $i = 0; $i < $data_length; $i++)
    {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
 
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
 
        $k = $box[(($box[$a] + $box[$j]) % 256)];
        $cipher .= chr(ord($data[$i]) ^ $k);
    }
   // var_dump($cipher);
    //exit();
    return $cipher;

}

The data after decryption in the java console is garbled

Why does the java decryption fail? I tried different encodings to obtain the data, but they were all garbled after decryption.

PHP中文网
PHP中文网

认证高级PHP讲师

reply all(1)
为情所困

Can’t we use JCE’s RC4 to decrypt? Also, are the keys on both sides correct?

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template