RSA加密使用OEAP及PKCS1_v1_5

import base64
from Crypto.Hash import SHA256, SHA1
from Crypto.Cipher import PKCS1_OAEP, PKCS1_v1_5
from Crypto.Signature.pss import MGF1
from Crypto.PublicKey import RSA


def rsa_encrpyt_v15(text, publickey):
    text = bytes(text, encoding='utf-8')
    publickey = base64.b64decode(publickey)
    rsakey = RSA.importKey(publickey)
    cipher = Cipher_pkcs1_v1_5.new(rsakey)
    pkcs1_padding_text = cipher.encrypt(text)
    cipher_text = base64.b64encode(pkcs1_padding_text)
    return str(cipher_text, encoding='utf-8')


def rsa_encrpyt_oaep(text, publickey):
    """
    rsa加密
    Args:
        text: 被加密的明文
        publickey: 公钥

    Returns:加密结果

    """
    text = bytes(text, encoding='utf-8')
    publickey = base64.b64decode(publickey)
    public_key = RSA.importKey(publickey)
    cipher = PKCS1_OAEP.new(key=public_key, hashAlgo=SHA256, mgfunc=lambda x, y: MGF1(x, y, SHA1))
    pkcs1_padding_text = cipher.encrypt(text)
    cipher_text = base64.b64en
`verify_pkcs1_v1_5_standard` 通常和 PKCS#1 v1.5 签名验证相关。PKCS#1RSA 密码学标准,定义了 RSA 加密和签名方案。`verify_pkcs1_v1_5_standard` 函数可能是用于验证基于 PKCS#1 v1.5 标准生成的数字签名。 ### 详细介绍 PKCS#1 v1.5 签名标准规定了签名生成和验证的过程,它使用 RSA 算法进行签名。签名生成时,消息首先经过哈希算法(如 SHA - 1、SHA - 256 等)生成消息摘要,然后使用私钥对摘要进行加密得到签名。验证时,使用公钥对签名进行解密,再将原始消息进行相同的哈希计算,比较解密后的摘要和计算得到的摘要是否一致。 ### 使用方法示例 在 OpenSSL 库中,虽然没有直接名为 `verify_pkcs1_v1_5_standard` 的函数,但可以通过一系列函数组合实现 PKCS#1 v1.5 签名验证,以下是一个简单的 Python 示例,使用 `cryptography` 库(基于 OpenSSL): ```python from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives.serialization import load_pem_public_key # 假设这是原始消息 message = b"Hello, World!" # 假设这是签名 signature = b"\x12\x34...其他签名数据" # 加载公钥 pem_public_key = b""" -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFw7L4X7Ld1Z8J1f7K7J6t47G ... 公钥数据 ... -----END PUBLIC KEY----- """ public_key = load_pem_public_key(pem_public_key, backend=default_backend()) try: public_key.verify( signature, message, padding.PKCS1v15(), hashes.SHA256() ) print("签名验证成功") except Exception as e: print(f"签名验证失败: {e}") ``` 在上述代码中: 1. 首先定义了原始消息和签名。 2. 加载 PEM 格式的公钥。 3. 使用 `public_key.verify` 方法进行签名验证,指定了 PKCS#1 v1.5 填充模式和哈希算法(这里是 SHA256)。 4. 如果验证成功,打印“签名验证成功”;否则,打印错误信息。 ### C 语言示例(使用 OpenSSL) ```c #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #include <string.h> #define HASH_TYPE NID_sha256 int main() { const unsigned char *message = (const unsigned char *)"Hello, World!"; size_t message_len = strlen((const char *)message); unsigned char signature[256]; // 假设签名长度为 256 字节 size_t signature_len = 256; // 加载公钥 FILE *fp = fopen("public_key.pem", "rb"); if (fp == NULL) { perror("无法打开公钥文件"); return 1; } RSA *rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); fclose(fp); if (rsa == NULL) { ERR_print_errors_fp(stderr); return 1; } // 验证签名 int result = RSA_verify(HASH_TYPE, message, message_len, signature, signature_len, rsa); if (result == 1) { printf("签名验证成功\n"); } else { ERR_print_errors_fp(stderr); printf("签名验证失败\n"); } // 释放资源 RSA_free(rsa); return 0; } ``` 在 C 语言示例中: 1. 定义了原始消息和签名。 2. 从 PEM 文件中加载公钥。 3. 使用 `RSA_verify` 函数进行签名验证,指定哈希类型和消息、签名长度。 4. 根据返回结果判断验证是否成功,并打印相应信息。 5. 最后释放 RSA 资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值