将ByteArray从PHP发送到Java

将ByteArray从PHP发送到Java,java,php,post,aes,url-encoding,Java,Php,Post,Aes,Url Encoding,我在将AES加密数据从JAVA发送到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 ciphe

我在将AES加密数据从JAVA发送到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数据,我使用ApacheHttpClient/HttpPost(首选,但不是必需的)

现在,我通过PHP服务器接收数据(我不能在这里添加功能)

将编码字节[]从JAVA发送到PHP的正确方法是什么?我知道,Base64.encode可能是最好的选择,但不幸的是(正如我前面提到的)我无法修改PHP服务器端代码。。。新字符串(encodedData1,Charset.forName(“UTF8”))不起作用


在node.js中,我可以使用toString('binary')以正确的格式发送数据。

您不能只创建新的
字符串(Java太花哨了)。

使用

以你为例

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

new String(encodedData1, Charset.forName("UTF8"))
你应该使用

new String(encodedData1)

加密后,字节数组不再包含UTF8文本。通过使用addBinaryBody方法以原始形式发送字节,而不是将其强制转换为字符串以使用addTextBody方法,可以保留字节aray的确切结构。

请将文本与二进制混合,否则会导致损坏。我也不清楚你用的是什么语言。你能发布你尝试过的吗?Java。我需要将旧库重写为Java。。。接收数据的客户端是用PHP编写的。我不明白你为什么需要转换,请发布相关的PHP代码,否则这个问题无法回答(至少我不能回答,我想其他没有水晶球的人也不能回答)。通常使用base 64编码。@owlstead我已经尝试使用MultipartEntityBuilder#addBinaryBody,但它的内容会转到PHP$\u文件数组。我遗漏了什么吗?我也尝试过不编码。没有成功:(从apache发送这样的字符串给了我错误500。你试过成功吗?是的。我在php fpm+nginx上测试了它。错误日志说什么?
HttpEntity params = MultipartEntityBuilder.create()
          .addTextBody("data", byteToString(data))
          .build();
new String(encodedData1, Charset.forName("UTF8"))
new String(encodedData1)