Question

Je me demandais si quelqu'un pouvait me aider à obtenir cette méthode convertie en rubis, est-ce possible?

public static string getSHA512(string str){
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] HashValue = null;
    byte[] MessageBytes = UE.GetBytes(str);
    System.Security.Cryptography.SHA512Managed SHhash = new System.Security.Cryptography.SHA512Managed();
    string strHex = "";
    HashValue = SHhash.ComputeHash(MessageBytes);
    foreach (byte b in HashValue){
        strHex += string.Format("{0:x2}", b);
    }
    return strHex;
}

Merci à l'avance


Mise à jour:

Je voudrais juste à préciser que, malheureusement, la méthode de c'est pas seulement pour la génération SHA512 mais un sur mesure. Je crois que le Digest :: SHA512.hexdigest serait juste l'instance SHHast, mais si vous regardez attentivement la méthode, vous pouvez voir qu'il diffère un peu d'une simple génération de hachage. Suit le résultat des deux fonctions.

# in C#
getSHA512("hello") => "5165d592a6afe59f80d07436e35bd513b3055429916400a16c1adfa499c5a8ce03a370acdd4dc787d04350473bea71ea8345748578fc63ac91f8f95b6c140b93"

# in Ruby
Digest::SHA512.hexdigest("hello") || Digest::SHA2 => "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043" 
Était-ce utile?

La solution

require 'digest/sha2'

class String
  def sha512
    Digest::SHA2.new(512).hexdigest(encode('UTF-16LE'))
  end
end

'hello'.sha512 # => '5165d592a6afe59f80d07436e35bd…5748578fc63ac91f8f95b6c140b93'

Comme avec tous mes extraits de code sur StackOverflow, je suppose toujours la dernière version de Ruby. Voici un qui fonctionne aussi avec Ruby 1.8:

require 'iconv'
require 'digest/sha2'

class String
  def sha512(src_enc='UTF-8')
    Digest::SHA2.new(512).hexdigest(Iconv.conv(src_enc, 'UTF-16LE', self))
  end
end

'hello'.sha512 # => '5165d592a6afe59f80d07436e35bd…5748578fc63ac91f8f95b6c140b93'

Notez que dans ce cas, vous devez savent et dire Ruby à propos de l'encodage de la chaîne est en explicitement. Dans Ruby 1.9, Ruby sait toujours ce codant pour une chaîne est, et convertira en conséquence, en cas de besoin. J'ai choisi comme encodage par défaut UTF-8, car il est rétrocompatible avec ASCII, le codage standard sur Internet et aussi par ailleurs largement utilisé. Cependant, par exemple à la fois l'utilisation .NET et Java UTF-16LE, pas UTF-8. Si votre chaîne n'est pas UTF-8 ou ASCII codés, vous devrez passer au nom d'encodage dans la méthode sha512.


Hors sujet: 9 lignes de code réduit à 1. I love Ruby

Eh bien, en fait qui est un peu injuste. Vous auriez pu écrire quelque chose comme ceci:

var messageBytes = new UnicodeEncoding().GetBytes(str);
var hashValue = new System.Security.Cryptography.SHA512Managed().
    ComputeHash(messageBytes);
return hashValue.Aggregate<byte, string>("",
    (s, b) => s += string.Format("{0:x2}", b)
);

Ce qui est vraiment seulement 3 lignes (divisé en 5 pour la mise en page de StackOverflow) et surtout se débarrasser de cette vilaine style des années 1950 boucle explicite for pour une belle-style années 1960 fold (aka. reduce aka. inject aka. Aggregate aka. inject:into: ... il est tout de même).

Il y a probablement je ne sais pas vraiment façon d'écrire, mais a) encore plus élégante C # et .NET et b) cette question est à propos de Ruby. Mise au point, Jörg, mise au point! : -)

... aaand trouvé:

return string.Join("", from b in hashValue select string.Format("{0:x2}", b));

savait il devait y avoir un équivalent à quelque part de Enumerable#join Ruby, je ne cherchait au mauvais endroit.

Autres conseils

Utilisez le Digest :: SHA2 classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top