分析RC4密钥生成器

时间:2014-08-04 21:59:18

标签: java security cryptography

我只是一个初学的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;
  }
 }

1 个答案:

答案 0 :(得分:2)

如果paramByteOrderLITTLE_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位以上的任何内容都被删除(没有任何明确检查,也就是说,意思是如果最重要的位中有数据,那就丢失了。