Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Messaggio di errore: pad block corrupted

    Sto realizzando una MIDlet che cifri e decifri SMS. Utilizzo per le operazioni crittografiche l'algorimo AESlight (Rijndael) con le librerie di Bouncy Castle.
    Invio il messaggio cifrato come messaggio binario (per non perdere dati nel trasformarlo in stringa e di nuovo in byte), tuttavia quando il device ricevente prova a decifrare il messaggio viene generato un messaggio di errore che dice "pad block corrupted ".

    Ho fatto dei test:

    1) Il codice che decifra è corretto, in quanto PRIMA di inviarlo come binario, lo faccio decifrare, ed il risultato corrisponde con il testo in chiaro.

    2) Verifico che l'array di byte da inviare corrisponda con quello ricevuto...e corrispondono!


    Non so proprio perché venga generato questo messaggio.
    Questo è il codice che decifra l'SMS:

    AESLightEngine engine = new AESLightEngine();
    CBCBlockCipher cbc = new CBCBlockCipher(engine);
    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(cbc);
    ParametersWithIV piv = new ParametersWithIV((new KeyParameter(AESkey)),initVector);

    cipher.init(false, piv);

    byte[] result = new byte[cipher.getOutputSize(cipheredText.length)];
    int len = cipher.processBytes(cipheredText, 0, cipheredText.length, result, 0);

    cipher.doFinal(result, len);
    plainText = new String(result);


    Che tuttavia mi pare corretto in quanto decifra correttamente (lato mittente, PRIMA dell'invio),quindi penso il problea risieda nell'invio/ricezione del messaggio binario.
    Il codice di invio è il seguente:

    smsconn = (MessageConnection)Connector.open(address);
    BinaryMessage binmessage = (BinaryMessage)smsconn.newMessage(MessageConnectio n.BINARY_MESSAGE);
    binmessage.setAddress(address);
    binmessage.setPayloadData(binaryTextToSend);
    smsconn.send(binmessage);


    Mentre per la ricezione, ottengo l'array binario attarverso il metodo: data = ((BinaryMessage)msg).getPayloadData();

    Qualcuno potrebbe aiutarmi?

    Grazie,
    Francesco

  2. #2
    Ciao,
    non ho capito: la comunicazione avviene tra 2 cellulari via BT?

    Controllato questa parte di codice nella cifratura del mess:

    AESLightEngine engine = new AESLightEngine();
    CBCBlockCipher cbc = new CBCBlockCipher(engine);
    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(cbc);
    ParametersWithIV piv = new ParametersWithIV((new KeyParameter(AESkey)),initVector);

    sono uguali?

    la chiave AESkey = ?

    fammi sapere
    seba

  3. #3
    Originariamente inviato da seba.cappa
    Ciao,
    non ho capito: la comunicazione avviene tra 2 cellulari via BT?
    La comunicazione avviene in locale "emulata" con il WTK (Wireless toolkit) della SUN.

    Controllato questa parte di codice nella cifratura del mess:

    AESLightEngine engine = new AESLightEngine();
    CBCBlockCipher cbc = new CBCBlockCipher(engine);
    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(cbc);
    ParametersWithIV piv = new ParametersWithIV((new KeyParameter(AESkey)),initVector);

    sono uguali?

    la chiave AESkey = ?
    Sì sono uguali. Per le cifratura/decifratura cambia solo il 1° parametro del metodo cipher.init(), TRUE = cifra, FALSE = decifra. L'ho testato e funziona, ovvero cifra una stringa e la decifra correttamente.

    AESkey è la chiave simmetrica, usata per le oerazioni di sostituzione dell'algoritmo Rjindael.

    Il messaggio di errore si verifica se tento di decifrare un SMS cifrato ed inviato come messaggio binario. Ma, anche provando a far stampare ogni singolo bit dell'array di byte, in entrambi i casi, lato mittente e lato ricevente, i due array coincidono.

    Quindi non saprei dove risiede il problema...

  4. #4
    In modalità Cipher Block Chaining viene usato un vettore di inizializzazione per rendere diversi anche due messaggi uguali.

    Il tuo initVector è lo stesso della cifratura?

  5. #5
    Originariamente inviato da seba.cappa
    In modalità Cipher Block Chaining viene usato un vettore di inizializzazione per rendere diversi anche due messaggi uguali.

    Il tuo initVector è lo stesso della cifratura?
    Sì. Invio il vettore di inizializzazione in testa al messaggio cifrato. Lato ricevente, al momento di decifrare il mess lo estraggo.

    Ho capito dove potrebbe essere l'errore...

    Ho realizzato la mia applicazione sulla base di un esempio di MIDlet che riceveva un messaggio binario, che qui riporto:

    if (msg instanceof BinaryMessage){

    //StringBuffer buf = new StringBuffer();

    BinaryMessage bmsg = (BinaryMessage)msg;
    data = bmsg.getPayloadData();


    // for (int i = 0; i < data.length; i++)
    // {
    // int intData = (int)data[i] & 0xFF;
    // if (intData < 0x10)
    // {
    // buf.append("0");
    // }
    // buf.append(Integer.toHexString(intData));
    // buf.append(' ');
    // }

    // content.setString("buf.toString: "+buf.toString());
    }

    NOTARE BENE i commenti...
    Alla mia funzione di decifratura passo semplicemente data (che facendo stampare in un ciclo for ogni singolo carattere coincide con l'array di byte inviato).
    Quindi non uso affatto il codice che usa lo STringBuffer...anche perché a me serve l'array di byte!

    Potrebbe essere invece necessario questo pezzo per la corretta "ricostruzione" del messaggio binario (anche se a me serve solo la parte binaria)?

    Grazie di nuovo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.