1

私は暗号化に慣れていないので、行き詰まっており、あなたの助けに非常に感謝しています.

私は2つのクラスを持っています。1つは、送信されたテキストを暗号化および復号化するために使用されますmain.xml

Base64Activity:

public class Base64Activity extends Activity {
private Button btnEncrypt, btnDecrypt;
private EditText txtOrg, txtEncr, txtEncr1, txtDecr;
private byte[] encrypted;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btnEncrypt = (Button)findViewById(R.id.button1);
btnDecrypt = (Button)findViewById(R.id.button2);
txtOrg = (EditText)findViewById(R.id.editText1);
txtEncr = (EditText)findViewById(R.id.editText2);
txtEncr1 = (EditText)findViewById(R.id.editText3);
txtDecr = (EditText)findViewById(R.id.editText4);

btnEncrypt.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
try {
// Generate a temporary key. In practice, you would save this key.
// See also Encrypting with DES Using a Pass Phrase.
String key="Helloooooo";
Log.d("prk","step0");

DesEncrypter a= new DesEncrypter();
String a1=txtOrg.getText().toString();
Log.d("prk",a1);
// Encrypt
encrypted = a.encrypt(a1.getBytes("UTF8"));
String value1=new String(encrypted);
txtEncr.setText(encrypted.toString());
txtEncr1.setText(value1.toString());
Log.d("prk","step2");
// Decrypt

} catch (Exception e)
{
Log.d("Exception ",e.toString());

}
}
});


btnDecrypt.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
try {
DesEncrypter a= new DesEncrypter();
//Log.d("while decrypting",encrypted );
String a1=txtEncr.getText().toString();
//byte[] decrypted = a.decrypt(a1.getBytes("UTF-8"));
byte[] decrypted = a.decrypt(encrypted);

String value=new String(decrypted);
Log.d("Decrypted Test",value);
txtDecr.setText(value);
// Decrypt

byte[] decrypted1 = a.decrypt(a1.getBytes("UTF-8"));
//byte[] decrypted = a.decrypt(encrypted);

String value1=new String(decrypted1);

Log.d("Loaded Decrypted=",value1);
FileOutputStream fout=openFileOutput("textFile.txt",MODE_WORLD_READABLE);
//OutputStreamWriter osw=new OutputStreamWriter(fout);
//write the string to the file
fout.write(encrypted);
fout.flush();
fout.close();

} catch (Exception e)
{
Log.d("Exception ",e.toString());

}
}
});
} 
}

DesEncrypter:

public class DesEncrypter {

private static final String ALGO="AES";
private static final String a="TheBestSecretKey";
private static final byte[] keyValue=a.getBytes();

public byte[] encrypt(byte[] bs) throws Exception{

byte[] key={'h','e','l','l','o','o','o','o','h','e','l','l','o','o','o','o'};
SecretKeySpec skeyspec=new SecretKeySpec(key,"AES");
Log.d("Encrypted Key=  ",key+"");
Cipher c=Cipher.getInstance("AES/ECB/PKCS7Padding");
c.init(Cipher.ENCRYPT_MODE,skeyspec);
byte[] encVal=bs;
Log.d("Encrypted",encVal.toString());
return c.doFinal(encVal);
}

public byte[] decrypt(byte[] encryptedData) throws Exception{
byte[] key={'h','e','l','l','o','o','o','o','h','e','l','l','o','o','o','o'};
Log.d("Decrypted Key=  ",key+"");
SecretKeySpec skeyspec=new SecretKeySpec(key,"AES");
Cipher c=Cipher.getInstance("AES/ECB/PKCS7Padding");
c.init(Cipher.DECRYPT_MODE,skeyspec);
Log.d("Inside Decryption 2 ",encryptedData+"");
byte[] decValue=c.doFinal(encryptedData);
return decValue;
}
}

暗号化が機能し、使用する場合

DesEncrypter a= new DesEncrypter();
String a1=txtEncr.getText().toString();
byte[] decrypted = a.decrypt(encrypted);

この部分も機能します。しかし、私が使用するとき

byte[] decrypted = a.decrypt(*a1.getBytes("UTF8")*);

この値を使用して復号化すると、「復号化で最後のブロックが不完全です」というエラーが表示されます。バイトを文字列に、またはその逆に変換する際に問題があると思います。

私は必死で、あなたの助けが必要です。私が望むのは、暗号化されたテキストをテキストボックスまたはファイルに保存し、後でそれを使用してテキストを復号化することです。

よろしくお願いします

4

2 に答える 2

0

必死になる必要はありません。次のように確認できます。

txtEncr.setText(encrypted.toString());

それから

byte[] txtEncrBytes = txtEncr.getText().toString().getBytes();

を使用して暗号化されたtxtEncrBytes比較することによって

Arrays.equals(encrypted,txtEncyBytes);

2 バイト配列が等しくないことがわかります。

その理由は、txtEncr のテキストが暗号化された toString() であるためです。あなたのコードは、[C@16f0472. 少なくとも Arrays.toString を使用して、配列を読み取り可能な文字列に変換し、配列の内容を提供する必要があります。プログラミング パズラー、第 3 章、パズル 12を参照してください。

ただし、注意してください: 暗号化されたバイト配列には、通常、デフォルトのプラットフォーム エンコーディングの文字に対応しないバイト値が含まれています。その場合、文字列を作成すると、バイトは「置換文字」である U+FFFD (�) に変換され、正しい値が取り返しのつかないほど失われます。これを参照してください。

したがって、答えは次のとおりです。コードを元のバージョンのままにしておくだけです。

DesEncrypter a= new DesEncrypter();
String a1=txtEncr.getText().toString();
byte[] decrypted = a.decrypt(encrypted);

つまり、一時文字列を使用して保存し、一時文字列からバイト配列を取得するのではなく、暗号化されたバイト配列を常に保持する必要があります。

PS: 投稿をフォーマットする必要があると思います。コード リストが見栄えが悪いです。

于 2012-06-15T12:04:22.837 に答える