使用加密庫我可以要求庫給我一些隨機字節。問題是這個字節是從0到255每個(包含)的數字,因此創建一個均勻分佈的結果並不那麼簡單。使用node.js生成10的冪模數的cryptographc隨機數
我的意思是以下內容:
的函數接收數N,其中是10,100,... 10^b,其中b是1和8之間(一個數量可以大,但我不需要任何更大的數字)並返回一個介於0和給定數字(不包括給定數字)之間的數字,所以假設N是100,函數的結果是從0到99,如果N是10結果是從0到9.
您可以使用Math.random創建一個隨機數,然後乘以N然後使用floor。但是,Math.random不是加密安全的,所以必須使用隨機生成的2^8m數字來完成,其中m只是給予crypto.randomBytes的任意數量的字節。
我創建了一個簡單的函數,顯然是工作。但是,我知道,在隨機數字中引入一些偏倚是相當容易的,我只希望對它進行驗證,因爲這對項目來說有些重要。
genera_aleatorio_residuo_potencia10 : function (n, cb) {
var digitos = Math.log(n)/Math.LN10;
var extra_base2 = digitos > 8 ? digitos - 8 : 0;
if (Math.floor(digitos + .4) - digitos > 0.00000001) {
return cb("Numero no es potencia de 10 (10, 100, 1000...)", null);
}
digitos = Math.round(digitos);
async.parallel({
r1 : crypto_helper.generador_random_bytes(1),
r2 : crypto_helper.generador_random_bytes(1)
}, function (err, res) {
if (err) {
return cb(err, null);
}
var r1 = res.r1[0] + 1;
var r2 = res.r2[0] + 1;
var aleatorio = (Math.pow(5, digitos) - 1) * Math.pow(2, extra_base2) * r1 + r2;
cb(null, aleatorio % n);
});
}
不消說:crypto_helper.generador_random_bytes是node.js的crypto.randomBytes,我經常使用,使之與異步庫友好的包裝。
我對使用Math.pow(5,digitos)和Math.pow(2,extra_base2)的推理是N和256之間的最小公倍數。在實踐中,n永遠不會大於100000000,所以我們的產品不應該使用Math.pow(2,extra_base2),但我仍然希望確保它對其他人有意義。
這裏您的最終目標是什麼?我喜歡加密問題,如果我能理解你想要做什麼,我會完全沉浸在這個問題中。 – naomik
我會在幾分鐘內描述它,此刻我很匆忙。感謝您的關注。我發現使用的公式中存在一個錯誤,所以我需要更新它。 – Mamsaac