-1

AES で暗号化されたパスワードを Base64 でエンコードしようとしています。src フォルダーにファイルを追加しました。これがコードです。

package code.finalwork;

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

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class FinalWorkActivity extends Activity {
    private String pref_file = "pref.xml";

    TextView pass;
    TextView pass_cnf;
    TextView err_msg;
    Button done;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pass = (TextView) findViewById(R.id.pass);
        pass_cnf = (TextView) findViewById(R.id.pass_cnf);
        err_msg = (TextView) findViewById(R.id.error_pass);
        done = (Button) findViewById(R.id.btn_done);

        SharedPreferences pref = getSharedPreferences(pref_file,
                Context.MODE_PRIVATE);
        Boolean val = pref.getBoolean("firstuse", true);
        if (val) {
            SharedPreferences.Editor mod = pref.edit();
            mod.putBoolean("firstuse", false);
            mod.commit();

        }
    }

    // ///////////////////////////////////////////////////////////////////////
    public void onclick(View view) {
        switch (view.getId()) {
        case R.id.btn_done:
            String usrpass = pass.getText().toString();
            String cnfrmpass = pass_cnf.getText().toString();
            if (usrpass.equals(cnfrmpass)) {
                byte[] password = Base64.decode(usrpass, 0);
                byte[] key = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
                        6 };
                for (int i = 0; i < usrpass.length(); i++) {
                    key[i] = password[i];
                }
                try {
                    String passtostore = encrypt(usrpass, key);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                err_msg.setText("Password added");
                err_msg.setVisibility(View.VISIBLE);
            } else {
                err_msg.setText("Password Must Match");
                err_msg.setVisibility(View.VISIBLE);
            }
            break;
        }
    }

    // //////////////////////////////////////////////////////////////////////

    public String encrypt(String toencrypt, byte key[]) throws Exception {
        SecretKeySpec secret = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secret);
        byte[] encryptedbytes = cipher.doFinal(toencrypt.getBytes());
        String encrypted = Base64.encodeToString(encryptedbytes, 0);
        return encrypted;

    }
}  

暗号化コードをコメント化すると、このコードは正常に機能します。しかし、これらの行を使用すると、アプリケーションが予期せず停止するというエラーが発生します。 これはログ猫が示すものです

4

2 に答える 2

1

Base64 は、バイナリ データを ASCII-7 の 64 文字のサブセットにエンコードするために使用されます。ASCII-7 は、テキストベースのプロトコル (SMTP や HTTP など) で安全に送信できます。

ここで考えられる問題の 1 つは、ユーザー入力を Base64 デコードしようとしているということです。これは、コードの次の行の単純な文字列です。

byte[] password=Base64.decode(usrpass, 0);

プレーン テキスト (文字列) のパスワードを byte[] に変換するには、次を使用します。

byte[] password =  userpass.getBytes("UTF-8");  
于 2012-06-17T17:15:19.680 に答える
0

OnClickListener に ArrayIndexOutOfBoundsException があるようです。@maasg が書いたことに加えて、これらの行は非常に疑わしいように見えます。

byte[] key = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
for (int i = 0; i < usrpass.length(); i++) {
    key[i] = password[i];
}

コードからすぐにはわからないことをしていない限り、usrpass が key よりも長い場合は範囲​​外になります。

于 2012-06-17T17:20:07.610 に答える