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
+6 -1
View File
@@ -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
View File
@@ -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.
+53 -6
View File
@@ -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);