2009-07-28 11 views
0

Contexte:Comment puis-je porter une bibliothèque AES Javascript sur .NET pour assurer l'interopérabilité?

J'ai données que je chiffrant avec javascript côté client qui doit être déchiffré sur le côté serveur. Pour autant que je sache, la bibliothèque AES javascript que j'utilise n'interface pas avec la bibliothèque C# Rijndael.

Ainsi, il me reste essentiellement à implémenter le javascript AES en C# pour l'utiliser.

Je vais essayer de compiler le javascript en utilisant jsc.exe dans une DLL et voir si le réflecteur peut me faire gagner du temps. Je suis conscient que jscript n'est pas la même chose que javascript, mais j'espère pouvoir m'en tirer avec quelque chose qui fonctionne avec frénésie, et faire les retouches manuellement.

Problème:

Lorsque je compile le javascript en utilisant JSC je reçois l'erreur suivante:

error JS1234: Only type and package definitions are allowed inside a library

La ligne incriminée est cette première ligne dans les lignes de code suivantes:

var GibberishAES = (function(){ 
    var Nr = 14, 
    /* Default to 256 Bit Encryption */ 
    Nk = 8, 
    Decrypt = false, 

    enc_utf8 = function(s) 
    { 
     try { 
      return unescape(encodeURIComponent(s)); 
     } 
     catch(e) { 
      throw 'Error on UTF-8 encode'; 
     } 
    }, 

    dec_utf8 = function(s) 
    { 
     try { 
      return decodeURIComponent(escape(s)); 
     } 
     catch(e) { 
      throw ('Bad Key'); 
     } 
    }, 

Et la source complète peut être found here:

Je ne sais pas quel est le problème. Je suis également ouvert aux suggestions sur la façon de crypter/décrypter les données entre Javascript et C#.

+0

Je n'ai pas de réponse, mais je suis juste curieux de savoir pourquoi vous ne pouvez pas simplement utiliser HTTPS pour gérer le cryptage entre client et serveur? – Alconja

+0

Il est difficile de dire quel est le problème, car la ligne que vous avez fournie n'a pas beaucoup de sens et n'est pas une déclaration complète. Est-il possible pour vous d'ajouter plus de lignes de code? – kanngard

+0

@Alconja: Malheureusement, je n'ai aucun contrôle sur l'utilisation de SSL entre le client et le serveur. Certains clients vont installer SSL, tandis que d'autres ne le feront pas. Toutes les données sensibles doivent donc être cryptées côté client pour être transmises. @kanngard: Ok, j'ai mis à jour, plus ajouté un lien vers le fichier js complet. Merci! – Alan

Répondre

1

Si vous voulez juste faire AES de Javascript, avez-vous essayé slowAES? It worked for me.. J'ai trouvé un bon interop entre slowAES et les classes intégrées Rijndael ou AES dans .NET. J'ai aussi trouvé que la conception de la classe était naturelle et facile à utiliser et à comprendre. Cela ne nécessiterait pas de passer de Javascript à JScript.

La dérivation de clé basée sur le mot de passe n'est pas réellement gérée par SlowAES. Si vous en avez besoin (probablement), alors je suggère the PBKDF2 implementation from Parvez Anandam. I also have used that, et cela fonctionne bien. Lorsque j'ai testé slowAES couplé avec PBKDF2 d'Anandam, il a eu une bonne interopérabilité avec la classe RijndaelManaged de C#, en mode CBC.

Ne soyez pas rebutés par le nom "slowAES" - ce n'est pas vraiment lent. C'est nommé "lent" parce que c'est Javascript.

Si vous ne pouvez pas utiliser quelque chose qui est propre et compatible comme slowAES, alors avant d'essayer le compilateur jsc, je suggère d'empaqueter le code javascript existant dans un Windows Script Component. Le WSC vous permet de grouper la logique de script en tant que composant COM, où elle devient utilisable par tout environnement compatible COM, y compris toute application .NET. Voici a post that shows how to package slowAES as a WSC. Pour une raison quelconque, peu de gens savent que vous pouvez emballer du code de script en tant que composant COM, mais cela fait 10 ans que vous le savez. Cela peut sembler inhabituel pour vous, mais il vaut mieux faire le port. Le code à l'intérieur du WSC est Javascript, pas Javascript.NET.

+0

Merci pour les suggestions! J'ai fini par mordre la balle et faire le port. Étonnamment ce n'était pas trop mal surtout avec l'aide du débogueur. J'ai commencé à utiliser la méthode WSC que vous avez suggérée, mais j'avais peur de la performance. – Alan

0

J'ai aussi eu ce problème aujourd'hui. Il m'arrive de trébucher sur la solution.utiliser package theNameSpace { class Whatever { function func() { return "the results"; } } }