2010-10-15 4 views
1

J'ai une application propriétaire qui utilise une extension pour gérer la cryptographie. Pour crypter une chaîne, je lui donne les paramètres Exponent, Modulus, Base et string. Il renvoie la chaîne chiffrée.Cryptage RSA en C# en utilisant Exponent, Modulus et Base en tant que paramètres

Je dois être capable de répliquer cette fonctionnalité dans une application C# qui parle à l'application propriétaire. Je ne sais pas par où commencer - et j'apprécierais toute aide que vous pourriez donner.

C'est ce que j'ai en ce moment;

public class Cryptography 
{ 
    public static RSACryptoServiceProvider rsa; 

    public static void AssignParameter() 
    { 
     const int PROVIDER_RSA_FULL = 1; 
     const string CONTAINER_NAME = "SpiderContainer"; 
     CspParameters cspParams; 
     cspParams = new CspParameters(PROVIDER_RSA_FULL); 
     cspParams.KeyContainerName = CONTAINER_NAME; 
     //cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 
     cspParams.ProviderName = "Microsoft Strong Cryptographic Provider"; 
     rsa = new RSACryptoServiceProvider(cspParams); 
    } 

    public static string Sencrypt(string input) 
    { 

     RSAParameters parameters = new RSAParameters(); 
     parameters.Modulus = System.Text.Encoding.Unicode.GetBytes("nononomonomnomfoononmo"); 
     parameters.Exponent = System.Text.Encoding.Unicode.GetBytes("b"); 
     rsa.ImportParameters(parameters); 

     byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(input); 
     byte[] cipherbytes = rsa.Encrypt(plainbytes, false); 

     System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
     //return enc.GetString(cipherbytes); 
     return Convert.ToBase64String(cipherbytes); 

    } 
} 

Quand je crypter des données à l'aide de l'application propriétaire, puis essayez d'utiliser le code ci-dessus - la résultante des données chiffrées est différent.

Je ne sais pas comment procéder.

modifier; Il renvoie une chaîne différente chaque fois qu'il est exécuté. En utilisant la même chaîne d'entrée.

+0

Vous devez afficher le code de l'extension que vous essayez de faire correspondre. Le chiffrement qui utilise "Exponent, Modulus, Base et string" comme paramètres laisse un nombre infini de possibilités. Il serait inutile pour nous d'essayer de deviner. Votre code C# pour Modulus et Exponent est quelque peu difficile à croire. Où avez-vous eu ces ficelles? –

Répondre

0

Votre initialisation de paramètre un peu étrange. Êtes-vous sûr d'obtenir un résultat valide en tant que module (représentation en-dessous de l'octet)?

6E006F006E006F006E006F006D006F006E006F006D006E006F006D0066006F006F006E006F006E006D006F00

et Exponent:

Je pense qu'ils ont tort, en raison de la spécificité du codage Unicode. Vous pouvez juste faire une faute de frappe et vouloir utiliser System.Text.Encoding. UTF8 .GetBytes.

Résultat Modulus sera beaucoup mieux:

6E6F6E6F6E6F6D6F6E6F6D6E6F6D666F6F6E6F6E6D6F

, mais en général, je suggère d'utiliser base64 pour des éléments clés ou clés au lieu de transférer les chaînes de caractères UTF-8.

Vous ne spécifiez pas non plus la taille de clé utilisée. Est-ce 1024 comme par défaut? Donc, je suggère d'essayer UTF8 et de vérifier la taille de la clé. J'espère que cela sera utile.

Peut-être que ce lien sera aussi intéressant pour vous All About RSAParameters

+0

Nice essayer en ce qu'il ne peut pas être le codage. NET Unicode, mais UTF8 ne sauvera pas non plus. Au minimum, l'exposant RSA ne peut pas être pair. –

+0

Oui, ça a l'air bizarre (et Modulus aussi) mais j'espère que l'auteur place juste ces chaînes comme exemple et ne veut pas montrer de vraies valeurs. –

1

Si je comprends bien votre question, GREGS est correcte. Le programme peut coder des clés et des textes chiffrés de plusieurs façons. Malheureusement, si vous n'avez pas de spécification du protocole ou du format de fichier utilisé par l'extension, vous devrez procéder à une ingénierie inverse.

Vous avez commenté le fait que le programme renvoie une chaîne différente chaque fois qu'il est exécuté. C'est une propriété de RSA et, en fait, de toute primitive de chiffrement à clé publique. Les algorithmes déterministes (c'est-à-dire, les algorithmes non aléatoires qui retournent toujours la même sortie avec les mêmes entrées) ne peuvent pas être utilisés comme primitives de chiffrement à clé publique, car ils seraient vulnérables aux attaques choisies en texte brut.

edit: L'implication est que votre approche de cryptage du texte en clair et de comparer le résultat à la sortie du module ne fonctionnera pas. Au lieu de cela, une fois que vous pensez avoir trouvé la sortie RSA que le module d'extension crache, essayez de le décrypter.

Questions connexes