2016-09-15 8 views
0

私は簡単な質問があります。 私はだから私は、このJavaタラはと仕事をしなければならないC#SHA256をJavaからCに変換する

にJavaからSHA256チェックサムメソッドを書き換える必要があります。

Canonicalizer c14Canonicalizer = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS); 
byte[] byteArray = c14Canonicalizer.canonicalizeSubtree(doc); 

// At this point, the byteArray in Java and the data in C# matches up. 
// That is, after the java bytes are converted to unsigned bytes using 
// java.lang.Byte.toUnsignedInt() 

MessageDigest md = MessageDigest.getInstance("SHA-256"); 
md.update(byteArray); 
byte byteData[] = md.digest(); 

(ByteArrayのは、あなたが、バイト配列それを推測:D)を

それぞれのHashAlgorithm派生クラス(この場合はSHA256)のTransformBlock()メソッドとTransformFinalBlock()メソッドの代わりに、update()メソッドとdigest()メソッドを基本的に置き換える必要があります。

は、だから私はC#でこれに似た何かを試してみた:

var data = Encoding.UTF8.GetBytes(xmlString); 

// At this point, the byteArray in Java and the data in C# matches up. 
// That is, after the java bytes are converted to unsigned bytes using 
// java.lang.Byte.toUnsignedInt() 

using (var sha256 = SHA256.Create()) 
{ 
    byte[] shaBytes = new byte[data.Length]; 
    data.CopyTo(shaBytes, 0); 

    sha256.TransformBlock(shaBytes, 0, shaBytes.Length, shaBytes, 0); 

    sha256.TransformFinalBlock(shaBytes, 0, shaBytes.Length); 
    return sha256.Hash; 
} 

(そして再び、データをバイト配列である)

しかし、バイトが一致しません。私はここに何かを逃していますか

(よく私はもちろん、それ以外の場合はうまくいく、右:?S)

UPDATEあなたに行くためにいくつかのより多くの情報を与えることを

は、私は間のバイトと一致しました上記のコードを実行する前にJavaとC#コードを使用してください。そして、彼らは一致します。ただし、C#コードのバイトはUTF8エンコードされた文字列から取得され、Javaバイトはc14Canonicalizer.canonicalizeSubtree()メソッドから取得されます。

私は上記のコード例にその起源を含むように更新します。それは価値があるものについて

UPDATE

、ジャワmd.digest()メソッドは、次のバイトを戻します

-86、44、95、84、3、50、7、-119 -36、-46、-39、-32、-120、-70、-86、-101、110、-93、-72、-13、-93、-42、111、0、59、 63、-15、-98、-17、-52

170,44,95,84,3,50,7,137,220,46,39,32,136,7,10,170,155,110,163,184に変換し、その変換され、 243,163,214,111,0,59,171,193,241,158,239,204

C#コードは

72,108,14,47,15,200,209,10,68,87,17,220,67,226,162,123,69,186,130,167,239,250,180,178,75,101,39,195,32,171,156,178

sha256.ComputeHash()を使用して返しながら

+0

この質問を休耕してください:http://stackoverflow.com/questions/1521249/generating-an-xml-document-hash-in-c-sharp – mkysoft

+1

独立したツールを何(読み:作業保証) 'sha256sum'のように印刷しますか? – rustyx

+0

@RustyX http://onlinemd5.comで試したところ、結果はJavaコードの結果と同じです。 – Shazi

答えて

0

問題が見つかりました。問題は、xml-stringの改行に使用された文字です。私のxml \ r \ nは改行のために使用されていますが、実行する必要があったのは、javaが使うものと思われる\ nに変更することでした。

私はGerben Rampaartが異なるオンラインSHA256、電卓やken2kに同じことを気づいていた答えhere私はSHA256.TransformFinalBlock()が魅力のように働いたことをやった後は差が

何であったかを知っていました。

最終的な解決策は、このようなものになります。

public byte[] GetDocumentHash(XmlDocument doc) 
{ 
    string formattedXml; 
    Transform canonicalTransform = new XmlDsigExcC14NWithCommentsTransform(); 
    canonicalTransform.LoadInput(doc); 

    using (Stream canonicalStream = (Stream)canonicalTransform.GetOutput(typeof(Stream))) 
    using (var stringWriter = new EncodingStringWriter(Encoding.UTF8)) 
    using (var xmlTextWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { NewLineChars = "\n", CloseOutput = false, Encoding = Encoding.UTF8, Indent = true, OmitXmlDeclaration = true })) 
    { 
     XmlDocument newDoc = new XmlDocument(); 
     newDoc.Load(canonicalStream); 
     newDoc.WriteTo(xmlTextWriter); 
     xmlTextWriter.Flush(); 
     formattedXml = stringWriter.GetStringBuilder().ToString(); 
    } 

    byte[] bytesToCalculate = Encoding.UTF8.GetBytes(formattedXml); 

    using (var sha256 = SHA256.Create()) 
    { 
     byte[] shaBytes = new byte[bytesToCalculate.Length]; 
     bytesToCalculate.CopyTo(shaBytes, 0); 

     sha256.TransformFinalBlock(shaBytes, 0, shaBytes.Length); 
     return sha256.Hash; 
    } 
} 

が必要なリファクタリングや精錬の多くは、おそらくだが、それは仕事を取得します。

私を助けてくれた皆さん、ありがとう!

0

ComputeHashメソッドを試しましたか?

すなわち:

var byteArray = Encoding.ASCII.GetBytes("hello"); 
var sha = SHA256.Create(); 
byte[] outputBytes = sha.ComputeHash(byteArray); 
var result = BitConverter.ToString(outputBytes).Replace("-", "").ToLower(); 

EDIT

あなたはこれを試すことができますか?

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("xmlString"); 
XmlDsigExcC14NWithCommentsTransform c14n = new XmlDsigExcC14NWithCommentsTransform(); 
c14n.LoadInnerXml(doc.ChildNodes); 
Stream s = (Stream)c14n.GetOutput(typeof(Stream)); 
var sha = SHA256.Create(); 
byte[] outputBytes = sha.ComputeHash(s); 
+0

はい、私は役に立たないです。 – Shazi

+0

md.digest()の結果を共有できますか?関数 ? –

+1

@QuentinRoger ALGO_ID_C14N_EXCL_WITH_COMMENTSアルゴリズムを使用してXMLドキュメントのShazi calcalateハッシュを作成します。 ComputeHashと同じことを計算することはできません。私たちは暗号を使う必要があります。この質問をチェック:http://stackoverflow.com/questions/1521249/generating-an-xml-document-hash-in-c-sharp – mkysoft

0

以下のサンプルで同じ結果が得られる場合があります。あなたは同じ操作を長い道のりにしているからです。あなたのコードでは、XmlDsigExcC14NWithCommentsTransformからXMLをきれいにして、ハッシュを計算しています。以下は、直接計算する例です。

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<a><xmlString>mkysoft</xmlString></a>"); 
XmlDsigExcC14NWithCommentsTransform c14n = new XmlDsigExcC14NWithCommentsTransform(); 
c14n.LoadInput(doc); 
var digest = c14n.GetDigestedOutput(SHA256.Create()); 
+0

私は実際にその方法を試しましたが、新しい行を\ r \ nとして解釈し、それをあなた自身に変更するよりも異なるダイジェストを与えます。したがって、なぜダイジェストを取得する前にXmlWriterを経由する必要があるのですか – Shazi

関連する問題