Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个模糊的Java函数块是做什么的?_Java_Security_Function_Encryption - Fatal编程技术网

这个模糊的Java函数块是做什么的?

这个模糊的Java函数块是做什么的?,java,security,function,encryption,Java,Security,Function,Encryption,首先,这不是一个家庭作业或任何其他任务,是由另一个人。这是一个游戏小程序的功能,我希望它更安全。使用此功能,您可以为游戏的握手部分生成密码。但是对每个玩家使用相同的编码密码,这只是一件愚蠢的事情。你会很容易受到攻击,这就是我所处的情况。这就是为什么我想分析这个函数的作用,并提出一种为每个唯一连接生成密码的方法。所以,请试着理解我 以下是函数: public String g(String paramString) { boolean bool = d.r; try {

首先,这不是一个家庭作业或任何其他任务,是由另一个人。这是一个游戏小程序的功能,我希望它更安全。使用此功能,您可以为游戏的握手部分生成密码。但是对每个玩家使用相同的编码密码,这只是一件愚蠢的事情。你会很容易受到攻击,这就是我所处的情况。这就是为什么我想分析这个函数的作用,并提出一种为每个唯一连接生成密码的方法。所以,请试着理解我

以下是函数:

public String g(String paramString)
  {
    boolean bool = d.r;
    try
    {
      if (!bool)
      {
        if (paramString.length() < 3)
        {
          a(tc[2]);
          return "";
        }
        if (bool);
      }
      else
      {
        if (paramString.length() > 200)
        {
          a(tc[3]);
          return "";
        }
        paramString = paramString.toLowerCase();
      }
      String str1 = "";
      String str2 = paramString;
      paramString = paramString.toLowerCase();
      char[] arrayOfChar1 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ' };
      char[] arrayOfChar2 = { 'x', 'f', 'n', 'g', 'd', '9', 's', 'j', 'o', 'q', '5', 'a', 'z', 'w', '6', '0', 'e', '4', 'c', 'r', '1', 'v', 't', '3', 'b', 'y', 'h', '2', 'u', '7', 'm', 'i', 'k', '8', 'l', 'p', '?' };
      char[] arrayOfChar3 = { 'f', 'e', '8', 'r', 'k', 't', '7', 'b', 'c', 'm', 'o', 'q', '2', '3', 'g', 's', 'n', 'x', '0', 'p' };
      char[] arrayOfChar4 = paramString.toCharArray();
      char[] arrayOfChar5 = str2.toCharArray();
      int i1 = 0;
      if (bool);
      do
      {
        int i2 = 0;
        int i3 = 0;
        if (bool);
        do
          do
          {
            if (!bool)
            {
              if (arrayOfChar4[i1] == arrayOfChar1[i3])
                i2 = 1;
            }
            else
            {
              int i4 = paramString.length();
              int i5 = (int)Math.round(Math.random() * 19.0D);
              int i6 = i3 + i5 + i4;
              if (bool);
              String str3;
              do
              {
                do
                  i6 -= arrayOfChar2.length;
                while (i6 >= arrayOfChar2.length);
                str1 = str1 + "" + arrayOfChar3[i5];
                str3 = String.valueOf(arrayOfChar2[i6]);
              }
              while (bool);
              if (arrayOfChar4[i1] != arrayOfChar5[i1])
                str3 = str3.toUpperCase();
              str1 = str1 + "" + str3;
            }
            i3++;
          }
          while (i3 < arrayOfChar1.length);
        while (bool);
        if (i2 == 0)
          str1 = str1 + "\\" + arrayOfChar4[i1];
        i1++;
      }
      while (i1 < arrayOfChar4.length);
      return str1;
    }
    catch (Exception localException)
    {
    }
    return "";
  } 
但以下是最可疑的例子:

1111111->00000000000000
222222 -> 000000000000  
33333 -> 0000000000  
55555->M5
666666->M5
77777->M5
8888->M5
999->M5

我现在有点绝望,这就是为什么我要碰运气。谢谢你的每一句话。

有人怀疑反编译器是否成功地生成了与字节码行为相匹配的代码。例如,代码表示
if(bool)在几个地方,很难理解字节码为什么会这样做。如果我们不能信任反编译的代码,那么我们从代码中得出的任何结论都会有一些疑问


另一点是你在这里的假设:

使用此功能,您可以为游戏的握手部分生成密码。但是对每个玩家使用相同的编码密码,这只是一件愚蠢的事情

从您提供的输出可以清楚地看出,此代码不会为给定的输入生成相同的输出。如果它真的这样做了,那将是相当令人惊讶的,因为它似乎在反复调用
Random
,作为置乱算法的一部分


简而言之,您正在尝试修复一个不存在的问题。。。或者至少不是您描述的形式。

要为每个唯一连接生成唯一密码,您可以使用以下方法:

SHA256(secret + connectionNumber + dateAndTime)
secret
是一个固定的秘密密码,您可以根据需要随时更改

connectionNumber
是当天迄今为止进行的连接计数

dateAndTime
是标准格式的当前数据和时间

将所有三个转换为字符串,连接并应用SHA-256。这将为您提供一个字节数组。如果需要文本而不是字节,则使用Base64进行转换

例如:

String password = Base64(SHA256("myBIGsecret52012-07-23T13:06:25.254Z"));

我不明白,你只是想为每个用户生成一个不同的密码,为什么要理解这个方法?您的问题不是与密码生成或安全检查有关吗?是的。但是小程序只有每个人都可以选择。我将尝试通过php使用设置文件,并为每个用户输入不同的密码。但要使用它,我必须理解这个编码算法背后的主要思想。否则,攻击者可能会看到纯文本并对其进行操作。没有足够的代码来知道此方法在做什么:d.r是什么?a()方法?tc[]阵列?如果没有这些,就不可能理解。好吧,这意味着如果攻击者理解这些代码,他们就可以攻击游戏?我认为a是一种通过tc数组打印消息的方法。我不确定d.r.tho.你建议哪种反编译器?这是jd gui生成的。我建议您直接读取字节码。反编译器经常被模糊的代码弄糊涂。这并不奇怪,因为这是一个好的模糊处理程序的目标之一。你每次生成随机结果都是对的,但是密码我的意思是,我们用于获取编码结果的普通密码在每次循环中都是相同的。我的意思是,每隔一次更改一次结果并不重要,因为您可以通过嗅探器查看结果,一旦看到,您唯一的选择就是再次更改密码。但是,如果我知道这个函数是如何工作的,我可以想出一种方法,生成随机的纯文本并每次对其进行编码。@jamall55-这对我来说没有意义。生成随机纯文本有什么帮助?还有什么能阻止你这么做呢。。。然后把它们输入这个算法?我看不出理解该算法对您有多大帮助。生成一个唯一的密码,该密码会随着其他连接的变化而变化。。这就是我的想法。但现在,我只能为每个连接使用一个密码。您应该将编码的过程放入设置文件中。在进行一次连接后,您可以使用密码进行其他客户端的未来连接。但我试图实现的是为每个连接生成唯一的passwd。退出后,passwd应该消失,永远不要使用。但为了安全起见,我需要生成强制性的编码密码。在将密码放入文件之前,必须对其进行编码。
String password = Base64(SHA256("myBIGsecret52012-07-23T13:06:25.254Z"));