Я внедрил криптосистему RSA для создания простой системы цифровой подписи.Он предназначен для будущей учебной программы по криптографии freeCodeCamp.
В приведенной ниже программе записывается «Сбой», когда я использую несколько больших простых чисел, таких как p = 11, q = 17. Я хэширую свое сообщение, и результат меньше N.Я не знаю, почему это происходит.Пожалуйста, ведите меня в правильном направлении.
Это для обучения миллионов людей там.Если у вас есть предложения по улучшению текущей реализации, пожалуйста, не стесняйтесь комментировать :)
Git Repo: https://github.com/vkweb/digital-signature-system
Спасибо!Счастливое кодирование <3 </p>
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!");
}
<span class="math-container">```</span>