Files
js-scripts/components/component-shannonentropy-ex.js
2025-04-04 17:19:07 +08:00

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;
};