1

復号化で私は得ています

W/System.err(517): javax.crypto.IllegalBlockSizeException: last block incomplete in decryption

暗号化および復号化するための私のコードは以下のとおりです。フォーラム全体を検索しても同じ問題が発生しましたが、コードを機能させることができませんでした。

もう1つの問題または単なる好奇心は、ボタンをクリックすると暗号化された文字列が表示されることですが、ボタンを何度も押すと、同じ入力テキストで別の暗号化された文字列が表示され、最後の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;
  }
}
4

2 に答える 2

1

Cipher.doFinal(byte[])を返しbyte[]ますStringObject.toString()コードが現在、 aの戻り値を格納している方法はbyte[]あまり意味がなく、その内容を示していません。バイト配列を文字列として保存する場合は、最初にエンコードする必要があります。これを行うための推奨される方法は Base64 ですが、16 進文字列も同様に機能しますが、Base64 ほどコンパクトにはなりません。

byte[]デバッグ目的で の内容を表示したいだけの場合は、を使用Arrays.toString(byte[])して内容がどのように変化するかを確認できます。デバッグの場合でも、Base64 または 16 進文字列を見る方が簡単だと思います。

復号化メソッドでは、復号化する前に入力文字列を にデコードする必要があります。復号化側byte[]から得られたバイト配列は、を使用して UTF-8 として解釈できます。Cipher.doFinal(byte[])new String(result, "UTF-8")

于 2013-10-17T19:45:50.490 に答える
0

あなたの塩のために getBytes("UTF-8") を試してください

于 2013-10-17T18:50:36.043 に答える