gpt4 book ai didi

java - 使用音频信号创建随 secret 钥

转载 作者:行者123 更新时间:2023-12-03 02:28:22 26 4
gpt4 key购买 nike

我们知道,我们在代码中生成的“随机”数实际上是伪随机数。在Java的情况下,它们默认使用时间戳作为随机种子,并且从该点开始确定性地创建时间戳之后产生的每个随机数。

如果您使用随机数生成密码,并且恶意方知道您生成该密码的日期,那么它们只需在当天的每一毫秒内进行迭代。那将是1000 * 60 * 60 * 24 = 8640万。对于一个成熟的政党来说,这并不是很多猜测。爱德华·斯诺登(Edward Snowden)曾著名警告过:“假设您的对手每秒能够猜测一万亿次”。

问题是,我们如何产生真正的随机数?我想要从笔记本电脑的麦克风中采样16位音频,并使用两个采样中最低有效的8位来形成种子。这里的想法是,音频信号的最低有效部分就是噪声所在的位置。例如,以下是在相对位置记录的16位样本的几个两个字节的值:

0,19
0,38
0,-49
1,93
1,-29
1,-80

您可以看到最高有效字节为0或1,这意味着正在记录的波形几乎没有注册。另一方面,最低有效字节值在各处跳跃。那是随机种子的沃土!

这篇文章的具体问题是:我们如何利用周围的现实噪声产生的噪声信号生成32个字符的随 secret 码。

最佳答案

这是一个不错的下午项目!这是带有静态方法的实用程序类,该方法可以生成随机整数数组或所需长度的随机字符串。

Gist link.

import javax.sound.sampled.*;

public class RandomFromAudio {

public static final String ALLOWED_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Demonstrating the methods
public static void main(String[] args) {
System.out.println(getRandomKey(32));
}

public static String getRandomKey(int keyLength) {
int [] randomInts = getRandomIntArray(keyLength);
StringBuilder stringBuilder = new StringBuilder();
for (int randomInt: randomInts) {
char randomChar = ALLOWED_CHARACTERS.charAt(randomInt % ALLOWED_CHARACTERS.length());
stringBuilder.append(randomChar);
}
return stringBuilder.toString();
}

public static int [] getRandomIntArray(int desiredLength) {
int [] out = null;
AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);
TargetDataLine microphone;
try {
out = new int[desiredLength];
byte[] data = new byte[2];

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
microphone = (TargetDataLine) AudioSystem.getLine(info);
microphone.open(format);
microphone.start();

// my microphone seems to need to "warm up".
// It gets a lot of low signal at the beginning producing a lot of low numbers.
// This loop reads signal until it shows that a decently high value can be reached.
while (data[1] < 100) {
microphone.read(data, 0, data.length);
}
byte [] leastSig = new byte[2];
for (int i = 0; i < desiredLength * 2; i++) {
microphone.read(data, 0, data.length);
// saving the least significant byte
leastSig[i % 2] = data[1];
if (i % 2 == 1) {
// combining the bytes into an int
out[(i + 1) / 2 - 1] = leastSig[0]<<8 &0xFF00 | leastSig[1]&0xFF;
}
}
microphone.close();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
return out;
}
}

运行几次(对我来说)产生了:
hqctXiTiV67iI2JAXrcU0vzGhxEBDN2R
ViCSGxahmI51mXfBIV7INo9vu3ZuKNDi
9oTl1Meer59Y69yxNRTa0Dv3pWNywZFY
zfLrh9ZU8oNLg43M1D1ZzcoSxJ4X1HOQ
dlhliKxM4tAhr8uoCOtdRsmwARIE6Gjb

关于java - 使用音频信号创建随 secret 钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com