从android客户端到java服务器的AES音频流加密

从android客户端到java服务器的AES音频流加密,java,android,sockets,encryption,Java,Android,Sockets,Encryption,我正在尝试开发一个android应用程序,它可以将AES格式的加密音频流发送到java服务器 音频流作为字节数组定期通过套接字发送到服务器。我的想法是在AES中加密bytearray并将其发送到服务器,服务器将对其进行解密 加密/解密的类如下所示: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class

我正在尝试开发一个android应用程序,它可以将AES格式的加密音频流发送到java服务器

音频流作为字节数组定期通过套接字发送到服务器。我的想法是在AES中加密bytearray并将其发送到服务器,服务器将对其进行解密

加密/解密的类如下所示:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class AESEncr {

    static String IV = "AAAAAAAAAAAAAAAA";
    static String encryptionKey = "0123456789abcdef";

    public static byte[] encrypt(byte[] data) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        return cipher.doFinal(data);
    }

    public static byte[] decrypt(byte[] cipherText) throws Exception{
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        return cipher.doFinal(cipherText);
    }
}
该类已经在android上进行了本地测试(也就是说,在发送流时,我会:

out.write(AESEncr.decrypt(AESEncr.encrypt(bArray)));
在android代码中,服务器可以轻松管理流,这让我觉得加密/解密方法中没有算法问题)。使用的流类型为OutputStream和InputStream

数据实际上是通过以下方式发送的:

out.write(AESEncr.encrypt(bArray));
服务器通过以下方式接收数据:

while(in.read(receiveData)!=-1){
    receiveData = AESEncr.decrypt(receiveData);
    /*Playback of the current stream*/
}
当服务器尝试解码bytearray时,我收到以下错误:

javax.crypto.BadPaddingException: Given final block not properly padded
我试图让这两部分在Base64中处理bytearray,但得到了相同的结果


我怎样才能解决这个问题?是否可能两个套接字都未正确发送数据?有没有其他方法来加密从android客户端到java服务器的音频流?我想我可以使用SSL,但我不确定这是正确的选择(考虑到该软件,我甚至不认为我可以使用它。)。

您是否尝试解密您在客户端发送的内容?在检查其他可能的问题之前,请确保您的方法是正确的。另外,添加发送此数据的方式可能会有所帮助。奇怪的是,似乎表明PKCS5Padding与AES不兼容,尽管该文件明确将其列为有效选项。在任何情况下,您是否尝试将其切换到PKCS7Padding?@adelphus它们的指定方式不同,但它们的实现方式完全相同。“PKCS5Padding”的名称用于历史原因(DES),与PKCS7Padding完全兼容。@greenapps发送方的chunck大小为1296,但服务器仅接收1280,我显式地将in.read()函数设置为读取大小为1296的块。如图所示。一切正常的行为。您必须再次进行读取,以请求剩余的字节。没什么新鲜事。