Sha 256 в java и C# получают разные значения
На самом деле у меня есть java код который мне нужно преобразовать в c#
Java-код
salt="40be4e59b9a2a2b5dffb918c0e86b3d75727a8f82b898d65cf87017309818b35f5c07a364ee3e7117730058065c1bad8a43491dc6549e17b6b0c85b144ada408ca7a1e8c7505e41f91e5d0f37996fa1dd54e68160fb44631f7d5cfec517bcacf4a8a0b2ed3321d881ce224060b4c22c6d97461595d6e8d604a1c41f646adb19c06f8398c1b8ceeb9d1f090aa67cfe5b31b0741a407e93c92e421f759d475e70cc306bb88f0678921eaaacf10da4f5cdada4d288514aae58c06ae5f752ae814e321d2dcbd5cf6e1621e6f154fc88d6cfe31bdc17d94595f038874ffaebad9656f3278b2694c439cbb263494b76b8b4ed81547aae71a98a722448fe11cd348d4f2e4123b42bac43c64b378914536e8b352"; MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(salt.getBytes()); result=new BigInteger(messageDigest.digest()); result=-8679331902525424680818339047284551675590913508739318217139721412571178967790
и я попытался перейти на Си#
Что я уже пробовал:
rawData="40be4e59b9a2a2b5dffb918c0e86b3d75727a8f82b898d65cf87017309818b35f5c07a364ee3e7117730058065c1bad8a43491dc6549e17b6b0c85b144ada408ca7a1e8c7505e41f91e5d0f37996fa1dd54e68160fb44631f7d5cfec517bcacf4a8a0b2ed3321d881ce224060b4c22c6d97461595d6e8d604a1c41f646adb19c06f8398c1b8ceeb9d1f090aa67cfe5b31b0741a407e93c92e421f759d475e70cc306bb88f0678921eaaacf10da4f5cdada4d288514aae58c06ae5f752ae814e321d2dcbd5cf6e1621e6f154fc88d6cfe31bdc17d94595f038874ffaebad9656f3278b2694c439cbb263494b76b8b4ed81547aae71a98a722448fe11cd348d4f2e4123b42bac43c64b378914536e8b352"; using ( SHA256 sha256Hash = SHA256.Create()) { var Rawdatabytes = System.Text.Encoding.ASCII.GetBytes(rawData); byte[] bytes = sha256Hash.ComputeHash(Rawdatabytes); var result = new System.Numerics.BigInteger(bytes); } result=8306751456257555796593622157661757526221618682565362023319192974333645213676
for both java and c# are getting different result can any one help us to solve the issue also for java code we are getting negative value and for c# we are getting positive please can any one know the solution
Richard MacCutchan
Какая часть результата отличается, необработанные байты или BigInteger?
sagar.panuganti
результат был другим..
в обоих случаях входные данные были одинаковыми
но результат был другим
Richard MacCutchan
Какой результат-до преобразования в BigInteger или после? Вам нужно точно объяснить, какие значения отличаются, мы не можем видеть ваш экран или догадываться, что происходит в вашем коде.
sagar.panuganti
result=new BigInteger(messageDigest.digest()); это java
var result = новая система.Численные данные.BigInteger(байты); в c#
после преобразования в BIGINTEGER значения становятся другими
Richard MacCutchan
Каковы хэш-значения до преобразования и каковы значения BigInteger после преобразования? Пожалуйста предоставить полный информация, просто показывающая пару строк кода, не дает нам никакого ключа к тому, что вы видите.
sagar.panuganti
я изменил его, пожалуйста, посмотрите на него..
Richard MacCutchan
Ошибка, которую вы делаете, заключается в попытке преобразовать массив байтов (который вы не показали в своих примерах) в целое значение. Из-за того, как код C# интерпретирует массив (см. Конструктор BigInteger (System.Числовые Значения) | Майкрософт Документы[^]) генерируемое значение будет отличаться от значения, генерируемого в коде Java. Если вы распечатаете сгенерированные массивы байтов в обоих примерах кода, то увидите, что они одинаковы. Таким образом, ответ заключается в том, чтобы манипулировать вашим хэш-результатом только как массивом байтов.
sagar.panuganti
есть ли какой-нибудь способ преобразовать в biginteger, который соответствует java-коду.. потому что это токен аутентификации для api.. мне нужно отправить это значение BIGinteger в качестве токена для вызова api...
Richard MacCutchan
Затем вам нужно будет изменить порядок байтов в коде C#, как описано в документации, на которую я дал вам ссылку.
Chad3F
Если у вас есть какой-либо контроль над принимающей стороной, то следует изменить его, чтобы использовать необработанные дайджест-байты (обычно закодированные как шестнадцатеричные), а не bigint. Обычно именно так они представлены в тексте почти всем. В другом комментарии уже упоминалось об этом, но это следует подчеркнуть.
В этом примере это будет: eccfac173ba2b3438e9542455aa4d3065e3f11c51df755bab51d15f067745d12