Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解密JAVA(Android)时出错_Java_Android_Encryption - Fatal编程技术网

解密JAVA(Android)时出错

解密JAVA(Android)时出错,java,android,encryption,Java,Android,Encryption,关于解密,我得到了 W/System.err(517): javax.crypto.IllegalBlockSizeException: last block incomplete in decryption 下面是我要加密和解密的代码。我搜索了整个论坛,也遇到了同样的问题,但我的代码无法正常工作 还有一个问题,或者你可以说只是好奇,当我点击按钮时,我可以看到加密字符串,但一次又一次地按下按钮,在同一输入文本上给了我不同的加密字符串,只改变了最后4个字符。。。。我认为在解密后获得相同的输入字符

关于解密,我得到了

W/System.err(517): javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
下面是我要加密和解密的代码。我搜索了整个论坛,也遇到了同样的问题,但我的代码无法正常工作

还有一个问题,或者你可以说只是好奇,当我点击按钮时,我可以看到加密字符串,但一次又一次地按下按钮,在同一输入文本上给了我不同的加密字符串,只改变了最后4个字符。。。。我认为在解密后获得相同的输入字符串会有问题

public class MainActivity extends Activity implements OnClickListener {

EditText ed1, ed2, ed3;
private final char[] PASSWORD = "abcdefghijklmnop".toCharArray();
private byte[] SALT;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   //Setting the SALT to android_id
    SALT = Secure.getString(getContentResolver(), Secure.ANDROID_ID).getBytes();
    Button btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(this);
    ed1 = (EditText) findViewById(R.id.editText1);
    ed2 = (EditText) findViewById(R.id.editText2);
    ed3 = (EditText) findViewById(R.id.editText3);
}

public void onClick(View v)
{

    String encrypted, decrypted, userpass = ed1.getText().toString().trim();
    encrypted = encrypt(userpass);
    ed2.setText(encrypted);
    decrypted = decrypt(encrypted);
    ed3.setText(decrypted);
}

public String encrypt(String original)
{

    SecretKeyFactory secretKey = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = secretKey.generateSecret(new PBEKeySpec(PASSWORD));
    Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
    cipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT,20));
    String encrypted = cipher.doFinal(original.getBytes("UTF-8")).toString();
    return encrypted;
}

public String decrypt(String original)
{

    SecretKeyFactory secretKey = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = secretKey.generateSecret(new PBEKeySpec(PASSWORD));
    Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
    cipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT,10));
    String decrypted = cipher.doFinal(original.getBytes("UTF-8")).toString();
    return decrypted;
  }
}
为盐尝试getBytes(“UTF-8”)

为盐尝试getBytes(“UTF-8”)

密码。doFinal(byte[])
返回一个
字节[]
而不是
字符串。您当前存储
Object.toString()
返回值的代码方式对于
字节[]
来说意义不大,也不显示其内容。如果要将字节数组存储为字符串,首先需要对其进行编码。推荐的方法是Base64,但十六进制字符串也可以工作,但不会像Base64那样紧凑

如果您只是想查看
byte[]
的内容以进行调试,可以使用
Arrays.toString(byte[])
查看内容的变化。即使对于调试,我也认为查看Base64或十六进制字符串会更容易

在解密方法中,需要先将输入字符串解码回
字节[]
,然后再对其进行解密,解密端的
Cipher.doFinal(byte[])
生成的字节数组可以使用
新字符串(result,“UTF-8”)
Cipher.doFinal(byte[])解释为UTF-8
返回一个
字节[]
而不是
字符串
。您当前存储
Object.toString()
返回值的代码方式对于
字节[]
来说意义不大,也不显示其内容。如果要将字节数组存储为字符串,首先需要对其进行编码。推荐的方法是Base64,但十六进制字符串也可以工作,但不会像Base64那样紧凑

如果您只是想查看
byte[]
的内容以进行调试,可以使用
Arrays.toString(byte[])
查看内容的变化。即使对于调试,我也认为查看Base64或十六进制字符串会更容易


在解密方法中,需要先将输入字符串解码回
byte[]
,然后再对其进行解密,解密端的
Cipher.doFinal(byte[])
生成的字节数组可以使用
新字符串(结果,“UTF-8”)解释为UTF-8

谢谢你的帮助,现在我知道我在解密字符串时哪里出错了。谢谢你的帮助,现在我知道我在解密字符串时哪里出错了。