[C#] Rijndael "Il riempimento non è valido e non può essere rimosso"

lunedì 25 giugno 2012 - 21.04
Tag Elenco Tags  C#  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5

SnakeX91 Profilo | Newbie

Salve a tutti,

sono in una situazione a dir poco disperata.
Devo interrogare un server ASMX via richieste SOAP per ottenere dei dati, dati che al loro arrivo devono essere decriptati con l'algoritmo Rijndael.
Spiego brevemente la mia situazione:

- il server non è mio, il suo amministratore mi ha fornito tutte le caratteristiche e le modalità per interoperare con esso al fine di farmi testare il client che sto costruendo;
- nasco come programmatore PHP;
- ho già provato a cercare per mari e per monti la soluzione sul web ma non ce n'è stato verso.

L'amministratore del sistema mi ha fornito il protocollo di comunicazione XML col server con i quali si ottengono questi dati e la funzione di Decrypt in C#. Ho costruito un client PHP che fa le richieste SOAP al server, in quanto non essendo addentrato nel C# (lo sto studiando proprio per costruire questo client) non so come crearlo con questo linguaggio. La principale funzione di questo client è proprio quella di decriptare questi dati, l'utilizzo di questi ultimi è da fare tramite database, e questa seconda parte del programma mi è molto più chiara, quindi mi sono "buttato" sul più difficile per lasciare a dopo il lavoro più facile. Ecco la funzione in C# fornitami dal SysAdmin:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Alcune stringhe riesco a decriptarle con la funzione fornitami dal SysAdmin, altre invece no. Incappo in questa exception "Il riempimento non è valido e non può essere rimosso", precisamente all'istruzione ReadByte() presente nel ciclo while.
Qual è la differenza tra le due stringhe ? Quella che riesco a decriptare ha una Key non inferiore a 16 caratteri, e di conseguenza non viene paddata con i cancelletti come è possibile leggere dalla funzione, mentre viene paddato di un carattere il vettore in quanto lungo 15 caratteri. Mentre quella che mi dà problemi ha una key lunga 12 caratteri, che quindi viene paddata con 4 cancelletti, e il vettore di 17 caratteri che viene troncato a 16 eliminando l'ultimo carattere.

Le operazioni che faccio sono le seguenti:
- Eseguo la richiesta col client SOAP PHP;
- Ricevo la risposta XML in una textbox;
- Copio-incollo i tre valori (che io so essere stringa criptata, key e vettore) in tre textbox diverse in una piccola Windows Forms in C#;
- Avvio la funzione e ricevo il risultato in una quarta textbox;

Allora voi direte: caspita, c'è qualcosa di sbagliato nella funzione di decrypt! Ehm... no. Ci sono circa una 50 di client che sono stati sviluppati con le indicazioni date dai fornitori del web service, uno di questi fortunatamente vicino casa mia, che ho avuto l'opportunità di visitare, accedere e decompilare il sorgente con Reflector, verificando che la funzione sia assolutamente quella che è stata fornita a me, pari pari. Ed in effetti lo è.

Qual è la differenza tra me ed un client funzionante ? Io uso Windows 7 Ultimate, il client funzionante usa Windows XP. La mia cartella del .NET Framework 2.0 è 108MB e quella del client funzionante è 67MB.

Qualcuno sa darmi una mano? Grazie anticipatamente!

P.S.: dimenticavo... su internet consigliavano di impostare un altro valore di PaddingMode. "None", "Zeros", "PKCS7", ecc... l'eccezione va via, ma la stringa che mi viene restituita in output è incomprensibile, tutti simboli senza senso. Mentre io so per certo che deve essere alfanumerica, di 7 caratteri e comprensibilissima.

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5