RSA数字签名系统无法使用更大的素数

时间:2019-06-15 16:51:23

标签: rsa public-key signature

我实现了RSA密码系统,以创建一个简单的数字签名系统。它适用于freeCodeCamp即将推出的密码学课程。

当我使用一些较大的质数,例如p = 11,q = 17时,下面的程序记录“失败”。我正在对消息进行哈希处理,结果小于N。我不知道为什么会这样。请指引我正确的方向。

这是为了教导数百万的人。如果您对当前的实施有任何改进的建议,请随时发表评论:)

Git回购:https://github.com/vkweb/digital-signature-system

谢谢!快乐编码<3

const firstPrime =11;
const secondPrime = 19;
const N = firstPrime * secondPrime;
const phiOfN = (firstPrime - 1) * (secondPrime - 1);
let publicKey = 0;

function hashTheMessage(message) {
  let hashValue = 0;
  for (let i = 0, msgLength = message.length; i < msgLength; ++i) {
    hashValue += message.charCodeAt(i);
  }
  return hashValue % N === 0 ? 1 : hashValue % N;
}

function isCoPrime(smallerNum, largerNum) {
  for (let i = 2; i <= smallerNum; ++i) {
    if (smallerNum % i === 0 && largerNum % i === 0) {
      return false;
    }
  }
  return true;
}

function generatePrivateKey() {
  for (let i = 2; i < phiOfN; ++i) {
    if (isCoPrime(i, N) && isCoPrime(i, phiOfN)) {
      return i;
    }
  }

  console.log("\nPrivate key can't be generated.");
  return 0;
}

function generatePublicKey(privateKey) {
  if (!privateKey) {
    console.log("\nPublic key can't be generated.");
  } else {
    publicKey = 1;
    while (privateKey) {
      if ((publicKey * privateKey) % phiOfN === 1 && privateKey !== publicKey) {
        return;
      }
      publicKey += 1;
    }
  }
}

function generateSignature(hashValue, privateKey) {
  return Math.pow(hashValue, privateKey) % N;
}

function decryptSignature(digitalSignature) {
  return Math.pow(digitalSignature, publicKey) % N;
}

let hashValue = hashTheMessage("Hello world!");
let privateKey = generatePrivateKey();
generatePublicKey(privateKey);
let signature = generateSignature(hashValue, privateKey);
let decryptedSignature = decryptSignature(signature);

if(decryptedSignature === hashValue)
{
  console.log("Success!");
}
else
{
  console.log("Failure!");
}
```

0 个答案:

没有答案