Java Android-删除解密中的填充位

Java Android-删除解密中的填充位,java,android,cryptography,padding,Java,Android,Cryptography,Padding,我正在使用自己定制的加密方法开发一个安全应用程序,但在消息解密方面遇到了问题 根据该理论,必须对输入进行填充,以满足执行加密所需的位。但是,即使在解密之后,填充的比特仍然保持不变 下面是一个例子: input (before padding) : q input (after padding) : 113 0 0 0 0 0 0 0 (in Bytes) 然后我执行一些代码: bytes[] a = encrypt(input); bytes[] b = decrypt(a); Strin

我正在使用自己定制的加密方法开发一个安全应用程序,但在消息解密方面遇到了问题

根据该理论,必须对输入进行填充,以满足执行加密所需的位。但是,即使在解密之后,填充的比特仍然保持不变

下面是一个例子:

input (before padding) : q
input (after padding)  : 113 0 0 0 0 0 0 0 (in Bytes)
然后我执行一些代码:

bytes[] a = encrypt(input);
bytes[] b = decrypt(a);

String output = "";
output = new String(b, "UTF-8");
System.out.println上的输出如下:

b      : 113 0 0 0 0 0 0 0
output : q[][][][][][][]
我不知道如何去除填充的部分。我目前正在使用以下功能:

public String processOutput(String dtxt){
    String result = "";
    int l = dtxt.length();
    for(int i=0;i<l-16;i++) result = result + dtxt.charAt(i);
    for(int i=l-16;i<l;i++){
        if((long)dtxt.charAt(i)!=0){
            result = result + dtxt.charAt(i);
        }
    } return result;
}
publicstringprocessoutput(stringdtxt){
字符串结果=”;
int l=dtxt.length();

对于(int i=0;i您应该使用填充,例如
Cipher.getInstance(“AES/CBC/PKCS5Padding”)
。您现在使用的零填充有一个问题,即您无法区分以
00
值字节结尾的纯文本和填充。如果您执行取消添加,那么您至少会遇到最后一个块的问题。当然,对于文本,您只需删除y之前末尾的
00
值字节即可执行字符解码例行程序。另一种方法是在纯文本的开头添加一个64位大小指示符

请注意,默认的Oracle Java提供程序没有零填充选项(据我所知),因此您必须自己进行取消添加,或者必须使用另一个JCE提供程序,例如包含零填充选项的提供程序(例如,对于
Cipher.getInstance(“AES/CBC/ZeroPadding”)


请注意。还请注意,CBC模式本身不提供完整性保护或身份验证,仅提供机密性,并且仅在正确使用时提供。

您可以在流模式中使用分组密码(如AES)来完全消除填充。因此,您可以使用例如
cipher.getInstance(“AES/CTR/NoPadding”)
或者如果您还希望包含身份验证标记
Cipher.getInstance(“AES/GCM/NoPadding”)
。后者将在密文末尾添加一些字节,您可以使用这些字节来确保密文是使用正确的密钥创建的,并且密文没有被更改

请注意,您可能会泄漏有关纯文本大小的信息。对于CBC模式也是如此,但在这种情况下,您将至少有一个16字节(块大小)边距。使用流模式加密,您将加密到完全相同的字节数。还请注意,您需要使用相同密钥对每个加密使用新的IV值,否则您可能会直接将明文暴露给攻击者