2017-12-04 5 views
1

でメッセージを解読することはできませんこんにちは、私はいくつかのオープンソースコードのメッセージングアプリケーションでAESを実装してみてください。暗号化されたメッセージのために、その仕事は私に見つけます。しかし、私はメッセージを解読するのが難しいです。のAndroid Studioは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; 
} 

} iが復号化されたメッセージを符号このクラスの

。しかし、コードを実行すると、メッセージは解読されず、代わりに暗号テキストが表示されます。

+2

1. 'AESEncryption.encryptText'と' AESEncryption.decryptText'ためのコードです。 2.失敗の潜在的な理由には、不正なキーおよび/またはIVの長さ、誤ったエンコードが含まれます。 3.コード、データ、キーなどを含む[mcve]の例と、デバッグを試みた結果を提供します。 4.これまでに行ったことをデバッグするための情報と結果を追加します。 – zaph

+1

ザフは絶対に正しいです。さらに、ここを見て:[AESとアンドロイドの暗号化/復号化](https://stackoverflow.com/questions/6788018/android-encryption-decryption-with-aes)そのことについて – paulsm4

+0

申し訳ありませんが、私はすでに私はあなたを見 – Zamri94

答えて

2

同じキーが同じメッセージの暗号化と復号化の両方に使用する必要があります。

両方の方法は、ランダムなキーを生成するように思わSecretKey thisKey()を呼び出して、同じ鍵が暗号化と復号化の両方に使用されていないようです。暗号化コールSecretKey thisKey()

、暗号化のためにそれを使用して復号化に使用するキーを保存します。解読時にSecretKey thisKey()に電話をかけないでください。暗号化のために作成されたキーを使用してください。

+1

それは、私は1つのキーを作成する必要があることを意味し、その後、受信者の権利に鍵を渡す。今、私はそれがどのように機能するか考えています。 – Zamri94