12 votes

Quel est l'équivalent en C# du SecretKeySpec de Java ?

J'ai le code suivant écrit en Java

Mac mac = Mac.getInstance("HmacSHA1");
String secretKey ="sKey";
String content ="Hello";

byte[] secretKeyBArr = secretKey.getBytes();    
byte[] contentBArr = content.getBytes();

SecretKeySpec secret_key = new SecretKeySpec(secretKeyBArr,"HmacSHA1");
byte[] secretKeySpecArr = secret_key.getEncoded();

mac.init(secret_key);

byte[] final = mac.doFinal(contentBArr);

Je veux faire le même exemple en C#. J'ai donc écrit le code suivant

HMACSHA1 hmacsha1 = new HMACSHA1();
string secretKey = "sKey";
string content = "Hello";

byte[] secretKeyBArr = Encoding.UTF8.GetBytes(secretKey);
byte[] contentBArr = Encoding.UTF8.GetBytes(content);

hmacsha1.Key = secretKeyBArr;
byte[] final = hmacsha1.ComputeHash(contentBArr);

Les résultats finaux ne sont pas identiques. secretKeyBArr et contentBArr sont des tableaux d'octets et leurs valeurs sont les mêmes dans les deux exemples. Ce que l'on ne connaît pas, c'est le SecretKeySpec passé à mac.init(). Alors, quelle est la classe équivalente en C# ?

1voto

owlstead Points 22329

Les résultats sont identiques, mais Java utilise des octets signés alors que C# utilise par défaut des octets non signés.

En outre, SecretKeySpec elle-même ne modifie normalement pas les données sous-jacentes. Vous devez, par exemple, mettre une spécification de clé DES dans un fichier SecretKeyFactory pour s'assurer que les bits de parité sont correctement positionnés (dans le résultat de l'opération). SecretKey ). Il n'est donc pas nécessaire d'avoir un équivalent, car la classe elle-même ne fait pas grand-chose, si ce n'est envelopper les données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X