mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-28 13:20:41 +00:00
Entropy with more than 4 decks can be calculated
This commit is contained in:
@@ -18467,7 +18467,12 @@ window.Entropy = new (function() {
|
|||||||
}
|
}
|
||||||
// Work out the total number of bits for this many decks
|
// Work out the total number of bits for this many decks
|
||||||
// See http://crypto.stackexchange.com/q/41886
|
// See http://crypto.stackexchange.com/q/41886
|
||||||
var gainedBits = Math.log2(factorial(52 * numberOfDecks));
|
var gainedBits = 0;
|
||||||
|
// Equivalent of Math.log2(factorial(52*numberOfDecks))
|
||||||
|
// which becomes infinity for numberOfDecks > 4
|
||||||
|
for (var i=1; i<=52*numberOfDecks; i++) {
|
||||||
|
gainedBits = gainedBits + Math.log2(i);
|
||||||
|
}
|
||||||
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
||||||
var maxBits = gainedBits - lostBits;
|
var maxBits = gainedBits - lostBits;
|
||||||
// Convert the drawn cards to a binary representation.
|
// Convert the drawn cards to a binary representation.
|
||||||
|
|||||||
+6
-1
@@ -263,7 +263,12 @@ window.Entropy = new (function() {
|
|||||||
}
|
}
|
||||||
// Work out the total number of bits for this many decks
|
// Work out the total number of bits for this many decks
|
||||||
// See http://crypto.stackexchange.com/q/41886
|
// See http://crypto.stackexchange.com/q/41886
|
||||||
var gainedBits = Math.log2(factorial(52 * numberOfDecks));
|
var gainedBits = 0;
|
||||||
|
// Equivalent of Math.log2(factorial(52*numberOfDecks))
|
||||||
|
// which becomes infinity for numberOfDecks > 4
|
||||||
|
for (var i=1; i<=52*numberOfDecks; i++) {
|
||||||
|
gainedBits = gainedBits + Math.log2(i);
|
||||||
|
}
|
||||||
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
||||||
var maxBits = gainedBits - lostBits;
|
var maxBits = gainedBits - lostBits;
|
||||||
// Convert the drawn cards to a binary representation.
|
// Convert the drawn cards to a binary representation.
|
||||||
|
|||||||
@@ -2726,6 +2726,50 @@ page.open(url, function(status) {
|
|||||||
words: 18,
|
words: 18,
|
||||||
strength: "extremely strong",
|
strength: "extremely strong",
|
||||||
},
|
},
|
||||||
|
// Multiple decks of cards increases bits per event
|
||||||
|
{
|
||||||
|
entropy: "3d",
|
||||||
|
events: 1,
|
||||||
|
bits: 4,
|
||||||
|
bitsPerEvent: 4.34,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d",
|
||||||
|
events: 2,
|
||||||
|
bits: 9,
|
||||||
|
bitsPerEvent: 4.80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d3d",
|
||||||
|
events: 3,
|
||||||
|
bits: 15,
|
||||||
|
bitsPerEvent: 5.01,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d3d3d",
|
||||||
|
events: 4,
|
||||||
|
bits: 20,
|
||||||
|
bitsPerEvent: 5.14,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d3d3d3d",
|
||||||
|
events: 5,
|
||||||
|
bits: 26,
|
||||||
|
bitsPerEvent: 5.22,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d3d3d3d3d",
|
||||||
|
events: 6,
|
||||||
|
bits: 31,
|
||||||
|
bitsPerEvent: 5.28,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d",
|
||||||
|
events: 33,
|
||||||
|
bits: 184,
|
||||||
|
bitsPerEvent: 5.59,
|
||||||
|
strength: 'easily cracked - Repeats like "abcabcabc" are only slightly harder to guess than "abc"',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
// use entropy
|
// use entropy
|
||||||
page.evaluate(function() {
|
page.evaluate(function() {
|
||||||
@@ -2737,18 +2781,21 @@ page.open(url, function(status) {
|
|||||||
if ("filtered" in expected && actual.indexOf(expected.filtered) == -1) {
|
if ("filtered" in expected && actual.indexOf(expected.filtered) == -1) {
|
||||||
return "Filtered value not in feedback";
|
return "Filtered value not in feedback";
|
||||||
}
|
}
|
||||||
if (actual.indexOf(expected.type) == -1) {
|
if ("type" in expected && actual.indexOf(expected.type) == -1) {
|
||||||
return "Entropy type not in feedback";
|
return "Entropy type not in feedback";
|
||||||
}
|
}
|
||||||
if (actual.indexOf(expected.events) == -1) {
|
if ("events" in expected && actual.indexOf(expected.events) == -1) {
|
||||||
return "Event count not in feedback";
|
return "Event count not in feedback";
|
||||||
}
|
}
|
||||||
if (actual.indexOf(expected.bits) == -1) {
|
if ("bits" in expected && actual.indexOf(expected.bits) == -1) {
|
||||||
return "Bit count not in feedback";
|
return "Bit count not in feedback";
|
||||||
}
|
}
|
||||||
if (actual.indexOf(expected.strength) == -1) {
|
if ("strength" in expected && actual.indexOf(expected.strength) == -1) {
|
||||||
return "Strength not in feedback";
|
return "Strength not in feedback";
|
||||||
}
|
}
|
||||||
|
if ("bitsPerEvent" in expected && actual.indexOf(expected.bitsPerEvent) == -1) {
|
||||||
|
return "bitsPerEvent not in feedback";
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
test = tests[i];
|
test = tests[i];
|
||||||
@@ -2762,7 +2809,7 @@ page.open(url, function(status) {
|
|||||||
return $(".phrase").val();
|
return $(".phrase").val();
|
||||||
});
|
});
|
||||||
// Check mnemonic length
|
// Check mnemonic length
|
||||||
if (test.words == 0) {
|
if ("words" in test && test.words == 0) {
|
||||||
if (mnemonic.length > 0) {
|
if (mnemonic.length > 0) {
|
||||||
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
|
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
|
||||||
console.log("Entropy: " + test.entropy);
|
console.log("Entropy: " + test.entropy);
|
||||||
@@ -2770,7 +2817,7 @@ page.open(url, function(status) {
|
|||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else if ("words" in test) {
|
||||||
if (mnemonic.split(" ").length != test.words) {
|
if (mnemonic.split(" ").length != test.words) {
|
||||||
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
|
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
|
||||||
console.log("Entropy: " + test.entropy);
|
console.log("Entropy: " + test.entropy);
|
||||||
|
|||||||
Reference in New Issue
Block a user