Генерация пар ключей и одноразовых номеров из API веб-криптографии вместо списка слов. Энтропия одинакова?Javascript

Форум по Javascript
Ответить
Anonymous
 Генерация пар ключей и одноразовых номеров из API веб-криптографии вместо списка слов. Энтропия одинакова?

Сообщение Anonymous »

Я хочу выяснить, достигают ли два метода, показанные ниже, одинакового уровня энтропии.
Для этого первого безопасного метода 32-байтовый / 256-битный ключ и 12-байтовый / 96-битный одноразовый номер генерируются с использованием JavaScript Web Crypto API, который гарантированно генерирует криптостойкие случайные значения.
Поэтому мы можем подтвердить, что ключ и одноразовый номер содержат максимальную энтропию для их соответствующие размеры.

Код: Выделить всё

function generateSecureKeyNoncePair() {

const keyBytes = new Uint8Array(32); // Buffer for random values
crypto.getRandomValues(keyBytes);

const nonceBytes = new Uint8Array(12); // Buffer for random values
crypto.getRandomValues(nonceBytes);

return {
keyBytes,
nonceBytes
};

}

const { keyBytes, nonceBytes } = generateSecureKeyNoncePair();

console.log(keyBytes);
console.log(nonceBytes);


Далее, вдохновленные https://developer.blockchaincommons.com/bytewords/, у нас есть еще одна функция, которая выбирает 11 четырехбуквенных слов из списка слов и разрезает первые 8 слов для ключа и оставшиеся 3 слова для nonce.
Причина список слов из 256 четырехбуквенных слов заключается в том, что эти слова можно преобразовать в Uint8Array, а затем Uint8Array можно преобразовать в Uint32Array, который можно использовать в состоянии ChaCha20.

Код: Выделить всё

// wordList (256 four-letter words)
const wordList = [
"able", "acid", "also", "apex", "aqua", "arch", "atom", "aunt", "away", "axis",
"back", "bald", "barn", "belt", "beta", "bias", "blue", "body", "brag", "brew",
"bulb", "buzz", "calm", "cash", "cats", "chef", "city", "claw", "code", "cola",
"cook", "cost", "crux", "curl", "cusp", "cyan", "dark", "data", "days", "deli",
"dice", "diet", "door", "down", "draw", "drop", "drum", "dull", "duty", "each",
"easy", "echo", "edge", "epic", "even", "exam", "exit", "eyes", "fact", "fair",
"fern", "figs", "film", "fish", "fizz", "flap", "flew", "flux", "foxy", "free",
"frog", "fuel", "fund", "gala", "game", "gear", "gems", "gift", "girl", "glow",
"good", "gray", "grim", "guru", "gush", "gyro", "half", "hang", "hard", "hawk",
"heat", "help", "high", "hill", "holy", "hope", "horn", "huts", "iced", "idea",
"idle", "inch", "inky", "into", "iris", "iron", "item", "jade", "jazz", "join",
"jolt", "jowl", "judo", "jugs", "jump", "junk", "jury", "keep", "keno", "kept",
"keys", "kick", "kiln", "king", "kite", "kiwi", "knob", "lamb", "lava", "lazy",
"leaf", "legs", "liar", "limp", "lion", "list", "logo", "loud", "love", "luau",
"luck", "lung", "main", "many", "math", "maze", "memo", "menu", "meow", "mild",
"mint", "miss", "monk", "nail", "navy", "need", "news", "next", "noon", "note",
"numb", "obey", "oboe", "omit", "onyx", "open", "oval", "owls", "paid", "part",
"peck", "play", "plus", "poem", "pool", "pose", "puff", "puma", "purr", "quad",
"quiz", "race", "ramp", "real", "redo", "rich", "road", "rock", "roof", "ruby",
"ruin", "runs", "rust", "safe", "saga", "scar", "sets", "silk", "skew", "slot",
"soap", "solo", "song", "stub", "surf", "swan", "taco", "task", "taxi", "tent",
"tied", "time", "tiny", "toil", "tomb", "toys", "trip", "tuna", "twin", "ugly",
"undo", "unit", "urge", "user", "vast", "very", "veto", "vial", "vibe", "view",
"visa", "void", "vows", "wall", "wand", "warm", "wasp", "wave", "waxy", "webs",
"what", "when", "whiz", "wolf", "work", "yank", "yawn", "yell", "yoga", "yurt",
"zaps", "zero", "zest", "zinc", "zone", "zoom"
];

// Encode String Array to Uint8Array
const enc = new TextEncoder();
const stringArray2bytes = (words) => enc.encode(words.join(""));

function generateAsciiKeyNoncePair() {
const selected = new Set();
const randomBytes = new Uint8Array(22); // Buffer for random values

crypto.getRandomValues(randomBytes);
let byteIndex = 0;

while (selected.size < 11) {
if (byteIndex >= randomBytes.length) {
crypto.getRandomValues(randomBytes);
byteIndex = 0;
}
selected.add(randomBytes[byteIndex++]);
}

const indices = Array.from(selected);

return {
keyAscii: indices.slice(0, 8).map(i => wordList[i]),
nonceAscii: indices.slice(8, 11).map(i =>  wordList[i])
};
}

const { keyAscii, nonceAscii } = generateAsciiKeyNoncePair();

console.log("Ascii Key:", keyAscii);
console.log("Ascii Nonce:", nonceAscii);

console.log("Ascii Key:", stringArray2bytes(keyAscii));
console.log("Ascii Nonce:", stringArray2bytes(nonceAscii));


Мой вопрос: независимо от того, насколько удобна для пользователя эта функция, я наивен, предполагая, что она достигает того же уровня энтропии, что и первая функция? Я спрашиваю, потому что не могу не думать, что список слов содержит слова, являющиеся частью английского алфавита, состоящего всего из 26 букв, в отличие от Uint8Array, заполняемого функцией crypto.getRandomValues() длиной 256 байт.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -entropy-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»