sagar.panuganti Ответов: 2

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

2 Ответов

Рейтинг:
1

Richard MacCutchan

Я провел два простых теста, которые демонстрируют, что один и тот же исходный текст производит одно и то же хэш-значение как в C#, так и в Java.


sagar.panuganti

Пожалуйста, посмотрите на улучшенный вопрос

sagar.panuganti

вы имеете в виду messageDigest.digest() в java
= sha256Hash.ComputeHash(Rawdatabytes) в c#

так что проблема может быть связана с большим целочисленным преобразованием ??

Рейтинг:
0

CPallini

Во-первых, убедитесь, что вы передаете одинаковые входные значения в оба кода.
Затем, если результат все еще отличается, проверьте их по известной рабочей программе (например, онлайн-программе), чтобы выяснить, какая из них сломана.


Richard MacCutchan

Смотрите мой последний комментарий выше.