java - 加密消息但无法在 android 中解密

标签 java android encryption cryptography

我有三个 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/

相关文章:

java - 在 nginx 代理后面运行的 tomcat webapp 中的远程 IP

Java JAR 的行为与在 IDE 外运行的程​​序不同

java - svnkit:如何获取工作副本修订号?

android - FFMPEG 连接视频

java - 编辑; Android 应用程序 SQLite 异常不同的模拟器

mysql - 将我的 MySQL 密码加密为来自 VB.net 的 MD5 哈希时遇到问题

c - 停留在 C 中的 Speck 解密算法

java - 带有 div.span 的复选框未点击

java - Android 框架布局并排

php - 在 PHP 7 中加密 在 Node JS 中解密