簡體   English   中英

將ByteArray從PHP發送到Java

[英]Sending ByteArray from PHP to Java

將JAVA的AES加密數據發送到PHP時遇到問題。

我的加密功能:

public static byte[] encrypt(String input, String key, String iv) {

    byte[] raw = key.getBytes(Charset.forName("UTF8"));
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    try {
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv.getBytes()));
        return cipher.doFinal(padString(input).getBytes("UTF-8"));
    } catch (Exception e) {
    }

    return new byte[0];
}

加密函數返回字節數組中的數據要發送POST數據,我使用的是apache HttpClient / HttpPost(首選,但不是必需的)

    HttpEntity params = MultipartEntityBuilder.create()
            .addTextBody("data1", new String(encodedData1, Charset.forName("UTF8")))
            .addTextBody("data2", new String((encodedData2, Charset.forName("UTF8")))
            .addTextBody("data3", "data3").build();

現在,我通過PHP服務器接收數據(我無法在此處添加功能)

        $data1 = filter_input(INPUT_POST, 'data1');
        $data2 = filter_input(INPUT_POST, 'data2');
        $data1decoded = DecryptAES($data1, $key, $iv);
        $data2decoded = DecryptAES($data2, $key, $iv);

將已編碼的byte []從JAVA發送到PHP的正確方法是什么? 我知道,Base64.encode可能是最好的選擇,但是不幸的是(正如我前面提到的),我無法修改PHP服務器端代碼... new String(encodedData1,Charset.forName(“ UTF8”))是不工作。

在node.js中,我可以使用toString('binary')以正確的格式發送數據。

您不能只創建新的String (Java對此太花哨了)。

采用

public static String byteToString(byte[] bytes) {
    StringBuilder b = new StringBuilder();
    for (byte c : bytes) {
        b.append((char) (c >= 0 ? c : 256 + c));
    }
    return b.toString();
}

用你的例子

HttpEntity params = MultipartEntityBuilder.create()
          .addTextBody("data", byteToString(data))
          .build();

代替

new String(encodedData1, Charset.forName("UTF8"))

你應該使用

new String(encodedData1)

加密后,您的字節數組不再包含UTF8文本。 通過使用addBinaryBody方法以原始形式發送字節,可以保留字節的精確結構,而不是為了使用addTextBody方法將其強制轉換為String。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM