RSA успешно расшифровывается с помощью неправильного закрытого ключа

#node.js #encryption #rsa

#node.js #шифрование #rsa

Вопрос:

Я столкнулся с проблемой расшифровки 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 бита закрытого ключа, расшифровка выполняется с исключениями.
Я не могу понять, почему получается такой результат, потому что я мало знаю о cypher.
Пожалуйста, укажите руководство о том, как это понять.

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

 
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-----
`;
  

Комментарии:

1. не могли бы вы, пожалуйста, предоставить свой полный закрытый ключ?

2. Формат закрытого ключа, который вы, похоже, используете, содержит много избыточной информации (компоненты CRT). Возможно, биты, которые вы изменяете, просто полностью игнорируются библиотекой rsa узла.

3. Коэффициент @JamesKPolk для CRT не всегда является последним полем в ключе, насколько я помню. Я помню, что видел какой-то дополнительный вид метаданных в качестве последнего. Может быть, вы что-то знаете об этом?

4. @VladyslavUsenko: смотрите Другую простую информацию в под номером 1 RSAPrivateKey . Но обратите внимание, что openssl выводит только RSAPrivateKeys версии 0, который всегда заканчивается коэффициентом CRT.

5. @JamesKPolk ‘Формат закрытого ключа, который вы, похоже, используете, содержит много избыточной информации’ — я тоже так думаю. Я увижу ссылку, которую вы разместили. Но есть ли ошибка в команде создания ключей?