Я столкнулся с проблемой расшифровки 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-----
`;