随机种子生成器
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 的常量。
编辑:抱歉发错了,下次我会更好地检查论坛位置。我选择了一个接受的答案,我认为这认为问题已经结束。感谢有用的回复和提示!
原文: 我今天需要升级到新的 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 的常量。