RSA 加密和解密介绍

import { encrypt,decryptByPrivateKey} from '@/utils/jsencrypt'

// 加密
export function encrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encrypt(txt) // 对数据进行加密
}

export function getPublicKey(publicKey) {
  let key = new NodeRSA();
  key.importKey(Buffer.from(publicKey, 'base64'), 'pkcs8-public-der');
  return key;
}


// 从私钥创建NodeRSA对象
function getPrivateKey(privateKey) {
  let key = new NodeRSA();
  key.importKey(Buffer.from(privateKey, 'base64'), 'pkcs8-private-der');
  return key;
}
 
// 使用私钥解密
export function decryptByPrivateKey(data) {
  let key = getPrivateKey(privateKey);
  key.setOptions({encryptionScheme: 'pkcs1'}); // 因为Java的RSA默认是pkcs1
  let decrypted = key.decrypt(Buffer.from(data, 'base64'), 'utf8');
  return decrypted;
}

RSA 是一种非对称加密算法,由三位数学家(Rivest、Shamir 和 Adleman)在 1978 年提出。RSA 加密算法基于一个简单的数论事实:将两个大素数相乘非常容易,但将乘积分解回素数却非常困难。

RSA 加密的流程如下:

选择两个大素数 p 和 q,并计算它们的乘积 N = p * q。N 称为 RSA 算法的模数,是一个非常大的整数。

计算欧拉函数 φ(N) = (p-1) * (q-1),其中 φ(N) 表示小于 N 且与 N 互质的正整数的个数。

选择一个小于 φ(N) 且与 φ(N) 互质的整数 e,作为公钥的指数。e 必须满足 1 < e < φ(N)。

计算 e 的模 φ(N) 的逆元 d,即满足 e * d ≡ 1 (mod φ(N)) 的整数 d。d 称为私钥的指数。

公钥是一个有两个值组成的元组 (e, N),私钥是一个有两个值组成的元组 (d, N)。公钥可以公开,私钥必须保密。

要加密一条消息 M,将 M 转换为一个整数 m,并计算 c ≡ m^e (mod N)。c 称为密文,可以公开发送。

要解密密文 c,使用私钥的指数 d 计算 m ≡ c^d (mod N)。

RSA 加密算法的安全性基于一个假设:找到 p 和 q 的乘积 N 的质因子分解是一项困难的计算问题。因此,安全性取决于选择足够大的素数 p 和 q,以确保 N 的长度足够大,使得分解 N 成为两个素数的乘积非常困难。

2、常见的秘钥格式
DER 格式:DER (Distinguished Encoding Rules) 是一种二进制格式的编码规则,常用于表示证书、公钥、私钥等。DER 格式的密钥一般使用二进制方式存储,适合在网络传输中使用。

PEM 格式:PEM (Privacy Enhanced Mail) 是一种 ASCII 编码的密钥格式,常用于表示证书、公钥、私钥等。PEM 格式的密钥以"-----BEGIN..."和"-----END..."开头和结尾,中间是 Base64 编码的二进制数据。PEM 格式的密钥便于在文本文件中存储和传输,但不适合直接在网络上传输。

PKCS#12 格式:PKCS#12 是一种由 RSA 实验室开发的二进制格式,用于存储证书和私钥等密钥信息。PKCS#12 格式的文件通常以 .p12 或 .pfx 为后缀名,支持密码保护和加密,可用于在不同的系统之间安全地传输和备份密钥信息。

JKS 格式:JKS (Java KeyStore) 是一种由 Java 语言开发的密钥库格式,用于存储密钥和证书等安全信息。JKS 格式的密钥库使用二进制方式存储,可以在 Java 应用程序中方便地加载和使用。

除了上述常见的密钥格式,还有其他一些格式,如 OpenSSL 的 ENGINE 格式、Microsoft 的 PFX 格式等。在使用密钥时,需要根据具体情况选择合适的密钥格式,并遵循相应的编码规则和安全标准

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值