Android Studio无法解密AES中的消息

时间:2017-12-04 22:40:25

标签: java android-studio encryption aes

嗨,我尝试在一些开源代码消息传递应用程序中实现aes。对于加密的消息,它的工作找到我。但我很难解密消息。

在这个课程中,我可以加密消息,它可以正常工作。

MessageActivity.java

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.message);

    messageView = (TextView) findViewById(R.id.message_view);

    final Button button = (Button) findViewById(R.id.btn_send);
    final EditText message = (EditText) findViewById(R.id.edit_message);

    this.setTitle("Group Chat");

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            String str = message.getText().toString();
            byte[] cipherText = null;
            try {
                cipherText = AESEncryption.encryptText(str, AESEncryption.thisKey());
            } catch (Exception e) {
                e.printStackTrace();
            }
            String msgStr = new String(cipherText);
            addMessage("This phone", str);
            message.setText("");

            // Send to other clients as a group chat message
            for (AllEncompasingP2PClient c : MeshNetworkManager.routingTable.values()) {
                if (c.getMac().equals(MeshNetworkManager.getSelf().getMac()))
                    continue;
                Sender.queuePacket(new Packet(Packet.TYPE.MESSAGE, msgStr.getBytes(), c.getMac(),
                        WiFiDirectBroadcastReceiver.MAC));
            }

        }
    });

Receiver.java

/////////////// this messsage receiver part///////////////////////

byte[] thisMsg = p.getData();
String decryptedText = null;
 try {
 decryptedText = AESEncryption.decryptText(thisMsg, AESEncryption.thisKey());
 } catch (Exception e) {
  e.printStackTrace();
 }

final String message = p.getSenderMac() + " says:\n" + decryptedText;
final String msg = new String(p.getData());
final String name = p.getSenderMac();

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


if (!MeshNetworkManager.routingTable.contains(p.getSenderMac())) {
    /*
     * Update your routing table if for some reason this
    * guy isn't in it
   */
MeshNetworkManager.routingTable.put(p.getSenderMac(),
new AllEncompasingP2PClient(p.getSenderMac(), p.getSenderIP(), 
p.getSenderMac(),
MeshNetworkManager.getSelf().getGroupOwnerMac()));
}

activity.runOnUiThread(new Runnable() {

@Override
public void run() {
if (activity.isVisible) {
Toast.makeText(activity, message, Toast.LENGTH_LONG).show();
} else {
MessageActivity.addMessage(name, msg);
}
}
    });
updatePeerList();

AESEncryption.java

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
//import javax.xml.bind.DatatypeConverter;

public class AESEncryption {

public static SecretKey getSecretEncryptionKey() throws Exception{
    KeyGenerator generator = KeyGenerator.getInstance("AES");
    generator.init(128); // The AES key size in number of bits
    SecretKey secKey = generator.generateKey();
    return secKey;
}

public static byte[] encryptText(String plainText,SecretKey secKey) throws Exception{
    // AES defaults to AES/ECB/PKCS5Padding in Java 7
    Cipher aesCipher = Cipher.getInstance("AES");
    aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
    byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
    return byteCipherText;
}

public static String decryptText(byte[] byteCipherText, SecretKey secKey) throws Exception {
    // AES defaults to AES/ECB/PKCS5Padding in Java 7
    Cipher aesCipher = Cipher.getInstance("AES");
    aesCipher.init(Cipher.DECRYPT_MODE, secKey);
    byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
    return new String(bytePlainText);
}

public static SecretKey thisKey() throws Exception{

    SecretKey secKey = AESEncryption.getSecretEncryptionKey();

    return secKey;
}

}

在这个类中我编码解密的消息。但是当我运行代码时,消息不会解密并显示密文。如果有人可以纠正我,它会很棒。

1 个答案:

答案 0 :(得分:2)

对于同一消息,必须使用相同的密钥进行加密和解密。

似乎相同的密钥没有用于加密和解密,两种方法都调用SecretKey thisKey(),这似乎生成一个随机密钥。

在加密呼叫SecretKey thisKey()上,使用它进行加密并保存密钥以用于解密。在解密时不要调用SecretKey thisKey(),使用为加密创建的密钥。