2010-06-04 14 views
2

Seule une partie de la chaîne est décryptée, je pense que cela a à voir avec mon encodage.Cryptage rijndael - seule une partie de la chaîne est décryptée

Voici ce qui se passe:

 string s = "The brown fox jumped over the green frog"; 
     string k = "urieurut"; 
     string enc = EncryptString(s, k); 
     string dec = DecryptString(enc, k); 

Le résultat est le suivant: Le renard brun juϼ 㴘 裴 혽 Ή⪻ ㆉ r th≸ g⟤een grenouille

public static string EncryptString(string stringToEncrypt, string encryptionKey) 
{ 
    string encrypted = String.Empty; 

    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] key = UE.GetBytes(encryptionKey); 

    RijndaelManaged RMCrypto = new RijndaelManaged(); 
    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); 

    byte[] encryptedString = UE.GetBytes(stringToEncrypt); 
    cs.Write(encryptedString, 0, encryptedString.Length); 
    cs.FlushFinalBlock(); 
    cs.Close(); 

    encrypted = UE.GetString(ms.ToArray()); 
    return encrypted; 
} 

public static string DecryptString(string stringToDecrypt, string encryptionKey) 
{ 
    string decrypted = String.Empty; 

    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] key = UE.GetBytes(encryptionKey); 
    byte[] data = UE.GetBytes(stringToDecrypt); 

    RijndaelManaged RMCrypto = new RijndaelManaged(); 
    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); 
    cs.Write(data, 0, data.Length); 
    cs.FlushFinalBlock(); 
    cs.Close(); 

    decrypted = UE.GetString(ms.ToArray()); 

    return decrypted; 
} 
+0

Wow cool ... Je vois cassé coréen dans le résultat ... – code4life

+0

Oui je commencé à me demander si la Corée du Nord a été bustin mes affaires. – schmoopy

Répondre

1

Je résolu mon problème en utilisant la chaîne de base64 pour le chiffrement - je peux regarder d'autres options mais je ne avais besoin de ces méthodes pour une petite quantité de données, voici le code final:

public static string EncryptString(string stringToEncrypt, string encryptionKey) 
{ 
    string encrypted = String.Empty; 
    byte[] key = Encoding.Unicode.GetBytes(encryptionKey); 

    RijndaelManaged RMCrypto = new RijndaelManaged(); 
    RMCrypto.Padding = PaddingMode.PKCS7; 
    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); 

    byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt); 
    cs.Write(encryptedString, 0, encryptedString.Length); 
    cs.FlushFinalBlock(); 
    cs.Close(); 

    //encrypted = Encoding.ASCII.GetString(ms.ToArray()); 
    return Convert.ToBase64String(ms.ToArray()); 
} 

public static string DecryptString(string stringToDecrypt, string encryptionKey) 
{ 
    string decrypted = String.Empty; 
    byte[] key = Encoding.Unicode.GetBytes(encryptionKey); 
    byte[] data = Convert.FromBase64String(stringToDecrypt); 

    RijndaelManaged RMCrypto = new RijndaelManaged(); 
    RMCrypto.Padding = PaddingMode.PKCS7; 
    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); 
    cs.Write(data, 0, data.Length); 
    cs.FlushFinalBlock(); 
    cs.Close(); 

    decrypted = Encoding.ASCII.GetString(ms.ToArray()); 

    return decrypted; 
} 
+0

Notez que 'byte [] key = Encoding.Unicode.GetBytes (encryptionKey);' utilisera au plus 6 caractères du mot de passe pour former une clé assez faible. Utiliser ASCII ou UTF8 serait déjà une grande amélioration, pour le faire correctement, voir la classe Rfc2898DeriveBytes. –

+0

@Henk, pourriez-vous expliquer le 'pourquoi' derrière cela, il utilise au plus 6 caractères lors de l'obtention des caractères unicode à partir d'une chaîne unicode? –

+0

Wow. Je n'ai jamais su que les 16 premiers octets étaient longs. Merci pour l'information. –

0

ne suis pas sûr votre morceau de code spécifique, mais Jeff Atwood a fait une belle petite bibliothèque que j'ai utilisé auparavant:

http://www.codeproject.com/KB/security/SimpleEncryption.aspx

Cela vaut le coup d'oeil car cela simplifie énormément le processus de cryptage des choses, je devais en fait faire un port vers C# car il n'y avait pas de port disponible quand je l'ai vu. Cependant, il y a maintenant un port C# (dans la section des commentaires).

+0

Je vais jeter un oeil à cela, j'aime les différentes options là - merci. – schmoopy

+0

Cool, désolé, je ne pouvais pas aider directement. –

3

Ici vous go:

string s = "The brown fox jumped over the green frog"; 
    string k = "urieurut"; 
    byte[] enc = EncryptString(s, k); 
    string dec = DecryptString(enc, k); 

Vous ne pouvez pas tenter d'interpréter un ensemble d'octets cryptés comme une chaîne Unicode. Gardez-les comme des octets. La version décryptée peut être reconvertie en chaîne.

Notez également la disposition des objets jetables ci-dessous. Vous pourriez vous retrouver avec des ressources trop longtemps conservées ou une fuite si vous ne les libérez pas correctement avec using() ou Dispose().

public static byte[] EncryptString(string stringToEncrypt, string encryptionKey) 
{ 
    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] key = UE.GetBytes(encryptionKey); 

    using (RijndaelManaged RMCrypto = new RijndaelManaged()) 
    using (MemoryStream ms = new MemoryStream()) 
    using (ICryptoTransform encryptor = RMCrypto.CreateEncryptor(key, key)) 
    using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
    { 
     byte[] encryptedString = UE.GetBytes(stringToEncrypt); 
     cs.Write(encryptedString, 0, encryptedString.Length); 
     cs.FlushFinalBlock(); 
     return ms.ToArray(); 
    } 
} 

public static string DecryptString(byte[] stringToDecrypt, string encryptionKey) 
{ 
    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] key = UE.GetBytes(encryptionKey); 

    using (RijndaelManaged RMCrypto = new RijndaelManaged()) 
    using (MemoryStream ms = new MemoryStream()) 
    using (ICryptoTransform decryptor = RMCrypto.CreateDecryptor(key, key)) 
    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
    { 
     cs.Write(stringToDecrypt, 0, stringToDecrypt.Length); 
     cs.FlushFinalBlock(); 
     return UE.GetString(ms.ToArray()); 
    } 
} 
+1

Ou base64 l'encoder si vous avez besoin d'une chaîne. (On dirait que c'est ce que l'OP a fini par faire ...) – GalacticCowboy

+0

Oui, je me débarrasse de (la plupart des) objets, j'ai juste utilisé l'échantillon pour plus de clarté - mais j'avais manqué d'en disposer un que je n'aurais pas attrapé de pas fait remarquer - merci. – schmoopy

+0

Curieux - pourquoi quelqu'un a-t-il déprécié cela? Un commentaire serait le bienvenu. –