Асимметричная реализация RSA PRNG не работает должным образом - PullRequest
0 голосов
/ 03 июня 2019

Я разместил вопрос здесь , спрашивающий, возможно ли создать PRNG, в котором асимметричный закрытый ключ может продвигать PRNG, тогда как открытый ключ может только обратить PRNG. DannyNiu предложил подход с использованием ключей RSA, для которого я работаю над проверкой концепции здесь . После продвижения и обращения PRNG с использованием этого метода я ожидал, что начальное и конечное состояния PRNG будут идентичными, но в моей реализации это не так. Что я делаю не так?

// requires BigInteger.min.js: https://github.com/peterolson/BigInteger.js/
// Using 256-bit RSA keys for fast demo only
// Keys generated using script found here: // https://en.wikipedia.org/wiki/RSA_(cryptosystem)

var rsaPrivateKey = bigInt("24776132865927824498491212731968501748100480067637351152890073639930475656193");
var rsaPublicKey = bigInt("74211765065553557319818035137797975277750578756934646327508787135523363995803");
var rsaModulus = 65537;

// Initial state for the PRNG
// Cannot be 0 or 1
var state = bigInt.randBetween(2, rsaModulus-1);
print("0: " + state.toString());

// Advance the PRNG 5x using the private key
for (var i = 1; i < 6; i++) {
  state = state.modPow(rsaPrivateKey, rsaModulus);
  print(i + ": " + state.toString());
}

// Reverse the PRNG 5x using the public key
for (var i = 4; i >= 0; i--) {
  state = state.modPow(rsaPublicKey, rsaModulus);
  print(i + ": " + state.toString());
}

function print(str){
  document.body.insertAdjacentHTML("beforeend", str + "<br>\r\n");
}

1 Ответ

0 голосов
/ 03 июня 2019

Переменные rsaModulus и rsaPublic поменялись местами. Исправленный код ниже, кажется, делает то, что нужно.

// requires BigInteger.min.js: https://github.com/peterolson/BigInteger.js/
// Using 256-bit RSA keys for fast demo only
// Keys generated using script found here: // https://en.wikipedia.org/wiki/RSA_(cryptosystem)
var bigInt = require("big-integer");

var rsaPrivateKey = bigInt("24776132865927824498491212731968501748100480067637351152890073639930475656193");
var rsaModulus = bigInt("74211765065553557319818035137797975277750578756934646327508787135523363995803");
var rsaPublicKey = 65537;

// Initial state for the PRNG
// Cannot be 0 or 1
var state = bigInt.randBetween(2, rsaModulus-1);
print("0: " + state.toString());

// Advance the PRNG 5x using the private key
for (var i = 1; i < 6; i++) {
  state = state.modPow(rsaPrivateKey, rsaModulus);
  print(i + ": " + state.toString());
}

// Reverse the PRNG 5x using the public key
for (var i = 4; i >= 0; i--) {
  state = state.modPow(rsaPublicKey, rsaModulus);
  print(i + ": " + state.toString());
}

function print(str){
    console.log(str);
//  document.body.insertAdjacentHTML("beforeend", str + "<br>\r\n");
}

Выводит вывод (в Node.js я не тестировал в браузере):

0: 3089889900716331070935914834855269746958619454008171918802934456826278805869
1: 29294271228731490548225349341396330182559853938616577145390725955076346471738
2: 26514699849481326763107659510545065888424675390354763649355047607623510843283
3: 43142677973722044074820378370391067407717125958268872808246349065241317072133
4: 36861272951268123086050613298534678401193075212756094490295892940224420130435
5: 6529151801265964225108415545430092089926156264721909235696182044061658877417
4: 36861272951268123086050613298534678401193075212756094490295892940224420130435
3: 43142677973722044074820378370391067407717125958268872808246349065241317072133
2: 26514699849481326763107659510545065888424675390354763649355047607623510843283
1: 29294271228731490548225349341396330182559853938616577145390725955076346471738
0: 3089889900716331070935914834855269746958619454008171918802934456826278805869
...