À l'aide de Rijndael pour crypter/décrypter des fichiers
J'ai besoin de transférer des fichiers xml et ils doivent être chiffrées. J'ai trouvé quelques exemples pense que je suis proche, mais quand j'déchiffrer le fichier je me retrouve avec des caractères indésirables. Il y a quelques posts à ce sujet mais je n'ai vu aucun qui va exactement de l'aide. Voici le chiffrer et de déchiffrer le code.
private void EncryptFile(string inputFile, string outputFile, string key) {
try {
byte[] keyBytes;
keyBytes = Encoding.Unicode.GetBytes(key);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);
RijndaelManaged rijndaelCSP = new RijndaelManaged();
rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);
ICryptoTransform encryptor = rijndaelCSP.CreateEncryptor();
FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read);
byte[] inputFileData = new byte[(int)inputFileStream.Length];
inputFileStream.Read(inputFileData, 0, (int)inputFileStream.Length);
FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
CryptoStream encryptStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write);
encryptStream.Write(inputFileData, 0, (int)inputFileStream.Length);
encryptStream.FlushFinalBlock();
rijndaelCSP.Clear();
encryptStream.Close();
inputFileStream.Close();
outputFileStream.Close();
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Encryption Failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("File Encryption Complete!");
}
private void DecryptFile(string inputFile, string outputFile, string key) {
try {
byte[] keyBytes = Encoding.Unicode.GetBytes(key);
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);
RijndaelManaged rijndaelCSP = new RijndaelManaged();
rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);
ICryptoTransform decryptor = rijndaelCSP.CreateDecryptor();
FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read);
CryptoStream decryptStream = new CryptoStream(inputFileStream, decryptor, CryptoStreamMode.Read);
byte[] inputFileData = new byte[(int)inputFileStream.Length];
decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length);
FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
outputFileStream.Write(inputFileData, 0, inputFileData.Length);
outputFileStream.Flush();
rijndaelCSP.Clear();
decryptStream.Close();
inputFileStream.Close();
outputFileStream.Close();
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Decryption Failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("File Decryption Complete!");
}
Je me retrouve avec
<?xml version="1.0" encoding="UTF-8"?>
<transaction>
<header>
<qOrderNumber></qOrderNumber>
<qRequestDate></qRequestDate>
<testOrder></testOrder>
<qCustomerNumber></qCustomerNumber>
<transactionStatus></transactionStatus>
</header>
<lines>
<line>
<productID></productID>
<serialNumber></serialNumber>
</line>
<line>
<productID></productID>
<serialNumber></serialNumber>
</line>
</lines>
</transaction>NULNULNULNULNULNUL
Vous devez vous connecter pour publier un commentaire.
Lors du déchiffrement, prêter attention à la valeur de retour de la CryptoStream.Lire l'appel. Il vous indique la longueur de la restitution des données dans votre tableau d'octets (habituellement, de ne pas correspondre à la longueur des données chiffrées en raison de rembourrage). Essayez d'utiliser la ligne suivante dans votre décrypter fonction:
Sur le
RijndaelManaged
objet, définissez laPadding
propriétéPaddingMode.ANSIX923
ouPaddingMode.ISO10126
.Ceux des octets nuls ont été ajoutés à remplir le dernier bloc crypté. Elle a été complétée par des zéros par défaut, ce qui signifie qu'aucune indication n'est donnée quant à la longueur réelle des données. L'autre rembourrage modes incluent une longueur dans l'octet final, de sorte que le rembourrage peut être retiré après le décryptage.
Définir la propriété padding dans les deux chiffrer et déchiffrer routine à la même valeur.
Si elle sait à quoi s'attendre, alors le déchiffrement des flux de retirer le rembourrage automatiquement, donc aucun changement ne devrait être nécessaire.
Mise à JOUR
En regardant ton code, il semble que le nombre d'octets que vous écrivez dans le fichier de sortie est égal au nombre d'octets lus à partir du fichier d'entrée.
Le processus de déchiffrement n'est pas complètement remplir le
inputFileData
tableau, en raison de la marge dans l'entrée.Le flux de sortie sera alors écrire la totalité de la longueur de la mémoire tampon, même si ce n'est pas complètement rempli.
C'est la source de vos valeurs null.
Vous pouvez changer la façon dont vous faites le chiffrement et le déchiffrement de sorte qu'il n'utilise plus de longueur fixe bufferes. Sinon, vous pouvez stocker la longueur des données chiffrées au début, et seulement écrire le nombre d'octets qui correspondent à cette longueur.