Entropy with more than 4 decks can be calculated

This commit is contained in:
Ian Coleman
2016-11-30 19:38:14 +11:00
parent 9495975640
commit fc7c248faf
3 changed files with 65 additions and 8 deletions

View File

@@ -18467,7 +18467,12 @@ window.Entropy = new (function() {
}
// Work out the total number of bits for this many decks
// 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 maxBits = gainedBits - lostBits;
// Convert the drawn cards to a binary representation.

View File

@@ -263,7 +263,12 @@ window.Entropy = new (function() {
}
// Work out the total number of bits for this many decks
// 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 maxBits = gainedBits - lostBits;
// Convert the drawn cards to a binary representation.

View File

@@ -2726,6 +2726,50 @@ page.open(url, function(status) {
words: 18,
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
page.evaluate(function() {
@@ -2737,18 +2781,21 @@ page.open(url, function(status) {
if ("filtered" in expected && actual.indexOf(expected.filtered) == -1) {
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";
}
if (actual.indexOf(expected.events) == -1) {
if ("events" in expected && actual.indexOf(expected.events) == -1) {
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";
}
if (actual.indexOf(expected.strength) == -1) {
if ("strength" in expected && actual.indexOf(expected.strength) == -1) {
return "Strength not in feedback";
}
if ("bitsPerEvent" in expected && actual.indexOf(expected.bitsPerEvent) == -1) {
return "bitsPerEvent not in feedback";
}
return false;
}
test = tests[i];
@@ -2762,7 +2809,7 @@ page.open(url, function(status) {
return $(".phrase").val();
});
// Check mnemonic length
if (test.words == 0) {
if ("words" in test && test.words == 0) {
if (mnemonic.length > 0) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
console.log("Entropy: " + test.entropy);
@@ -2770,7 +2817,7 @@ page.open(url, function(status) {
fail();
}
}
else {
else if ("words" in test) {
if (mnemonic.split(" ").length != test.words) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
console.log("Entropy: " + test.entropy);