1

我需要将作为扰码脚本的 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 的密钥

4

0 回答 0