我需要将作为扰码脚本的 python 脚本转换为执行相同操作的 Java 类。我已经尝试过了,但我无法得到正确的结果。
这是我的python代码:
class scramble7prng:
def __init__(self, seed):
self.ix= 0
self.buffer= [ 0 for i in range(624) ]
self.seedbuffer(seed)
def dumpbuffer(self):
for x in self.buffer:
print " %08x" % x,
print
def seedbuffer(self, seed):
for i in range(624):
self.buffer[i]= seed
seed= (1812433253 * ((seed ^ rshift(seed, 30)) + 1)) & 0xFFFFFFFF
def getbyte(self):
x= self.getint()
if isneg(x):
x= negate(x)
return x % 256
def getint(self):
if self.ix==0:
self.mixbuffer()
val= self.buffer[self.ix]
self.ix = (self.ix+1) % 624
val ^= rshift(val, 11) ^ lshift((val ^ rshift(val, 11)), 7) & 0x9D2C5680;
return rshift((val ^ lshift(val, 15) & 0xEFC60000), 18) ^ val ^ lshift(val, 15) & 0xEFC60000;
def mixbuffer(self):
i=0
j=0
while i<624:
i += 1
v4= (self.buffer[i%624] & 0x7FFFFFFF) + (self.buffer[j]&0x80000000)
v6 = rshift(v4,1) ^ self.buffer[(i+396)%624]
if v4&1:
v6 ^= 0x9908B0DF
self.buffer[j] = v6
j += 1
def newscramble(serverrandom, seed):
prng= scramble7prng(seed)
for i in range(100):
byte100= prng.getbyte()
return "".join(chr(ord(c)^(prng.getbyte()&byte100)) for c in serverrandom)
这是我尝试转换的 Java 代码。
public class Scramble {
public static final int SIZE = 624;
int seed;
int[] buffer = new int[SIZE];
int ix = 0;
public Scramble(int seed) {
this.seed = seed;
for (int i = 0; i < 624; i++) {
buffer[i] = seed;
seed = 1812433253 * ((seed ^ (seed >> 30)) + 1) & 0xFFFFFFFF;
}
}
public byte[] getScramble(byte[] serverRandom)
{
byte[] result = new byte[serverRandom.length];
byte byte100 = 0;
for (int i = 0; i < 100; i++) {
byte100 = getByte();
}
for (int i = 0; i < serverRandom.length; i++) {
byte b = (byte) (getByte() & byte100);
result [i] = ((byte) (serverRandom[i] ^ b));
}
return result;
}
private byte getByte()
{
int x = getInt();
if(isNeg(x))
{
x = negate(x);
}
return (byte) (x);
}
private int getInt()
{
if(ix == 0)
{
mixBuffer();
}
int val = buffer[ix];
ix = (ix+1) % 624;
val ^= (val >> 11) ^ ((val ^ (val >> 11)) << 7) & 0x9D2C5680;
val = (int) (((val ^ (val << 15) & 0xEFC60000) >> 18) ^ val ^ (val << 15) & 0xEFC60000);
return val;
}
private void mixBuffer()
{
for (int i = 1, j = 0; i <= SIZE; i++, j++) {
int v4 = (buffer[i % SIZE] & 0x7FFFFFFF) + (buffer[j] & 0x80000000);
int v6 = (v4 >> 1) ^ buffer[(i + 396) % 624];
if( (v4 & 1) == 1 )
{
v6 ^= 0x9908B0DF;
}
buffer[j] = v6;
}
}
private boolean isNeg(int number)
{
return Integer.signum(number) == -1;
}
private int negate(int number)
{
return Integer.reverse(number) >> 8;
}
}
预期结果取决于随机生成的其他变量。该脚本应该采用一个 int 和一个 byte[],然后使用类及其方法对它们进行加扰,并返回一个新的 byte[],它将附加到基本密钥并用作 rc4 的密钥