Ошибка шифрования Hill Cipher с помощью Javascript

Я пытаюсь внедрить шифрование с помощью Hill Cipher, код правильно шифрует буквы AC из ACT, но буква T преобразуется в U, что неверно. Могу ли я узнать, что не так в этом коде?

Я следую примеру, указанному здесь

Ожидаемый результат: ACT--›POH
Текущий результат: ACT--›POU

//Generates ASCII values of characters
const generateAscii=(string)=>{
    string=string.split('').map((value)=>{
        return value.charCodeAt();
    });
    return string;
};
//Generates characters from ASCII value
const generateChars=(ascii)=>{
    ascii=ascii.map(value=>String.fromCharCode(value));
    console.log(ascii);//Final Output generated here
};
//Encryption
const encrypt=(input,key)=>{
    let matrix=[];
    let cipherAscii=[];
    //Matrix creation
    for(let i in input){
        let values=key.splice(0,input.length);
        matrix.push(values);
    }
    //Matrix multiplication and encryption
    for (let i of matrix){
        let sum=0;
        for(let j in i){
            sum+=i[j]*input[j];
        }
        cipherAscii.push(((sum-65)%26)+65);
    }
    return cipherAscii;
};
    let input='ACT';
    let key='GYBNQKURP';
    let encryptedValues;
    input=generateAscii(input)
    key=generateAscii(key);
    encryptedValues=encrypt(input,key);
    let encryptedText=generateChars(encryptedValues);


person Shardul Birje    schedule 21.07.2020    source источник


Ответы (1)


Ниже приведены изменения, которые я изменил, чтобы исправить проблему:

const generateAscii=(string)=>{
string=string.split('').map((value)=>{
    return value.charCodeAt()-65;
});
return string;
};

А также,

for (let i of matrix){
        let sum=0;
        for(let j in i){
            sum+=i[j]*input[j];
    }
    cipherAscii.push(((sum)%26)+65);
}

Теперь, что было проблемой в вашем коде:

Вы изменили char на ASCII вместо целого числа. Таким образом, при умножении матриц это число умножается на X, что означает, что 65 также увеличивается таким же образом. Этот подход довольно сложен в обслуживании. Но будет проще, если мы сначала уменьшим значение на 65, а затем вычислим и увеличим результат на 65.

Возможно, вы поняли, в чем была проблема.

person sminmgr    schedule 22.07.2020
comment
Решает мою проблему с хорошим объяснением. Спасибо за руководство! - person Shardul Birje; 22.07.2020