// http://blog.dkbza.org/2007/05/scanning-data-for-entropy-anomalies.html // https://github.com/dxa4481/truffleHog/blob/master/truffleHog.py var Math_log2 = Math.log2 || (x) => { return Math.log(x) * Math.LOG2E; }; exports.SHANNON_ENTROPY_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; exports.SHANNON_ENTROPY_HEX = "1234567890abcdefABCDEF"; exports.shannonEntropy = (data, charRange) => { if (!data) { return 0; } var lenOfData = data.length; var charCodeCountMap = {}; for (var i = 0; i < data.length; i++) { var charCode = data.charCodeAt(i); charCodeCountMap[charCode] = charCodeCountMap[charCode] || 0; charCodeCountMap[charCode] += 1; } var entropy = 0; for (var i = 0; i < charRange.length; i++) { var charCode = charRange.charCodeAt(i); var charCodeCount = charCodeCountMap[charCode]; if (charCodeCount != null) { var pCharCode = charCodeCount / lenOfData; entropy += - pCharCode * Math_log2(pCharCode); } } return entropy; };