-8

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

原文:我今天需要升级到新的 Iota 钱包。它没有随机种子生成器,所以我自己构建并从 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("*****");
    }
}
4

2 回答 2

1

当要求审查代码时,您应该在此处发布。但不管怎样,有更有效的方法来生成随机字符。

一种方法是生成 65 到 90 之间的随机字符,即ASCII 表中 AZ 的十进制值。然后,只需将值转换为 achar即可获得与数字对应的实际字母。但是,您说您希望数字 9 也包含在内,因此您可以将其扩展为 91,如果您得到 91(在 ASCII 表中为[,则将数字 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);

而且,正如@OO 所提到的,您可以在此处查看生成安全随机数。

于 2017-08-11T21:54:44.783 回答
0

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

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类中查找 TRYTES_ALPHABET 和 SEED_LENGTH_MAX 的常量。

于 2018-09-16T15:47:23.230 回答