2012-10-08 12 views
12

Sono un nuovo sviluppatore di Windows 8, ho un codice che è stato progettato per Linux, ma anche eseguito su Windows fino a quando GTK # è stato installato.System.Security.Cryptography vs. Windows.Security.Cryptography

Attualmente sto eseguendo il porting di quell'applicazione su Windows 8 come app Modern UI (Metro). Sta andando bene, tranne quando cerco di importare il mio codice di derivazione della chiave (che prende la password dell'utente e ne ricava una chiave da 256 bit), Visual Studio Ultimate 2013 indica che non riconosce using System.Security.Cryptography.

Dopo aver esaminato il sito Web degli sviluppatori di Windows 8, ho scoperto che una nuova classe, Windows.Security.Cryptography è disponibile, tuttavia, non sembra essere riconosciuta da Visual Studio.

Così, ora che avete il fondo, ho alcune domande:

  1. E` System.Security.Cryptography disponibili in Windows 8? In tal caso, è supportata la versione RT? Come posso far sì che Visual Studio lo riconosca?
  2. In che modo Windows.System.Security è diverso e esiste un metodo/classe compatibile per Rfc2898DeriveBytes? Per compatibilità, voglio dire data la stessa password e sale c'è un modo per ottenere la stessa chiave di conseguenza.

Per chiarimenti circa quello che voglio fare, il mio codice di derivazione della chiave è allocata sotto:

public class GetKey 
{ 
    // constructor 
    public GetKey (bool use=true, string password="none") 
    { if (use == true) 
     { 
      this.genSalt(); 
      byte[] salt = this.salt; 
      Rfc2898DeriveBytes pwdKey = new Rfc2898DeriveBytes(password, salt, 4000); 
      this.key = pwdKey.GetBytes(32); 
      this.iv = pwdKey.GetBytes(16); 
     } 
    } 

    // properties 
    private byte[] key; 
    private byte[] iv; 
    private byte[] salt; 

    // methods 
    public void retrieveKey(string password) 
    { 
     try 
     { 
      byte[] salt = this.salt; 
      Rfc2898DeriveBytes pwdKey = new Rfc2898DeriveBytes(password, salt, 4000); 
      this.key = pwdKey.GetBytes(32); 
      this.iv = pwdKey.GetBytes(16); 
     } 
     catch (Exception e) 
     { 
      GenericDialog win = new GenericDialog("Unknown Error: " + e.Message, "Error Notice", "Unknown Error"); 
      win.Show(); 
     } 
    } 

    public void genSalt() 
    { 
     string sSalt = UtilityClass.randString(16); 
     byte[] salt = UtilityClass.ToByteArray(sSalt); 
     this.salt = salt; 
    } 

    public byte[] returnKey() 
    { 
     return this.key; 
    } 

    public byte[] returnIv() 
    { 
     return this.iv; 
    } 

    public byte[] returnSalt() 
    { 
     return this.salt; 
    } 
    public bool setSalt(string salt) 
    { 
     try 
     { 
      this.salt = Convert.FromBase64String(salt); 
     } 
     catch 
     { 
      GenericDialog win = new GenericDialog("Decryption failed because the salt was invalid.", "Error Notice", "Invalid Salt"); 
      win.Show(); 
      return false; 
     } 
     return true; 
    } 
} 
+0

'Windows.Security.Cryptography' sembra solo per contenere tre classi o giù di lì, non quello che stai dopo suppongo. Non vedo alcun motivo per cui 'System.Security.Cryptography' non dovrebbe essere parte di Windows 8. È nel framework .NET, quindi perché non dovrebbe essere? Penso che tu stia soffrendo di un problema di riferimento mancante. –

+0

I riferimenti devono essere aggiunti manualmente per alcune classi? – Razick

+1

sì, sarà necessario aggiungere il riferimento a System.Security e quindi System.Security.Cryptography verrà risolto ma per le app desktop di Windows 8 non solo Windows Store (nee Metro). –

risposta

11

1) System.Security.Cryptography non è disponibile nelle app di Windows Store, quindi sarà necessario utilizzare Windows.Security.Cryptography. Vedi il link sottostante per una buona spiegazione sul riutilizzo delle librerie di classi per diversi framework di destinazione con librerie portatili .NET. Se necessario, puoi sempre iniettare un'astrazione usando il tuo contenitore IoC preferito.

http://www.hanselman.com/blog/HiddenGemsInVisualStudio11BetaNETPortableClassLibraries.aspx

2) Non vedo l'implementazione di Rfc2898DeriveBytes in Windows.Security.Cryptography o qualcosa di simile. Vedi sotto.

http://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.symmetricalgorithmnames.aspx

Problemi correlati