2011-02-02 5 views
1

J'ai une situation très étrange. Fondamentalement, j'ai le code qui utilise un décrypteur Créé par:Erreur occasionnelle de mauvaises données lors du décryptage

Dim des3 As New TripleDESCryptoServiceProvider 
des3.Mode = CipherMode.CBC 
Return des3.CreateDecryptor(_encKey, _initVec) 

Le _encKey et _initVec sont hardcoded. Je l'utilise en appelant:

Dim res() As Byte = decrypt(Convert.FromBase64String(_data)) 
m_transformDec.TransformFinalBlock(res, 0, res.Length) 

Ici _data est une chaîne contenant la valeur chiffrée. m_transformDec est le déchiffreur créé précédemment.

Habituellement cela fonctionne. Parfois, j'obtiens une erreur "mauvaises données". J'imprime la valeur de _data, et c'est toujours pareil.

Le code est multithread, ce qui je pense est la raison du problème, et il est difficile à reproduire. Le décrypteur est créé lors de la création de la classe, et le décryptage est effectué dans une fonction partagée, mais je n'y vois rien qui ne soit pas sécurisé par les threads.

Des idées?

Répondre

1
  1. Vous ne devriez pas supposer quoi que ce soit est sûr pour les appels simultanés, sauf si vous avez des raisons de croire qu'il est. Dans les documents, vous avez le texte standard indiquant que les membres d'instance ne sont pas sûrs d'être thread-safe, vous devez donc verrouiller défensivement l'objet des3 lorsque vous l'utilisez.
  2. Vous ne devriez pas coder en dur le vecteur d'initialisation; il devrait être choisi au hasard lors du cryptage des données, puis stocké d'une certaine manière avec les données cryptées (beaucoup de gens choisissent de le virer au début des données, puis le retirer et l'utiliser pour le déchiffrement, utiliser le schéma de stockage que vous préférez) . Utiliser la même IV défait le but de la IV, qui sert à rendre les attaques en texte clair plus difficiles.
Questions connexes