RSA 加密和解密介绍
2023-12-16 20:29:58
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 格式等。在使用密钥时,需要根据具体情况选择合适的密钥格式,并遵循相应的编码规则和安全标准
文章来源:https://blog.csdn.net/weixin_58775072/article/details/135036496
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!