mbedtls移植之RSA加解密算法

这篇具有很好参考价值的文章主要介绍了mbedtls移植之RSA加解密算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 mbedtls简介

MbedTLS是一个开源、可移植、易使用、可读性高的SSL库,实现了常所用的加解密算法、X.509证书操作以及TLS协议操作。MbedTLS各功能模块独立性高、耦合度低,可以通过配置宏定义进行功能裁剪,非常适合对空间和效率要求高的嵌入式系统。

二、RSA算法简介

1978年,由Ron Rivest、Adi Shamir和Reonard Adleman共同发表了公钥密码算法RSA,RSA目前是使用广泛的非对称加解密和签名验签算法。RSA密钥由公钥和私钥组成,基本特性如下:
1.公钥和私钥是成对出现的,一个公钥必然对应一个固定的私钥。同理,一个私钥也必然对应一个固定的公钥;
2.在加解密缓解,公钥用于加密,私钥用于解密;
3.在签名验签环节,私钥用于签名,公钥用于验签;
4.公钥通常是公开的,任何人都可以获取到,但私钥必须严格保密;
5.RSA按分组进行,若分组长度不足(例如1024bits或2048bits),则需要填充。填充方式分为PKCS#V1.5和PKCS#V2.1
6.非对称算法性能远低于对称算法

三、实现

3.1 移植MbedTLS代码

移植自mbedTLS 2.16版本
需移植的文件如下:
mbedtls rsa,算法,网络安全,安全,单片机,汽车,密码学
mbedtls rsa,算法,网络安全,安全,单片机,汽车,密码学

修改config.h文件

#ifndef MBEDTLS_CONFIG_H
#define MBEDTLS_CONFIG_H

#define MBEDTLS_ERROR_C
#define MBEDTLS_BIGNUM_C
#define MBEDTLS_OID_C
#define MBEDTLS_RSA_C
#define MBEDTLS_AES_C
#define MBEDTLS_MD_C
#define MBEDTLS_ENTROPY_C
#define MBEDTLS_GENPRIME
#define MBEDTLS_CTR_DRBG_C
#define MBEDTLS_PK_C
#define MBEDTLS_SHA256_C

//写pem证书时需要
#define MBEDTLS_PK_WRITE_C
#define MBEDTLS_PEM_WRITE_C
#define MBEDTLS_ASN1_WRITE_C
#define MBEDTLS_BASE64_C

//读pem证书
#define MBEDTLS_PEM_PARSE_C
#define MBEDTLS_PK_PARSE_C
#define MBEDTLS_ASN1_PARSE_C
#define MBEDTLS_BASE64_C
#define MBEDTLS_FS_IO

//填充方式,V15或V21两种模式必须二选一
#define MBEDTLS_PKCS1_V21
//#define MBEDTLS_PKCS1_V15

//不使用平台默认熵源,mbedtls在windows和linux下已实现熵源
#define MBEDTLS_NO_PLATFORM_ENTROPY
//#include "check_config.h"

#endif

3.2 引入头文件

引入相应的头文件

#include <stdio.h>
#include <time.h>
#include <string.h>
#include "../crypto/mbedtls/rsa.h"
#include "../crypto/mbedtls/ctr_drbg.h"
#include "../crypto/mbedtls/entropy.h"
#include "../crypto/mbedtls/entropy_poll.h"
#include "../crypto/mbedtls/sha256.h"
#include "../crypto/mbedtls/pk.h"
#include "../crypto/mbedtls/error.h"

3.3 填充方式

RSA加解密时存在两种填充方式:PKCS#V1.5、PKCS#V2.1,必须在config.h中指定填充方式。
mbedtls的RSA中默认使用PKCS#V1.5的填充方式,若在代码中使用PKCS#V2.1,代码中需额外设置,具体设置见后续代码备注。
两种填充方式的差异此处不展开介绍。

3.4 生成RSA公私钥对

3.4.1 添加熵源

假定无本地熵源的情况下,需添加熵源(mbedtls在windows和linux已支持默认熵源,但其他嵌入式平台无熵源,需手动添加)
示例使用当前时间作为熵源,实际应选择强度更高的熵源

//添加熵源
int get_clock_for_entropy( void *data,unsigned char *output, size_t len, size_t *olen ) {
    time_t now_time;
    time(&now_time);
    unsigned long timer = now_time;
    ((void) data);
    *olen = 0;

    if (len < sizeof(unsigned long))
        return (0);

    memcpy(output, &timer, sizeof(unsigned long));
    *olen = sizeof(unsigned long);
    return 0;
}

3.4.2 生成RSA密钥对

生成密钥对,可选择生成多少位的密钥,例如1024或者2048,通常推荐生成2048的密钥

int generate_keypair(){

    //个性化初始值:用于初始化伪随机数生成器,可设置为任意值
    const char *personalization = "Fr789jj-ikrkjfjs@";
    char error[100];

    mbedtls_rsa_context  rsa_context;
    mbedtls_entropy_context entropy_context;
    mbedtls_ctr_drbg_context ctr_drbg_context;

    mbedtls_entropy_init(&entropy_context);
    mbedtls_ctr_drbg_init(&ctr_drbg_context);
    //使用V15填充时,hash_id不是必选
    mbedtls_rsa_init(&rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);

    //添加熵源,若在嵌入式平台,需添加熵源
    mbedtls_entropy_add_source(&entropy_context,get_clock_for_entropy,NULL,MBEDTLS_ENTROPY_MIN_PLATFORM,MBEDTLS_ENTROPY_SOURCE_STRONG);
    int result = mbedtls_ctr_drbg_seed(&ctr_drbg_context, mbedtls_entropy_func, &entropy_context, personalization,strlen(personalization));
    if(result !=0 ){
        printf("failed to set ctr_drbg seed\n");
        mbedtls_rsa_free(&rsa_context);
        mbedtls_entropy_free(&entropy_context);
        mbedtls_ctr_drbg_free(&ctr_drbg_context);
        return -1;
    }
    //生成RSA密钥,若要修改密钥长度,则修改nbits参数
    result = mbedtls_rsa_gen_key(&rsa_context,mbedtls_ctr_drbg_random,&ctr_drbg_context,2048,65537);
    if(result == 0){
        printf("succeeded to generate RSA key pair\n");
    }else{
        printf("failed to generate RSA key pair\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        mbedtls_rsa_free(&rsa_context);
        mbedtls_entropy_free(&entropy_context);
        mbedtls_ctr_drbg_free(&ctr_drbg_context);
        return -2;
    }
    get_key_from_rsa_context(&rsa_context);

    mbedtls_rsa_free(&rsa_context);
    mbedtls_entropy_free(&entropy_context);
    mbedtls_ctr_drbg_free(&ctr_drbg_context);

    return 0;
}

3.4.3 获取PEM格式证书

若需要将证书保存到文件,需额外添加写文件操作即可。

int get_key_from_rsa_context(mbedtls_rsa_context *rsa_context){
    mbedtls_pk_context pk_context;
    unsigned char public_key_pem[2048];
    unsigned char private_key_pem[2048];

    mbedtls_pk_init(&pk_context);
    //设置PK上下文的类型为RSA
    mbedtls_pk_setup(&pk_context,mbedtls_pk_info_from_type(MBEDTLS_PK_RSA));
    //获取PK context的RSA字段并设置rsa context
    mbedtls_rsa_copy(mbedtls_pk_rsa(pk_context),rsa_context);

    //获取公钥
    int result = mbedtls_pk_write_pubkey_pem(&pk_context,public_key_pem,sizeof(public_key_pem));
    if( result == 0){
        printf("%s\n", public_key_pem);
    }else{
        printf("failed to get public key\n");
        mbedtls_pk_free(&pk_context);
        return -1;
    }

    //获取私钥
    result = mbedtls_pk_write_key_pem(&pk_context,private_key_pem,sizeof(private_key_pem));
    if( result == 0){
        printf("%s\n", private_key_pem);
    }else{
        printf("failed to get private key\n");
        mbedtls_pk_free(&pk_context);
        return -2;
    }

    mbedtls_pk_free(&pk_context);
    return 0;
}

3.4.4 运行效果

mbedtls rsa,算法,网络安全,安全,单片机,汽车,密码学

3.5 RSA加解密

int encrypt_and_decrypt_data(){
    //个性化初始值:用于初始化伪随机数生成器,可设置为任意值
    const char *personalization = "Fr789jj-ikrkjfjs@";
    mbedtls_pk_context public_pk_context;
    mbedtls_pk_context private_pk_context;
    unsigned char public_key_buffer[2048];
    unsigned char private_key_buffer[2048];
    const char *public_pem_file = "D:\\tmp\\crypto\\rsa\\public.pem";
    const char *private_pem_file = "D:\\tmp\\crypto\\rsa\\private.pem";
    const unsigned char *plain = "hello world";
    unsigned char encrypt_text[256];
    unsigned char decrypt_text[256];
    unsigned char pk_encrypt_text[256];
    unsigned char pk_decrypt_text[256];
    char error[100];

    //mbedtls_rsa_context  rsa_context;
    mbedtls_entropy_context entropy_context;
    mbedtls_ctr_drbg_context ctr_drbg_context;

    mbedtls_entropy_init(&entropy_context);
    mbedtls_ctr_drbg_init(&ctr_drbg_context);
    //mbedtls_rsa_init(&rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    mbedtls_pk_init(&public_pk_context);
    mbedtls_pk_init(&private_pk_context);
    //mbedtls_pk_setup(&pk_context,mbedtls_pk_info_from_type(MBEDTLS_PK_RSA));

    mbedtls_entropy_add_source(&entropy_context,get_clock_for_entropy,NULL,MBEDTLS_ENTROPY_MIN_PLATFORM,MBEDTLS_ENTROPY_SOURCE_STRONG);
    int result = mbedtls_ctr_drbg_seed(&ctr_drbg_context, mbedtls_entropy_func, &entropy_context, personalization,strlen(personalization));
    if(result){
        printf("failed to get drbg seed\n");
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -1;
    }

    //加密
    //获取公钥
    result = mbedtls_pk_parse_public_keyfile(&public_pk_context,public_pem_file);
    if(result != 0){
        printf("failed to parse public key from file!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -2;
    }else{
        printf("succeeded to parse public key from file!\n");
    }

    //加密方式1:直接调用RSA加密函数
    mbedtls_rsa_context *public_rsa_context = mbedtls_pk_rsa(public_pk_context);
    //设置填充方式,默认为V15,若使用V21则必须显式设置
    mbedtls_rsa_set_padding(public_rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    result = mbedtls_rsa_pkcs1_encrypt(public_rsa_context,mbedtls_ctr_drbg_random,&ctr_drbg_context,MBEDTLS_RSA_PUBLIC,strlen(plain),plain,encrypt_text);
    if(result == 0){
        //获取密文长度
        size_t encrypt_text_len = mbedtls_rsa_get_len(public_rsa_context);
        printf("succeeded to encrypt data by rsa\n");
        printf("encrypt data:\n");
        for(int i=0;i<encrypt_text_len;i++){
            printf("%02x",encrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to encrypt data by rsa!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -3;
    }

    //加密方式2:调用PK中的加密函数(PK是对整个公钥加密算法做了个封装,PK里包含RSA和ECC)
    size_t pk_encrypt_len = 0;
    //因PK默认填充方式为V15,若需要使用V21填充方式,需添加如下代码。若使用V15,则无需添加
    mbedtls_rsa_set_padding(mbedtls_pk_rsa(public_pk_context),MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    //end
    result = mbedtls_pk_encrypt(&public_pk_context,plain,strlen(plain),pk_encrypt_text,&pk_encrypt_len,sizeof(pk_encrypt_text),mbedtls_ctr_drbg_random,&ctr_drbg_context);
    if(result == 0){
        printf("succeeded to encrypt data by pk\n");
        //printf("encrypt len:%zu\n",pk_encrypt_len);
        printf("encrypt data:\n");
        for(int i=0;i<pk_encrypt_len;i++){
            printf("%02x",pk_encrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to encrypt data by pk!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -3;
    }

    //解密
    //获取私钥
    result = mbedtls_pk_parse_keyfile(&private_pk_context,private_pem_file,NULL);
    if(result != 0){
        printf("failed to parse private key from file!\n");
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -4;
    }else{
        printf("succeeded to parse private key from file!\n");
    }


    //解密方式1:直接调用RSA解密函数
    mbedtls_rsa_context *private_rsa_context = mbedtls_pk_rsa(private_pk_context);
    //明文长度
    size_t decrypt_len = 0;
    //设置填充方式,默认为V15,故若使用V21则必须显式设置
    mbedtls_rsa_set_padding(private_rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    result = mbedtls_rsa_pkcs1_decrypt(private_rsa_context,mbedtls_ctr_drbg_random,&ctr_drbg_context,MBEDTLS_RSA_PRIVATE,&decrypt_len,encrypt_text,decrypt_text,sizeof(decrypt_text));
    if(result == 0){
        //解密成功
        printf("succeeded to decrypt data by rsa\n");
        printf("after decryption data:\n");
        for(int i=0;i<decrypt_len;i++){
            printf("%c",decrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to decrypt data by rsa!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -5;
    }

    //解密方式2:调用PK解密函数,mbedtls_pk_decrypt的ilen必须为当前密文的真实长度,不是密文buffer长度。
    size_t pk_decrypt_len = 0;
    //因PK默认填充方式为V15,若需要使用V21填充方式,需添加如下代码。若使用V15,则无需添加
    mbedtls_rsa_set_padding(mbedtls_pk_rsa(private_pk_context),MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    //end
    result = mbedtls_pk_decrypt(&private_pk_context,pk_encrypt_text,sizeof(pk_encrypt_text),pk_decrypt_text,&pk_decrypt_len,sizeof(pk_decrypt_text),mbedtls_ctr_drbg_random,&ctr_drbg_context);
    if(result == 0){
        //解密成功
        printf("succeeded to decrypt data by pk\n");
        //printf("pk_decrypt_len:%zu\n",pk_decrypt_len);
        printf("after decryption data:\n");
        for(int i=0;i<pk_decrypt_len;i++){
            printf("%c",pk_decrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to decrypt data by pk!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -5;
    }

    free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
    return 0;
}

void free_crypto_context(mbedtls_pk_context *public_pk_context,mbedtls_pk_context *private_pk_context,mbedtls_entropy_context *entropy_context,mbedtls_ctr_drbg_context *ctr_drbg_context){
    mbedtls_pk_free(private_pk_context);
    mbedtls_pk_free(public_pk_context);
    mbedtls_ctr_drbg_free(ctr_drbg_context);
    mbedtls_entropy_free(entropy_context);
}

总体实现代码如上,下面简单做下分析

3.5.1 读取密钥

读取密钥的函数如下:

  • mbedtls_pk_parse_public_keyfile从文件中读取PEM公钥
  • mbedtls_pk_parse_public_Key从buffer或数组中读取PEM公钥
  • mbedtls_pk_parse_keyfile从文件中读取PEM私钥
  • mbedtls_pk_parse_key从buffer或数组中读取PEM私钥

示例代码为从文件中读取

//获取公钥
    result = mbedtls_pk_parse_public_keyfile(&public_pk_context,public_pem_file);
    if(result != 0){
        printf("failed to parse public key from file!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -2;
    }else{
        printf("succeeded to parse public key from file!\n");
    }
//获取私钥
    result = mbedtls_pk_parse_keyfile(&private_pk_context,private_pem_file,NULL);
    if(result != 0){
        printf("failed to parse private key from file!\n");
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -4;
    }else{
        printf("succeeded to parse private key from file!\n");
    }

3.5.2 加密

可通过两种方式进行加密:
1.直接调用RSA中的加密函数
2.调用PK中的加密函数(最终还是调用到RSA的加密函数)
mbedtls的PK库为整个公钥算法库,在RSA基础上进一步封装,并将ECC算法封装进去

备注:需注意填充方式为V15还是V21,此处填充方式需保持和config.h中开启的一致

//加密方式1:直接调用RSA加密函数
    mbedtls_rsa_context *public_rsa_context = mbedtls_pk_rsa(public_pk_context);
    //设置填充方式,默认为V15,若使用V21则必须显式设置
    mbedtls_rsa_set_padding(public_rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    result = mbedtls_rsa_pkcs1_encrypt(public_rsa_context,mbedtls_ctr_drbg_random,&ctr_drbg_context,MBEDTLS_RSA_PUBLIC,strlen(plain),plain,encrypt_text);
    if(result == 0){
        //获取密文长度
        size_t encrypt_text_len = mbedtls_rsa_get_len(public_rsa_context);
        printf("succeeded to encrypt data by rsa\n");
        printf("encrypt data:\n");
        for(int i=0;i<encrypt_text_len;i++){
            printf("%02x",encrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to encrypt data by rsa!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -3;
    }
//加密方式2:调用PK中的加密函数(PK是对整个公钥加密算法做了个封装,PK里包含RSA和ECC)
    size_t pk_encrypt_len = 0;
    //因PK默认填充方式为V15,若需要使用V21填充方式,需添加如下代码。若使用V15,则无需添加
    mbedtls_rsa_set_padding(mbedtls_pk_rsa(public_pk_context),MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    //end
    result = mbedtls_pk_encrypt(&public_pk_context,plain,strlen(plain),pk_encrypt_text,&pk_encrypt_len,sizeof(pk_encrypt_text),mbedtls_ctr_drbg_random,&ctr_drbg_context);
    if(result == 0){
        printf("succeeded to encrypt data by pk\n");
        //printf("encrypt len:%zu\n",pk_encrypt_len);
        printf("encrypt data:\n");
        for(int i=0;i<pk_encrypt_len;i++){
            printf("%02x",pk_encrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to encrypt data by pk!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -3;
    }

3.5.3 解密

解密同样有两种方式:
1.直接调用RSA中的解密函数
2.调用PK中的解密函数(最终仍然是调用到RSA中的解密函数)

备注:需注意填充方式为V15还是V21,此处填充方式需保持和config.h中开启的一致

//解密方式1:直接调用RSA解密函数
    mbedtls_rsa_context *private_rsa_context = mbedtls_pk_rsa(private_pk_context);
    //明文长度
    size_t decrypt_len = 0;
    //设置填充方式,默认为V15,故若使用V21则必须显式设置
    mbedtls_rsa_set_padding(private_rsa_context,MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    result = mbedtls_rsa_pkcs1_decrypt(private_rsa_context,mbedtls_ctr_drbg_random,&ctr_drbg_context,MBEDTLS_RSA_PRIVATE,&decrypt_len,encrypt_text,decrypt_text,sizeof(decrypt_text));
    if(result == 0){
        //解密成功
        printf("succeeded to decrypt data by rsa\n");
        printf("after decryption data:\n");
        for(int i=0;i<decrypt_len;i++){
            printf("%c",decrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to decrypt data by rsa!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -5;
    }
//解密方式2:调用PK解密函数,mbedtls_pk_decrypt的ilen必须为当前密文的真实长度,不是密文buffer长度。
    size_t pk_decrypt_len = 0;
    //因PK默认填充方式为V15,若需要使用V21填充方式,需添加如下代码。若使用V15,则无需添加
    mbedtls_rsa_set_padding(mbedtls_pk_rsa(private_pk_context),MBEDTLS_RSA_PKCS_V21,MBEDTLS_MD_SHA256);
    //end
    result = mbedtls_pk_decrypt(&private_pk_context,pk_encrypt_text,sizeof(pk_encrypt_text),pk_decrypt_text,&pk_decrypt_len,sizeof(pk_decrypt_text),mbedtls_ctr_drbg_random,&ctr_drbg_context);
    if(result == 0){
        //解密成功
        printf("succeeded to decrypt data by pk\n");
        //printf("pk_decrypt_len:%zu\n",pk_decrypt_len);
        printf("after decryption data:\n");
        for(int i=0;i<pk_decrypt_len;i++){
            printf("%c",pk_decrypt_text[i]);
        }
        printf("\n");
    }else{
        printf("failed to decrypt data by pk!\n");
        mbedtls_strerror(result,error,sizeof(error));
        printf("%s\n",error);
        free_crypto_context(&public_pk_context,&private_pk_context,&entropy_context,&ctr_drbg_context);
        return -5;
    }

3.5.4 运行效果

mbedtls rsa,算法,网络安全,安全,单片机,汽车,密码学文章来源地址https://www.toymoban.com/news/detail-834213.html

到了这里,关于mbedtls移植之RSA加解密算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RSA算法加解密过程全解析

    不同于传统的对称加密算法体系,非对称公私钥密码系统中的加密密钥和解密密钥是相互分开的,加密密钥用于公开给别人加密,而只有持有解密密钥的人才能对信息进行解密。1976年诞生过不少非对称密码算法,但是RSA是其中最容易让人理解的。下文将尝试对RSA实现的具体流

    2023年04月23日
    浏览(34)
  • RSA-CRT 使用中国剩余定理CRT对RSA算法进行解密

    使用中国剩余定理对RSA进行解密,可以提高RSA算法解密的速度。 有关数论的一些基础知识可以参考以下文章: 密码学基础知识-数论(从入门到放弃) 设p和q是不同的质数,且n = p*q。对于任意(X1, x2),其中 0 ≤ x1 p 和 0 ≤ x2 q,存在数x,其中 0 ≤ x n。 中国剩余定理给出了以下的

    2024年02月04日
    浏览(39)
  • RSA 加密解密算法实现(简单,易懂)!!!

    目录 一、什么是RSA算法 1.对称加密 2.非对称加密 3.非对称加密的应用 二、RSA算法的基础操作步骤 1.生成公钥和私钥 2.用公钥加密信息  3.用私钥解密信息 三、AC代码 六、RSA算法的测试  七、共勉     在计算机中常用的加密算法分为两类: 对称加密算法和非对称加密算法。

    2024年01月20日
    浏览(66)
  • RSA的中国剩余定理(CRT)算法解密

    1.公私钥计算 (1) 计算 n = p x q ; (2) 计算Φ(n)= (p-1) x (q-1); (3) 选择 e ,且e与Φ(n)互素 ; (4) 确定d x e= 1 mod Φ(n); (5) 确定公钥 PU = {n , d}, 私钥 PR = {n,e} 2.加解密 明文M ;加密Y= M^e mod n; 解密 M = Y^d mod n; p和q是互相独立的大素数,n为p*q,对于任意(m1, m2), (0=m1

    2024年02月08日
    浏览(44)
  • C语言实现简单的RSA加解密算法

    使用c语言实现了简单的RSA加解密算法。 实验内容: 1、输入两个素数,然后生成一个随机数,计算出随机数的逆元,然后保存这些信息; 2、选择加密,则输入明文,输出密文; 3、选择解密,则输入密钥,输出明文。 我把输入的数据当做了字符串,所以没有问题对于汉字,

    2024年02月11日
    浏览(44)
  • 20.2 OpenSSL 非对称RSA加解密算法

    RSA算法是一种非对称加密算法,由三位数学家 Rivest 、 Shamir 和 Adleman 共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用的非对称加密算法,与对称加密算法

    2024年02月08日
    浏览(47)
  • Java代码实现RSA算法加密解密文件功能

    底层算法不做赘述,想要了解自行百度。 RSA属于非对称加密,非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份

    2024年02月12日
    浏览(56)
  • RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法,以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理,从而来保证应用上线后的安全性,给用户

    2024年02月09日
    浏览(54)
  • C语言中的 RSA加密和解密算法: 深度探索与实现

    RSA加密算法是一种非对称加密算法,即公开密钥加密,私有密钥解密。在公开密钥加密和私有密钥解密的过程中,密钥是不同的,这是与其他加密算法的主要区别。RSA算法的安全性依赖于大数分解,随着计算机的发展,对于大数的分解能力越来越强,RSA算法的密钥长度也在不

    2024年02月03日
    浏览(51)
  • 常见加密解密(DES、RSA)以及摘要算法MD5的介绍

    1.1-理解MD5 MD5公开的算法,任何语言实现后其实都是一样的、通用的 不可逆加密:原文——加密——密文,密文无法解密出原文 1.2-MD5封装 1.3-MD5总结 相同原文加密的结果是一样的 不同长度的内容加密后都是32位,可以自行改变长度 原文件改动差别很小,结果差别很大 不管文

    2024年02月14日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包