我有三个 Activity 。在MainActivity
中,我有两个按钮,允许我从两个选项中进行选择,即单击加密
转到EncryptActivity。 java
并单击decrypt
继续DecryptActivity.java
。
在第一个 Activity 中,即EncryptActivity
,我正在加密用户在EditText
中写入的消息。然后我按back
按钮进入主菜单,然后单击decrypt
按钮进入第二个 Activity DecryptActivity.java
来解密消息并在 TextView 中打印消息。
但问题是,当我单击 DecryptActivity
中的 decrypt
按钮时,Textview
中没有打印任何内容。
EncryptActivity.java:
public class EncryptActivity extends AppCompatActivity {
EditText ed1;
Button b1;
private ClipboardManager myClipboard;
private ClipData myClip;
KeyGenerator keygenerator;
static SecretKey secretkey;
Cipher cipher;
byte[] encrypted;
String encryptedText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.encrypt_activity);
ed1 = (EditText) findViewById(R.id.editText);
b1 = (Button) findViewById(R.id.button);
myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = ed1.getText().toString();//now encrypt the message
try {
keygenerator = KeyGenerator.getInstance("Blowfish");
secretkey = keygenerator.generateKey();
Log.d("asd", secretkey.toString());
cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
encrypted = cipher.doFinal(text.getBytes());
encryptedText = encrypted.toString();
myClip = ClipData.newPlainText("text", encryptedText);
myClipboard.setPrimaryClip(myClip);
Toast.makeText(getApplicationContext(), "Text Copied", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
}
}
});
}
}
DecryptActivity.java:
public class DecryptActivity extends AppCompatActivity {
EditText ed1;
TextView tv;
Button b1,b2;
byte[] decrypted;
String decryptedText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.decrypt_activity);
ed1 = (EditText) findViewById(R.id.decrypteditText);
b1 = (Button) findViewById(R.id.decryptbutton);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("asd","inside onclick");
try {
Log.d("asd","inside try of decryptActivity");
KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish");
SecretKey secretkey = keygenerator.generateKey();
Cipher cipher2 = Cipher.getInstance("Blowfish");
cipher2.init(Cipher.DECRYPT_MODE,secretkey);
Log.d("asd","in decrypt key is"+secretkey.toString());
Log.d("asd","before getBytes");
byte[] encrypted =ed1.getText().toString().getBytes();
Log.d("asd",ed1.getText().toString());
decrypted = cipher2.doFinal(encrypted);
tv=(EditText)findViewById((R.id.textView));
tv.setText("Asd");
Log.d("asd",new String(decrypted));
} catch (Exception e) {
}
Toast.makeText(getApplicationContext(), "Text Pasted", Toast.LENGTH_SHORT).show();
}
});
}
}
最佳答案
当使用像 Blowfish 这样的对称加密算法时,加密和解密必须使用相同的 key - 否则解密将失败。
在您的情况下,您在加密之前生成一个随 secret 钥,并在解密之前再次生成:
KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish");
SecretKey secretkey = keygenerator.generateKey();
因此您正在尝试使用不同的 key 进行解密!根据定义,这是行不通的...
为了加密,您可以生成一个新 key ,但随后您必须保存它并再次使用它进行解密。
此外,您还犯了一个错误,即无法通过调用 byte[]
的 toString()
方法将其转换为字符串。将其转换为十六进制或 base64 字符串,否则它将永远无法工作。
关于java - 加密消息但无法在 android 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487481/