RSA успешно расшифровывает с неверным закрытым ключом - PullRequest
3 голосов
/ 18 марта 2019

Я столкнулся с проблемой расшифровки RSA.
Прежде всего, я создал пару открытых и закрытых ключей в openssl (LibreSSL 2.6.4 в OS X 10.14):

genrsa -out rsa_private_key.pem   1024
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

Затем я написал функции для шифрования и дешифрования. Код выглядит так:


//rsa.js
const crypto = require('crypto');
exports.encrypt = (data, key) => {
  try {
    let enc = crypto.publicEncrypt(key, Buffer.from(data));
    return enc;
  } catch (error) {
    console.log('encrypt error:', error);
    return null;
  }
};

exports.decrypt = (encrypted, key) => {
  try {
    let dec = crypto.privateDecrypt({'key':key, 'padding': crypto.constants.RSA_PKCS1_OAEP_PADDING }, encrypted);
    return dec;
  } catch (error) {
    console.log('decrypt error:', error);
    return null;
  } 
};

И я запускаю приложение nodejs, которое шифрует строку с открытым ключом и расшифровывает с помощью закрытый ключ:


//test.js
const rsa = require('./rsa');
const rsaKeys = require('./rsaKeys');

const plainText = '111111';
const crypted = rsa.encrypt(plainText, rsaKeys.pubKey); 
const decrypted = rsa.decrypt(crypted, rsaKeys.privKey); 
console.log('crypted:', crypted.toString('base64'));
console.log('decrypted:',decrypted.toString()); 

Работает хорошо, так как расшифровывается именно текст 111111. Затем я ошибочно меняю последние 3 бита закрытого ключа, например:


exports.privKey = `-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxccc
-----END RSA PRIVATE KEY-----
`;

Я продолжаю запускать test.js, и меня удивляет , что он показывает decrypted: 111111.
Позже я несколько раз менял последние 3 бита и все могу показать расшифрованный правильно. Когда я изменил первые 3 бита закрытого ключа, расшифровка выполняется с исключениями.
Я не могу понять, почему такой результат, и я мало знаю о шифре.
Пожалуйста, укажите руководство, как это понять.

Обновление: добавьте пару ключей.


exports.privKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCWVJtkMDXP1cM6wgOW4aMlHpCg+z0o+mSUTOQwCHJ4Em0x76jm
HsNcFV9svl2KsVZmAvb3CWkNGy/+ST4cKHALMRNZ5hKNcemRH7BSHgBPTNY896Zs
0FIHClsi9J0sWC5dNdVQ02JmU2WPz9XPlVhzaELmlnJ22ecJgpDUwiZFMwIDAQAB
AoGAffe/jiBntxQkV6QjZdcE4iHOh1Z/VUsb5LjZrPYnFT47idCM8udsREkUgQaz
U3huMWTilPaptHXHrYiqJuYrm6xZsSxavsgAgoWSDTwu38PdKQ+HTrGHk6/anhXD
R/qSiS32t5EeAqvgLsxlzyyUYiaExFl/Na9seh3Acm7KMCECQQDIJmyMyBfnlFKt
cD5NTUsg2pTSgaPOmcrx8B+UMudIVzNtFRKyci/t59aPrGJml8ILBzA2QxyJ+tMg
eZdRUNjdAkEAwEdbOVl5Rol66F/NCm3ID5RxeEmVVTo7zLhxmGLSVseATWddlhtJ
iavEtzMDS7aJTDH775RwrQi3S7izWN6tTwJBAL2h0iUMi8GJAVB8UTsSaYUGNAzC
cX4UrnjNxk22cPVUUVAfsChMEec5Skuzy0Nis6GZPO+cZFTCxfg1281aaS0CQHYu
5dlYL3y1oAAYclUIqUE6Qoxm3gzmoD7y14+MnjCMq0XoVNOgrhCarWzVRB9TcQyO
ZIYbvS39/3vhaQskw20CQQCPFDSlrBvUMPJY86SG9fU38nxvKG/6HYYjjmnXeG5M
0rr9oPFSkL4pf2pXpZLtm5iNQoErWntsk9N7rYflH7xj
-----END RSA PRIVATE KEY-----
`;
exports.pubKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWVJtkMDXP1cM6wgOW4aMlHpCg
+z0o+mSUTOQwCHJ4Em0x76jmHsNcFV9svl2KsVZmAvb3CWkNGy/+ST4cKHALMRNZ
5hKNcemRH7BSHgBPTNY896Zs0FIHClsi9J0sWC5dNdVQ02JmU2WPz9XPlVhzaELm
lnJ22ecJgpDUwiZFMwIDAQAB
-----END PUBLIC KEY-----
`;
...