Frage

Ich frage mich, wenn jemand helfen könnte mir diese Methode zu Rubin umgewandelt zu bekommen, ist dies möglich?

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;
}

Vielen Dank im Voraus


UPDATE:

Ich möchte nur klarstellen, dass leider Methode es ist nicht nur für SHA512 Generation, sondern eine benutzerdefinierte ein. Ich glaube, dass die Digest :: SHA512.hexdigest nur die SHHast Instanz sein würde, aber wenn Sie genau für die Methode können Sie sehen, dass es ein bisschen von einer einfachen Hash-Generation unterscheidet. Folgt das Ergebnis der beiden Funktionen.

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

# in Ruby
Digest::SHA512.hexdigest("hello") || Digest::SHA2 => "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043" 
War es hilfreich?

Lösung

require 'digest/sha2'

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

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

Wie bei allen meinen Code-Schnipsel auf Stackoverflow, ich die neueste Version von Ruby immer annehmen. Hier ist eine, die auch mit Ruby-Werk 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'

Beachten Sie, dass in diesem Fall müssen Sie wissen und sagen Rubin über die die Zeichenfolge codiert, ist explizit in. In Ruby 1.9, weiß Rubin immer das, was ein String-Codierung ist in, und es wird entsprechend konvertieren, wenn erforderlich. Ich entschied ich für UTF-8 als Standard-Codierung, da es abwärtskompatibel mit ASCII ist, ist die Standard-Codierung im Internet und auch sonst weit verbreitet. Jedoch beispielsweise sowohl .NET- und Java-Anwendung UTF-16LE, nicht UTF-8. Wenn die Zeichenfolge nicht UTF-8 oder ASCII-codiert sind, werden Sie in dem Codierung Namen in die sha512 Methode übergeben müssen.


Off-Topic: 9 Zeilen Code reduziert 1. Ich liebe Rubin

Nun, eigentlich, dass ein wenig ist etwas unfair. Sie haben es geschrieben könnte so etwas wie folgt aus:

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)
);

Welche wirklich nur 3 Zeilen ist (aufgeschlüsselt in 5 für Stackoverflow Layout) und die meisten bekommt wichtiger rid, dass hässliche Stil der 1950er Jahre explizite for Schleife für einen schönen Stil der 1960er und falten (aka. reduce aka. inject aka. Aggregate aka. inject:into: ... es ist alles das gleiche).

Es ist wahrscheinlich ein noch eleganter Weg, dies zu schreiben, aber a) Ich weiß nicht wirklich C # und .NET und b) diese Frage zu Ruby. Fokus, Jörg, Fokus! : -)

aaand ... fand es:

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

I wußte es hatte eine äquivalent zu Rubys Enumerable#join irgendwo sein, ich an der falschen Stelle nur hinsah.

Andere Tipps

Mit dem Digest :: SHA2 Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top