Thuộc nhóm thuật toán mã hoá bất đối xứng, sự ra đời của RSA là một phát minh vĩ đại, thay đổi cách thức mã hoá truyền thống thông qua một khoá bí mật duy nhất. Giúp thông tin được bảo mật một cách gần như tuyệt đối cho dù khoá được trao đổi công khai. Chính nó đặt nền móng cho sự phát triển vượt bậc của công nghệ thông tin ngày nay, gần đây nhất là sự ra đời và phát triển của chữ ký số và blockchain. Trong bài này chúng ta sẽ cùng nhau tìm hiểu cách sử dụng thuật toán RSA với NodeJS nhé.

Cách thức mã hoá

các bước mã hoá RSA
các bước mã hoá RSA

Cách thức mã hoá và giải mã sẽ phức tạp một chút:

  1. A sẽ gửi khoá công khai cho B qua bất kỳ phương tiện nào, nghĩa là cho dù ai thấy khoá công khai cũng chẳng sao.
  2. B khi nhận được khoá công khai sẽ mã hoá văn bản bằng khoá này.
  3. B gửi lại văn bản đã được mã hoá cho A qua bất kỳ phương tiện nào, dù ai có thấy cũng không thể nào giải mã được.
  4. A khi nhận được văn bản đã được đã mã sẽ dùng khoá bí mật để giải mã văn bản.
    Sự ra đời của RSA thể hiện sự kỳ diệu của toán học thông qua việc kết hợp số nguyên tố và phép chia lấy dư, bạn có thể tìm hiểu thêm về RSA tại đây. Trên thực tế thì bạn có thể hoàn toàn tự mình cài đặt được thuật toán RSA với các số nguyên tố nhỏ. Tuy nhiên để cài đặt được RSA phức tạp bạn sẽ cần một thuật toán để có random ra các số nguyên tố lớn.

Mã nguồn sử dụng RSA

Từ sơ đồ cách thức mã hoá, chúng ta có thể tạo ra rsa.js với mã nguồn sử dụng RSA như sau:

const crypto = require('crypto');

const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
  }
});

console.log('Public Key:', publicKey);
console.log('Private Key:', privateKey);

const message = 'This is a secret message!';
const encryptedMessage = crypto.publicEncrypt(publicKey, Buffer.from(message));
console.log('Encrypted Message:', encryptedMessage.toString('base64'));

const decryptedMessage = crypto.privateDecrypt(privateKey, encryptedMessage);
console.log('Decrypted Message:', decryptedMessage.toString());

Ở đây chúng ta có:

  1. modulusLength: 2048: là kích thước của khoá RSA 2048 bit, n = p x q, là thành phần xuất hiện trong cả khoá bí mật và công khai.
  2. type: ‘spki’: SPKI (Subject Public Key Info) là một dạng chuẩn để lưu trữ và trao đổi thông tin khóa công khai. SPKI chứa thông tin về thuật toán mã hóa và chính khóa công khai, và nó được sử dụng trong các chứng chỉ số, như X.509.
  3. format: ‘pem’: PEM (Privacy-Enhanced Mail) là một định dạng dùng để mã hóa khóa hoặc chứng chỉ dưới dạng chuỗi ký tự, sử dụng mã hóa base64.
  4. type: ‘pkcs8’: PKCS#8 là một chuẩn để định dạng thông tin khóa bí mật.

Chạy chương trình

Thông qua lệnh node rsa.js kết quả chúng ta nhận được là:

Public Key: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApQUpZQYGt3VNKF/mBepl
10A8yBCGc7/9xep5c+mtbG4iKr3W0tBRHoYMxwNFRfwudpLsdmb5WmEcv2xH+PK3
TvtTXoyzVQj1Arh1rJVspPvcD5pcrrPQJUwArTKg5GAcz+AJb0lUYvdNHZAwnSJI
eRTOgfl1QYWO5GLVG7GNDugOvMokiDrwQauYf1tKYWUWeB3gVRHIha1w2BTCQarD
6kIYMqeWWWhBIjMY9xSrnIfS77MXZmsv2gVsVW8h9lBnuRexmIcGECykCasbcZFk
4VcQB3GROQxUNGbAy3I8b+GzhFqOLhLPCcxascWczFQqw3ACcPmEEDK/SsaMYn3x
DQIDAQAB
-----END PUBLIC KEY-----

Private Key: -----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClBSllBga3dU0o
X+YF6mXXQDzIEIZzv/3F6nlz6a1sbiIqvdbS0FEehgzHA0VF/C52kux2ZvlaYRy/
bEf48rdO+1NejLNVCPUCuHWslWyk+9wPmlyus9AlTACtMqDkYBzP4AlvSVRi900d
kDCdIkh5FM6B+XVBhY7kYtUbsY0O6A68yiSIOvBBq5h/W0phZRZ4HeBVEciFrXDY
FMJBqsPqQhgyp5ZZaEEiMxj3FKuch9Lvsxdmay/aBWxVbyH2UGe5F7GYhwYQLKQJ
qxtxkWThVxAHcZE5DFQ0ZsDLcjxv4bOEWo4uEs8JzFqxxZzMVCrDcAJw+YQQMr9K
xoxiffENAgMBAAECggEAE+bP9mLoK3b7o7YRF+nhd2Nuu9LLtv5Sx5bpfTJo8Ria
iUdqNvQwXFCJY5+q2ppj1iFjtZHiBRA3jISCwkIvcQM8K5J8zEbExHEPoWKcqYxw
c/dHXJB2DBF4TBW83rNoC3qhrf4M2H9VGbl6i3Dc3FwciFitV1tuqhpF86Lm+ALl
8lcRyeff/XrUAL/+3UAPfhF2uUmDZ5WwFVzdqY2TWfRielcPtBVILig980qsAlSk
RGIFP5sCGi95OX1RfVlALl1pEPVz/m8MDGWvJxuHKscVMns3A1dh7YkDSH3mwlhU
VEDCJNJRl6GJ6LX/I1dak6hNTxkBsx7XAtScbo1lhwKBgQDabq4IVMEljb+YSDa2
OZ70GDMx8NUZZtALK0JW8M0qhKF9sxyX0zLt1/3Lmf7htdTJI85NqvftJ1eFbzCZ
u4eCeWDNadC8ndmbPR2GUAlMGBmHuwcnwcsmQbbfBs7QgfuiyPEvz+g4ixeSELhx
Ds18jPLyBs9VL2DfHgerXaZhjwKBgQDBZs5ggA4YXyz2sL5LfL/2Lj5hzH7+uvvg
IHQchUey8h/sPdyJ1OCJpudVCIzkCK0ihQATwmfXitaEBXSV0oVjxi0DGjK70+xE
2cbNVrFhAoSqZwP8erD2bK2TzSldcXpAdIIr4Yyv7BYO9FlfJyMhDec4pqLiGFsA
pR3eUeV9owKBgQCisR9Eq0P1IZ/b36WIkmBXNJMlFljSg6ZfO0g9Ezvs+D6ELl0U
pEThrCendzrFiLZFXjrx1G63H79rbkbHqkqjHp7AQJktc3C51IpiGMjj+WtCkkYh
EZGrG/UGJr7xxG7Vb09dKkCvpMHYlEWcR8c7howJQpM4woInjOlvdOBQ9wKBgBxv
pUCDE495zv6mlhQ7T24+9mUi0Dlb/NTDcM8Qua4R86ekoNyTNECJDdJu42hT7kD5
FT3Sg7opa8kVlELDJWG6LbwbCgKb8k1dR+HBMWt2F1OGugtRbtuMtyjYLZDTsonv
l4QkMa9cIxIn00wuUPf3N1wZBDICKr85h968Y+XJAoGANUuX9BkHgQoX7g4uZFqY
tJbokLnK6ezbxdxr0Nc+goUrMQ74oW1GmSCbq+mQE+71mNtqy4khhUWwhp1UkBys
KayFkRtF9AvR911mc7CGC/IOtUmr8rhDClPscPbcSwHeCzV0MmGa9wizmG2ipdyz
TMqWGoWKsPKXLLnKKNbCAHs=
-----END PRIVATE KEY-----

Encrypted Message: TYMpY7XobfyWsqr9KHSEFzYWJAEX8REeWufpJftNBIOCqFDnt5s+fPjtQDn6D1YQr2kOih6Mvs44IYA4Vjlo0oILpcU48VuRKtqlj5XFZleSzMRhViQ4/LuMfxLthgc9Bcnxe69WrvaNDwjaW7wNg4KOSQCwThFVGVtmEtZgkbr0Dny/l6KDMtXr+1ND6TiGnBmDbRRwZaAt/+ngsKPiKl5vPC4NzbQ43mwlEr6hGAZtXNJqc/PFSKN253NLNMZPKsrui7nTbNBmeR14eXYflkiXSNBFO++UEy5soAO5JgTlucSKsaZ9v8ky8Uc3AwushOPM+8FNKFTXb329xaV69Q==
Decrypted Message: Techmaster

Tổng kết

Như vậy chúng ta đã cùng nhau tạo tìm hiểu về thuật toán RSA với NodeJS.


Cám ơn bạn đã quan tâm đến bài viết|video này. Để nhận được thêm các kiến thức bổ ích bạn có thể:

  1. Đọc các bài viết của TechMaster trên facebook: https://www.facebook.com/techmastervn
  2. Xem các video của TechMaster qua Youtube: https://www.youtube.com/@TechMasterVietnam nếu bạn thấy video/bài viết hay bạn có thể theo dõi kênh của TechMaster để nhận được thông báo về các video mới nhất nhé.
  3. Chat với techmaster qua Discord: https://discord.gg/yQjRTFXb7a