-2
私はアンドロイドで達成したい問題があります。 ( - >バイト[4])+ベット数( - >バイト[4]) これをアンドロイドでどうやって解決するのですか?符号付きバイト
式
- サーバーシード+クライアント・シードがあります
- 1600万未満の値が見つかるまで、3バイトのグループを取得し、整数に変換してください。バイトが足りなくなった場合は、もう一度 をハッシュしてやり直してください。
- 値のモジュラス1を求める
- モジュラスはベットの結果です!これらの値を用いて
static bool VerifyBetResult(string serverSeed, int clientSeed, int betNumber, long betResult, string serverSeedHash = null) { Func<string, byte[]> strtobytes = s => Enumerable .Range(0, s.Length/2) .Select(x => byte.Parse(s.Substring(x * 2, 2), NumberStyles.HexNumber)) .ToArray(); byte[] server = strtobytes(serverSeed); byte[] client = BitConverter.GetBytes(clientSeed).Reverse().ToArray(); byte[] num = BitConverter.GetBytes(betNumber).Reverse().ToArray(); byte[] serverhash = serverSeedHash == null ? null : strtobytes(serverSeedHash); byte[] data = server.Concat(client).Concat(num).ToArray(); using (SHA512 sha512 = new SHA512Managed()) { if (serverhash != null) using (SHA256 sha256 = new SHA256Managed()) if (!sha256.ComputeHash(server).SequenceEqual(serverhash)) throw new Exception("Server seed hash does not match server seed"); byte[] hash = sha512.ComputeHash(sha512.ComputeHash(data)); while (true) { for (int x = 0; x <= 61; x += 3) { long result = (hash[x] << 16) | (hash[x + 1] << 8) | hash[x + 2]; if (result < 16000000) return result % 1000000 == betResult; } hash = sha512.ComputeHash(hash); } } }
C#でのサンプルコードを有する
は
serverSeed = e600f76aa6c520dff7db34559bd05cb1048b1830a07cd81844147a19048fc9be;
clientSeed = 443944;
betNumber = 0;
serverHash = ca90022ac66a6a77d8b5072e101bff505c2bff552b1b9a0785f0c438d5b6228f;
Iはであるべきである(結果%1000000)を見つけたい= 563383
しかし、私は得た - と
をSHA256するシードをハッシュするときserverHashはserverSeedと一致していない更新 これは私のコードです:はるかに研究した後
private byte[] reverse(byte[] b){
int i = b.length - 1;
byte newB[] = new byte[4];
for(int x = 0; x < b.length; x++){
newB[x] = b[i];
i--;
}
return newB;
}
private byte[] strToByte(String s) {
int len = s.length();
byte[] data = new byte[len/2];
for(int i = 0; i < len; i+=2){
data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
}
return data;
}
private long verifyBet(){
//MessageDigest md256 = null;
MessageDigest md512 = null;
try {
//md256 = MessageDigest.getInstance("SHA-256");
md512 = MessageDigest.getInstance("SHA-512");
} catch (Exception e) {
e.printStackTrace();
}
String //res = "ServerSeed = ",
sSeed = "e600f76aa6c520dff7db34559bd05cb1048b1830a07cd81844147a19048fc9be";
//sHash = "ca90022ac66a6a77d8b5072e101bff505c2bff552b1b9a0785f0c438d5b6228f";
int cSeed = 443944,
num = 0;
byte serverSeed[] = strToByte(sSeed),
//serverHash[] = strToByte(sHash),
clientSeed[] = reverse(ByteBuffer.allocate(4).putInt(cSeed).array()),
betNumber[] = reverse(ByteBuffer.allocate(4).putInt(num).array());
byte data[] = ByteBuffer.allocate(serverSeed.length + clientSeed.length + betNumber.length)
.put(serverSeed).put(clientSeed).put(betNumber).array();
data = md512.digest(data);
data = md512.digest(data);
long secret = 0;
boolean found = false;
while(!found){
for(int x = 0; x <= 61; x += 3){
long result = (data[x] << 16 | data[x+1] << 8) | data[x+2];
if (result < 16000000){
secret = result % 1000000;
found = true;
}
}
data = md512.digest(data);
}
return secret;
}
私はjava
でbyte
がsigned
中であることがわかりました私がベースとしているコードは、unsigned
byte
で計算されているため、結果が負になります。
「符号なし」形式のバイトセットを取得するにはどうすればよいですか?