34 lines
1.1 KiB
JavaScript
34 lines
1.1 KiB
JavaScript
// 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;
|
|
};
|
|
|