随机种子生成器

Random seed generator

编辑:抱歉发错了,下次我会更好地检查论坛位置。我选择了一个接受的答案,我认为这认为问题已经结束。感谢有用的回复和提示!

原文: 我今天需要升级到新的 Iota 钱包。它没有 运行dom 种子生成器,因此我构建了自己的并 运行 它来自 NetBeans。你能给我你的意见吗?它的长度必须为 81 个字符,并且包含 A 到 Z 和数字 9。没有其他内容。这是完整的代码。

这会留下任何不安全的东西吗?从约定的角度来看,代码是否可以更简洁?

    class SeedGenerator    {
    /*
    This is a program to randomize a seed for Iota wallet
    */

    public static void main(String[] args)  {
        System.out.println("*****");
        int seedLength = 81;
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ9"; //Only characters allowed in Iota seed are A-Z and number 9
        char[] charArray = alphabet.toCharArray();  //Turn string into array of characters to be referenced by index
        String[] seed = new String[seedLength];
        System.out.print("Random wallet seed is: ");

        for (int i = 0; i < seedLength; i++)    {
            Random newRandomNumber = new Random();
            int seedIndex = newRandomNumber.nextInt(alphabet.length()); //This is an array of index numbers to pull from charArray
//            System.out.print(seedIndex + " "); //Used for testing the random character index range
            seed[i] += charArray[seedIndex];
            System.out.print(charArray[seedIndex] + "");

        }

        System.out.println();
        System.out.println("*****");
    }
}

当要求审查代码时,您应该 post 它 here。但无论如何,还有更有效的方法来生成随机字符。

其中一种方法是生成 65 到 90 之间的随机字符,即 ASCII table 上 A-Z 的十进制值。然后,只需将值转换为 char 即可获得与数字对应的实际字母。但是,你说你希望数字 9 也包括在内,所以你可以将其扩展为 91,如果你得到 91,在 ASCII table 上是 [,将数字 9 添加到你的字符串而不是那个。

这段代码很容易完成:

String mySeed = "";
      for(int i=0; i<81; i++)
      {
         int randomNum = (int)(Math.random()*27) + 65;
         if(randomNum==91)
            mySeed+="9";
         else
            mySeed+=(char)randomNum;
      }
      System.out.println(mySeed);

并且,如@O.O所述。你可以看看生成一个安全的随机数 here.

我建议使用名为 Jota 的官方 IOTA Java 库。

Class SeedRandomGenerator 有一个 generateNewSeed 实现:

public static String generateNewSeed() {
    char[] chars = Constants.TRYTE_ALPHABET.toCharArray();
    StringBuilder builder = new StringBuilder();
    SecureRandom random = new SecureRandom();
    for (int i = 0; i < Constants.SEED_LENGTH_MAX; i++) {
        char c = chars[random.nextInt(chars.length)];
        builder.append(c);
    }
    return builder.toString();
}

Constants class 中找到 TRYTES_ALPHABET 和 SEED_LENGTH_MAX 的常量。