我正在进行三项活动。在MainActivity
中,我有两个按钮,允许我从两个选项中进行选择:点击encrypt
转到EncryptActivity.java
并点击{{1}继续decrypt
。
在第一项活动中。 DecryptActivity.java
,我正在加密用户在EncryptActivity
中写入的消息。然后我按EditText
按钮转到主菜单,然后点击back
按钮进入第二个活动decrypt
以解密消息并在文本视图中打印消息。
但问题是当我点击DecryptActivity.java
中的decrypt
按钮时,DecryptActivity
中没有任何内容打印出来。
EncryptActivity.java:
Textview
}
DecryptActivity.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) {
}
}
});
}
}
答案 0 :(得分:1)
当使用像Blowfish这样的对称krypto算法时,加密和解密必须使用相同的密钥 - 否则解密将失败。
在您的情况下,您在加密前生成一个随机密钥,并在解密之前再次生成:
KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish");
SecretKey secretkey = keygenerator.generateKey();
因此,您尝试使用其他密钥进行解密!根据定义,这不起作用......
对于加密,您可以生成新密钥,但之后您必须保存并再次使用它进行解密。
此外,您错误地认为byte[]
无法通过调用toString()
方法转换为字符串。将它转换为十六进制或base64字符串,否则它将无法工作。