我只是一个初学的php程序员,因此Java对我来说是完全神奇的。我有一个问题需要解决。如何使用例如PHP函数计算RCRC密钥,因为它在getRC4Key函数中?我已经知道它是这样的:
MD5(MD5(PASSWORD).BIGINTEGER_ENCODING)
但是我不理解ByteArraysUtils。
我将不胜感激任何帮助。在这里,我附上了我认为用于此目的的所有方法。
这是密码声明的示例:
localProperties.put("openjpa.ConnectionPassword", "a33aed8f3134926783dc39f9a7f94783");
这是BigInteger的一个例子:
1333353820499958118
这是声明大整数的方式:
public class ServerModel
{
private BigInteger syncFsUid = null;
private BigInteger syncRunId = null;
private BigInteger syncStreamSeq = null;
private BigInteger recordsDirectorySize = null;
public static final BigInteger UNSIGNED_LONG_MIN = BigInteger.ZERO;
public static final BigInteger UNSIGNED_LONG_MAX = new BigInteger("18446744073709551615");
这是getRC4Key函数:
private byte[] getRC4Key(BigInteger paramBigInteger)
{
try
{
MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
localMessageDigest.reset();
localMessageDigest.update(ServerModel.getInstance().getConnection().getPassword().getBytes("ISO-8859-1"));
byte[] arrayOfByte = localMessageDigest.digest();
localMessageDigest.reset();
localMessageDigest.update(arrayOfByte);
localMessageDigest.update(ByteArraysUtils.BigInteger2ByteArray(paramBigInteger));
return localMessageDigest.digest();
}
}
的Utils:
public final class ByteArraysUtils
{
public static final byte[] BigInteger2ByteArray(BigInteger paramBigInteger)
{
return BigInteger2ByteArray(paramBigInteger, ByteOrder.LITTLE_ENDIAN);
}
public static final byte[] BigInteger2ByteArray(BigInteger paramBigInteger, ByteOrder paramByteOrder)
{
return Long2ByteArray(paramBigInteger.longValue(), paramByteOrder);
}
public static final byte[] Long2ByteArray(long paramLong)
{
return Long2ByteArray(paramLong, ByteOrder.LITTLE_ENDIAN);
}
public static final byte[] Long2ByteArray(long paramLong, ByteOrder paramByteOrder)
{
byte[] arrayOfByte = new byte[8];
ByteBuffer localByteBuffer = ByteBuffer.wrap(arrayOfByte);
localByteBuffer.order(paramByteOrder);
localByteBuffer.putLong(paramLong);
return arrayOfByte;
}
}
答案 0 :(得分:2)
如果paramByteOrder
为LITTLE_ENDIAN
,则下一个函数执行如下:
public static final byte[] Long2ByteArray(long paramLong, ByteOrder paramByteOrder) {
// create new byte array of the same size as a Java long (64 bit signed integer)
byte[] arrayOfByte = new byte[8];
// wrap it using a wrapper class
ByteBuffer localByteBuffer = ByteBuffer.wrap(arrayOfByte);
// put it in LITTLE_ENDIAN order, (only effects the next put and get methods)
localByteBuffer.order(paramByteOrder);
// put in the long, where the least significant bits are in arrayOfByte[0]
// and the most significant (as well as the sign bit) in arrayOfByte[7]
// this is different from the default BIG_ENDIAN encoding used by Java
localByteBuffer.putLong(paramLong);
// return it
return arrayOfByte;
}
请注意,里面的位字节不会反转。
如果调用带有BigInteger
参数的方法,则只使用BigInteger
的最低有效位,因此第64位以上的任何内容都被删除(没有任何明确检查,也就是说,意思是如果最重要的位中有数据,那就丢失了。