什么是RSA算法,有公钥和私钥对他的处理过程是这样的

什么是RSA算法,有公钥和私钥对他的处理过程是这样的,第1张

分类: 电脑/网络 >> 互联网

解析:

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)(q-1)互质;再选择e2,要求(e2e1)mod((p-1)(q-1))=1。

(n及e1),(n及e2)就是密钥对。

RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

e1和e2可以互换使用,即:

A=B^e2 mod n;B=A^e1 mod n;

补充回答:

对明文进行加密,有两种情况需要这样作:

1、您向朋友传送加密数据,您希望只有您的朋友可以解密,这样的话,您需要首先获取您朋友的密钥对中公开的那一个密钥,e及n。然后用这个密钥进行加密,这样密文只有您的朋友可以解密,因为对应的私钥只有您朋友拥有。

2、您向朋友传送一段数据附加您的数字签名,您需要对您的数据进行MD5之类的运算以取得数据的"指纹",再对"指纹"进行加密,加密将使用您自己的密钥对中的不公开的私钥。您的朋友收到数据后,用同样的运算获得数据指纹,再用您的公钥对加密指纹进行解密,比较解密结果与他自己计算出来的指纹是否一致,即可确定数据是否的确是您发送的、以及在传输过程中是否被篡改。

密钥的获得,通常由某个机构颁发(如CA中心),当然也可以由您自己创建密钥,但这样作,您的密钥并不具有权威性。

计算方面,按公式计算就行了,如果您的加密强度为1024位,则结果会在有效数据前面补0以补齐不足的位数。补入的0并不影响解密运算。

在C++下,我使用OPENSSL库生成了RSA的公私钥对与DES加密之用的会话密钥,并将这三者及加密结果写入文件以备在Java环境下使用。

在C++程序中,我使用使用公钥来加密了DES的会话密钥,然后在Java下使用私钥来解密会话密钥;在运算结果中,我未做其它方面的码制转换,即按密钥的初始格式DER编码,数学运算结果也是按DER编码来实现。

在Java程序中,我从之前所存储的几个文件中取得密钥与加密结果来做解密。我使用了BC的JCE,即bcprov-jdk14-119jar,在使用之前,需要先安装此JCE:

假设JDK:jdk14\jre\

把BC包放到JRE下的ext:jdk14\jre\lib\ext

修改文件jdk14\jre\lib\security\javasecurity:

#

# List of providers and their preference orders (see above):

#

securityprovider1=sunsecurityproviderSun

securityprovider2=comsunnetsslinternalsslProvider

securityprovider3=comsunrsajcaProvider

securityprovider4=comsuncryptoproviderSunJCE

securityprovider5=sunsecurityjgssSunProvider

securityprovider6=orgbouncycastlejceproviderBouncyCastleProvider

======================================================================

C++程序源码:

#include

#include

#include

//#define _RSA_KEY_PAIR_GENERATE_//密钥是否要生成 只需要在第一次运行时打开此宏

#define _RSA_KEY_PAIR_TOFILE_//密钥对是否要写入文件

#define MAX_RSA_KEY_LENGTH 512 //密钥的最大长度是512字节

#define PUBKEY_ENCRYPT

#define PRIKEY_DECRYPT

#pragma comment(lib, "/lib/libeay32lib")

static const char PUBLIC_KEY_FILE = "pubkeykey";

static const char PRIVATE_KEY_FILE = "prikeykey";

int RsaKeyPairGen(void)

{

RSA rsa = NULL;

#ifdef_RSA_KEY_PAIR_GENERATE_

//生成RSA密钥对:

rsa = RSA_new();

rsa = RSA_generate_key(1024, 0x10001, NULL, NULL);

#endif

//把密钥对写入文件,以后从文件里读取

#ifdef _RSA_KEY_PAIR_TOFILE_

unsigned char ucPubKey[MAX_RSA_KEY_LENGTH] = {0}, ucPriKey[MAX_RSA_KEY_LENGTH] = {0};

int len = i2d_RSAPublicKey(rsa,NULL);

unsigned char pt = ucPubKey;

len = i2d_RSAPublicKey(rsa, &pt);

FILE fpubkey = NULL;

fpubkey = fopen(PUBLIC_KEY_FILE, "wb");

if(fpubkey == NULL)

{

cout << "fopen pubkeykey failed!" << endl;

return 0x01;

}

fwrite(ucPubKey, 1, len, fpubkey);

fclose(fpubkey);

len = i2d_RSAPrivateKey(rsa,NULL);

unsigned char pt2 = ucPriKey;

len = i2d_RSAPrivateKey(rsa,&pt2);

FILE fprikey = NULL;

fprikey = fopen(PRIVATE_KEY_FILE, "wb");

if(fprikey == NULL)

{

cout << "fopen prikeykey failed!" << endl;

return 0x02;

}

fwrite(ucPriKey, 1, len, fprikey);

fclose(fprikey);

#endif

if(rsa != NULL)

{

RSA_free(rsa);

rsa = NULL;

}

return 0;

}

//从文件里读取私钥的数据,取得RSA格式的私钥:

int GetPriKey(unsigned char pucPriKeyData, unsigned long KeyDataLen, RSA priRsa)

{

unsigned char Pt = pucPriKeyData;

priRsa = d2i_RSAPrivateKey(NULL, &Pt, KeyDataLen);

if(priRsa == NULL)

{

cout << "priRsa == NULL!" << endl;

return 0x22;

}

return 0;

}

//取得RSA格式的公钥:

int GetPubKey(unsigned char pucPubKeyData,unsigned long KeyDataLen, RSA pubRsa)

{

unsigned char Pt = pucPubKeyData;

pubRsa = d2i_RSAPublicKey(NULL, &Pt, KeyDataLen);

if(pubRsa == NULL)

{

cout << "pubRsa == NULL!" << endl;

return 0x31;

}

return 0;

}

//公钥加密会话密钥:

int encSessionKeybyRsaPubKey(RSA rsa, unsigned char ucKey, unsigned long ulKeyLen,

unsigned char outData, unsigned long pulOutLen)

{

return (pulOutLen = RSA_public_encrypt(ulKeyLen, ucKey, outData, rsa, 1));

}

//私钥解密会话密钥:

int decSessionKeybyRsaPriKey(RSA rsa, unsigned char InData, unsigned long ulDataLen,

unsigned char ucKey, unsigned long pulKeyLen)

{

return (pulKeyLen = RSA_private_decrypt(ulDataLen, InData, ucKey, rsa, 1));

}

int main(int argc, char argv[])

{

unsigned char ucKey[8] = {0x01, 0x03, 0x99, 0x4, \

0x80, 0x65, 0x34, 0x08};

unsigned char ucEncryptedKey[512] = {0}, ucDecryptedKey[512] = {0};

unsigned long encrypted_len = 0, decrypted_len = 0;

#ifdef _RSA_KEY_PAIR_GENERATE_

RsaKeyPairGen();

#endif

//取得公钥:

unsigned char ucPubKey[MAX_RSA_KEY_LENGTH] = {0};

FILE fpubkey = NULL;

fpubkey = fopen(PUBLIC_KEY_FILE, "rb");

if(fpubkey == NULL)

{

cout << "fopen pubkeykey failed!" << endl;

return 0x03;

}

fseek(fpubkey, 0, SEEK_END);

int len_PK = ftell(fpubkey);

fseek(fpubkey, 0, SEEK_SET);

fread(ucPubKey, 1, len_PK, fpubkey);

fclose(fpubkey);

#ifdef PUBKEY_ENCRYPT

RSA pRsaPubKey = NULL;

pRsaPubKey = RSA_new();

GetPubKey(ucPubKey, len_PK, &pRsaPubKey);

//公钥加密:

encSessionKeybyRsaPubKey(pRsaPubKey, ucKey, sizeof(ucKey), ucEncryptedKey, &encrypted_len);

//write to file:

FILE fp = NULL;

fp = fopen("ucKeydata", "wb");

fwrite(ucEncryptedKey, 1, encrypted_len, fp);

fclose(fp);

if(pRsaPubKey != NULL)

{

RSA_free(pRsaPubKey); pRsaPubKey = NULL;

}

#endif

//取得私钥:

unsigned char ucPriKey[MAX_RSA_KEY_LENGTH] = {0};

FILE fprikey = NULL;

fprikey = fopen(PRIVATE_KEY_FILE, "rb");

if(fprikey == NULL)

{

cout << "fopen prikeykey failed!" << endl;

return 0x02;

}

fseek(fprikey, 0, SEEK_END);

int len_SK = ftell(fprikey);

fseek(fprikey, 0, SEEK_SET);

fread(ucPriKey, 1, len_SK, fprikey);

fclose(fprikey);

#ifdef PRIKEY_DECRYPT

RSA pRsaPriKey = NULL;

pRsaPriKey = RSA_new();

GetPriKey(ucPriKey, len_SK, &pRsaPriKey);

//私钥解密:

FILE fp1 = NULL;

fp1 = fopen("ucKeydata", "rb");

int len = ftell(fp1);

fseek(fp1, 0, SEEK_SET);

fread(ucPriKey, 1, len_SK, fp1);

fclose(fp1);

decSessionKeybyRsaPriKey(pRsaPriKey, ucEncryptedKey, encrypted_len, ucDecryptedKey, &decrypted_len);

if(pRsaPriKey != NULL)

{

RSA_free(pRsaPriKey); pRsaPriKey = NULL;

}

//数据对比:

if(0 == memcmp(ucKey, ucDecryptedKey, decrypted_len))

{

cout << "OK!" << endl;

}

else

{

cout << "FAILED!" << endl;

}

#endif

return 0;

}

以上就是关于什么是RSA算法,有公钥和私钥对他的处理过程是这样的全部的内容,包括:什么是RSA算法,有公钥和私钥对他的处理过程是这样的、如何用C++实现读取证书文件中的公钥数据、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9706944.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存