国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析

简介: 国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析

🔒 国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析

🔑 RSA 算法原理

RSA(Rivest-Shamir-Adleman)是一种广泛使用的非对称加密算法。它利用了大数因数分解的困难性来确保加密的安全性。RSA 算法的关键特征在于它使用一对密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。

算法原理

1. 密钥生成
  • 选择两个大质数:选择两个足够大的质数 ( p ) 和 ( q )。
  • 计算模数 ( n ): ( n = p \times q )。模数 ( n ) 是公钥和私钥的一部分。
  • 计算 ( \phi(n) ):( \phi(n) = (p-1) \times (q-1) ),这是 ( n ) 的欧拉函数。
  • 选择公钥指数 ( e ):选择一个与 ( \phi(n) ) 互质的整数 ( e ),通常选择 65537。
  • 计算私钥指数 ( d ):计算 ( d ) 使得 ( d \times e \equiv 1 \mod \phi(n) )。
2. 加密与解密
  • 加密:使用公钥 ( (e, n) ) 将明文消息 ( M ) 加密为密文 ( C ),公式为 ( C = M^e \mod n )。
  • 解密:使用私钥 ( (d, n) ) 将密文 ( C ) 解密回明文 ( M ),公式为 ( M = C^d \mod n )。

Python 实现

使用 cryptography 库来实现 RSA 加密和解密:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
def generate_keys():
    # 生成 RSA 密钥对
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
    )
    public_key = private_key.public_key()
    return private_key, public_key
def encrypt_message(message, public_key):
    # 加密消息
    encrypted_message = public_key.encrypt(
        message.encode('utf-8'),
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted_message
def decrypt_message(encrypted_message, private_key):
    # 解密消息
    decrypted_message = private_key.decrypt(
        encrypted_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted_message.decode('utf-8')
# 示例
private_key, public_key = generate_keys()
message = "Hello, RSA!"
encrypted_message = encrypt_message(message, public_key)
decrypted_message = decrypt_message(encrypted_message, private_key)
print("Encrypted Message:", encrypted_message)
print("Decrypted Message:", decrypted_message)

输入输出示例:

  • 输入: 明文消息 "Hello, RSA!"
  • 输出:
  • 加密结果: b'\x98\x0b\x0b\xea...' (加密的密文)
  • 解密结果: "Hello, RSA!"

JavaScript 实现(使用 jsencrypt 模块)

const JSEncrypt = require('jsencrypt').JSEncrypt;

function rsaEncryptDecrypt(message, publicKey, privateKey, mode) {
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(publicKey);
    encryptor.setPrivateKey(privateKey);

    if (mode === 'encrypt') {
        return encryptor.encrypt(message);
    } else if (mode === 'decrypt') {
        return encryptor.decrypt(message);
    } else {
        throw new Error("Invalid mode. Choose 'encrypt' or 'decrypt'.");
    }
}

// 示例
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7ZgMciTp...
-----END PUBLIC KEY-----`;
const privateKey = `-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFA...
-----END PRIVATE KEY-----`;
const message = 'Hello, RSA!';
const encrypted = rsaEncryptDecrypt(message, publicKey, privateKey, 'encrypt');
const decrypted = rsaEncryptDecrypt(encrypted, publicKey, privateKey, 'decrypt');

console.log("Encrypted:", encrypted);
console.log("Decrypted:", decrypted);

输入输出示例:

  • 输入: 明文消息 "Hello, RSA!", 公钥和私钥 (PEM 格式)
  • 输出:
  • 加密结果: "U2FsdGVkX1+...lCw==" (加密的密文)
  • 解密结果: "Hello, RSA!"

🌟 非对称加密的特征

1. 非对称特性

非对称加密的主要特征是使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。与对称加密不同,非对称加密的安全性依赖于密钥的管理和算法的复杂性。

2. 安全性

RSA 算法的安全性依赖于大数因数分解的困难性。即使知道公钥,也无法轻易推算出私钥,这使得 RSA 算法在传输敏感数据时具有较高的安全性。

3. 公私钥对

在实际应用中,公钥可以公开,而私钥必须保密。公钥可以用于加密数据,而只有私钥持有者才能解密这些数据。

🌐 JavaScript 中的 RSA 实现

使用 jsencrypt 模块

jsencrypt 是一个轻量级的 RSA 加密模块,支持在浏览器环境和 Node.js 环境中使用。它提供了简单的接口来进行 RSA 加密和解密。

代码示例
const JSEncrypt = require('jsencrypt').JSEncrypt;

function rsaEncryptDecrypt(message, publicKey, privateKey, mode) {
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(publicKey);
    encryptor.setPrivateKey(privateKey);

    if (mode === 'encrypt') {
        return encryptor.encrypt(message);
    } else if (mode === 'decrypt') {
        return encryptor.decrypt(message);
    } else {
        throw new Error("Invalid mode. Choose 'encrypt' or 'decrypt'.");
    }
}

// 示例
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7ZgMciTp...
-----END PUBLIC KEY-----`;
const privateKey = `-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFA...
-----END PRIVATE KEY-----`;
const message = 'Hello, RSA!';
const encrypted = rsaEncryptDecrypt(message, publicKey, privateKey, 'encrypt');
const decrypted = rsaEncryptDecrypt(encrypted, publicKey, privateKey, 'decrypt');

console.log("Encrypted:", encrypted);
console.log("Decrypted:", decrypted);

输入输出示例:

  • 输入: 明文消息 "Hello, RSA!", 公钥和私钥 (PEM 格式)
  • 输出:
  • 加密结果: "U2FsdGVkX1+...lCw==" (加密的密文)
  • 解密结果: "Hello, RSA!"

🛠️ 拓展用法

1. 密钥管理

Python 实现:

from cryptography.hazmat.primitives import serialization

def save_key_to_file(key, file_name):
    with open(file_name, 'wb') as key_file:
        key_file.write(key)

def load_key_from_file(file_name):
    with open(file_name, 'rb') as key_file:
        key = key_file.read()
    return key

# 示例
private_key_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption()
)
public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

save_key_to_file(private_key_pem, 'private_key.pem')
save_key_to_file(public_key_pem, 'public_key.pem')

loaded_private_key = load_key_from_file('private_key.pem')
loaded_public_key = load_key_from_file('public_key.pem')

2. 密钥加密

Python 实现:

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.kdf.pbk

df2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import serialization

def encrypt_key_with_password(key, password):
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=b'some_salt',
        iterations=100000,
    )
    encrypted_key = kdf.derive(password)
    return encrypted_key

def decrypt_key_with_password(encrypted_key, password):
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=b'some_salt',
        iterations=100000,
    )
    decrypted_key = kdf.verify(password, encrypted_key)
    return decrypted_key

# 示例
password = b'secret_password'
encrypted_key = encrypt_key_with_password(public_key_pem, password)
decrypted_key = decrypt_key_with_password(encrypted_key, password)

3. 密钥对生成与导入导出

Python 实现:

from cryptography.hazmat.primitives.asymmetric import rsa

def generate_and_export_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
    )
    public_key = private_key.public_key()
    
    private_key_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.TraditionalOpenSSL,
        encryption_algorithm=serialization.NoEncryption()
    )
    public_key_pem = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    
    with open('private_key.pem', 'wb') as private_key_file:
        private_key_file.write(private_key_pem)
        
    with open('public_key.pem', 'wb') as public_key_file:
        public_key_file.write(public_key_pem)

# 示例
generate_and_export_key_pair()

4. 通过密钥对进行加密和解密

Python 实现:

def rsa_encrypt_decrypt(message, public_key_pem, private_key_pem, mode):
    public_key = serialization.load_pem_public_key(public_key_pem)
    private_key = serialization.load_pem_private_key(private_key_pem, password=None)
    
    if mode == 'encrypt':
        return encrypt_message(message, public_key)
    elif mode == 'decrypt':
        return decrypt_message(message, private_key)
    else:
        raise ValueError("Invalid mode. Choose 'encrypt' or 'decrypt'.")

# 示例
message = "Hello, RSA!"
encrypted = rsa_encrypt_decrypt(message, public_key_pem, private_key_pem, 'encrypt')
decrypted = rsa_encrypt_decrypt(encrypted, public_key_pem, private_key_pem, 'decrypt')

print("Encrypted:", encrypted)
print("Decrypted:", decrypted)

5. 密钥对比和验证

Python 实现:

def compare_keys(key1, key2):
    return key1 == key2
# 示例
public_key_1 = load_key_from_file('public_key.pem')
public_key_2 = load_key_from_file('public_key.pem')
print("Keys are equal:", compare_keys(public_key_1, public_key_2))
目录
相关文章
|
JavaScript 前端开发
在Node.js中,如何合理使用模块来避免全局变量的问题?
在Node.js中,如何合理使用模块来避免全局变量的问题?
652 167
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
347 0
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
1459 9
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
1284 2
使用SM4算法加密LUKS格式磁盘
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
398 10

热门文章

最新文章

推荐镜像

更多
  • DNS