C#中使用RSAParameters这个类生成公钥出现问题

C#中使用RSAParameters这个类生成公钥出现问题,第1张

C#和PHP都对RSA公钥都进行了封装 比如,同样都表示公钥xxxx C#中写的是: 我的公钥为-xxxx php写的是: 俺的公钥是:xxxx 2个表示都不同,当然无法认识 能不能这样 把C#公钥中纯的 公钥数字发过去 PHP在根据 得来的公钥数字 转化为公钥

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK 。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。

RSA算法是一个广泛使用的公钥算法。其密钥包括公钥和私钥。它能用于数字签名、身份认证以及密钥交换。RSA密钥长度一般使用1024位或者更高。RSA密钥信息主要包括:

n:模数

e:公钥指数

d:私钥指数

p:最初的大素数

q:最初的大素数

其中,公钥为n和e;私钥为n和d。

本文假设你已经安装好了OpenSSL,并且持有一份111的源码。

RSA相关的头文件在rsah中、源文件在crypto/rsa目录中。

这个结构定义了RSA内部数据信息。主要字段含义:

version —— 版本。

meth —— RSA运算抽象方法集合。

n,e,d,p,q,dmp1,dmq1,iqmp —— 密钥相关的大数。

这个结构定义了RSA内部各种运算抽象方法集合。主要字段含义:

name —— 名称描述。

rsa_pub_enc —— 公钥加密方法。

rsa_pub_dec —— 公钥解密方法。

rsa_priv_enc —— 私钥加密方法。

rsa_priv_dec —— 公钥解密方法。

rsa_sign —— 签名方法。

rsa_verify —— 验签方法。

rsa_keygen —— 生成密钥对方法。

在111中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。

RSA RSA_new(void);

生成一个RSA密钥结构,采用默认的rsa_pkcs1_ossl_meth方法。

void RSA_free(RSA r);

释放RSA结构。

RSA RSA_generate_key(int bits, unsigned long e, void (callback) (int, int, void ), void cb_arg);

生成RSA密钥(旧版本)。

bits为密钥位数,e为公钥指数。

callback为密钥生成过程中的干预回调函数,通常传入NULL。cb_arg为回调参数。

成功返回RSA指针,失败返回NULL。

int RSA_generate_key_ex(RSA rsa, int bits, BIGNUM e, BN_GENCB cb);

生成RSA密钥(新版本)。

rsa为RSA对象指针。bits为密钥位置,e为公钥指数的大数形式指针。cb为干预回调函数,通常传入NULL。

成功返回1,失败返回0。

关于公钥指数e,主要有两个取值:

# define RSA_3 0x3L

# define RSA_F4 0x10001L

RSA RSAPublicKey_dup(RSA rsa);

复制RSA公钥部分。

成功返回RSA指针,失败返回NULL。

RSA RSAPrivateKey_dup(RSA rsa);

复制RSA私钥部分。

成功返回RSA指针,失败返回NULL。

int RSA_bits(const RSA rsa);

获取RSA密钥位数。

int RSA_size(const RSA rsa);

获取RSA密钥长度。

int RSA_check_key(const RSA );

int RSA_check_key_ex(const RSA , BN_GENCB cb);

检查RSA的有效性,必须为完整的密钥对。

成功返回1,失败返回0。

int RSA_print(BIO bp, const RSA r, int offset);

int RSA_print_fp(FILE fp, const RSA r, int offset);

将RSA信息输出到bp/fp中,off为输出信息在bp/fp中的偏移量,比如是屏幕bp/fp,则表示打印信息的位置离左边屏幕边缘的距离。

int RSA_public_encrypt(int flen, const unsigned char from,

unsigned char to, RSA rsa, int padding);

RSA公钥加密。

成功返回密文的长度,失败返回-1。

int RSA_public_decrypt(int flen, const unsigned char from,

unsigned char to, RSA rsa, int padding);

RSA公钥解密。

成功返回明文的长度,失败返回-1。

int RSA_private_encrypt(int flen, const unsigned char from,

unsigned char to, RSA rsa, int padding);

RSA私钥加密。

成功返回密文的长度,失败返回-1。

int RSA_private_decrypt(int flen, const unsigned char from,

unsigned char to, RSA rsa, int padding);

RSA私钥解密。

成功返回明文的长度,失败返回-1。

关于padding填充方式,取值:

其中PKCS1填充大小为11字节,所以加密明文长度必须不大于(密钥大小-11字节)。

# define RSA_PKCS1_PADDING_SIZE 11

int RSA_sign(int type, const unsigned char m, unsigned int m_length,

unsigned char sigret, unsigned int siglen, RSA rsa);

对数据m生成RSA签名,生成的签名长度与key的长度相同,如512位密钥生成64字节签名。

type指定摘要算法的NID,如NID_sha1。

成功返回1,失败返回0。

int RSA_verify(int type, const unsigned char m, unsigned int m_length,

const unsigned char sigbuf, unsigned int siglen, RSA rsa);

对数据m验证RSA签名。

type指定摘要算法的NID,如NID_sha1。

成功返回1,失败返回0。

以下函数在x509h中定义:

int i2d_RSAPrivateKey_bio(BIO bp, RSA rsa)

{

return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);

}

将RSA公钥转换为DER编码,并写入到bp抽象IO中。

成功返回1,失败返回0。

RSA d2i_RSAPrivateKey_bio(BIO bp, RSA rsa)

{

return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);

}

从bp抽象IO中读取DER编码,并转换为rsa结构私钥。

成功返回有效指定,失败返回NULL。

int i2d_RSAPublicKey_bio(BIO bp, RSA rsa)

{

return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);

}

将RSA公钥转换为DER编码,并写入到bp抽象IO中。

成功返回1,失败返回0。

RSA d2i_RSAPublicKey_bio(BIO bp, RSA rsa)

{

return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);

}

从bp抽象IO中读取DER编码,并转换为rsa结构公钥。

成功返回有效指定,失败返回NULL。

下面这个例子演示了RSA密钥对的生成、公私钥的复制、公钥加密和私钥解密的用法。

输出:

下面这个例子演示了公私钥的分开保存、读取,以及使用公私钥加解密。

输出:

RSA_generate_key_ex() ret:1

i2d_RSAPrivateKey_bio() ret:1

i2d_RSAPublicKey_bio() ret:1

copy' private key size:64

copy' public key size:64

RSA_public_encrypt() ret:64

RSA_private_decrypt() ret:10

text:[1234567890]

下面这个例子演示了签名的生成和验证 *** 作。

输出:

ret:1

RSA_sign() ret:1

sign 64

4ec0af099c49646b72fda88a4fb11e8deb3898da9c3f611a5f25f05d9d005631858239bbb732cd5060dbc975363fc1b9cdfdc5a04554115a916f06f98163189f

RSA_verify() ret:1

这里边涉及到几个概念。其实我们无法从私钥中获得公钥的!就象我们无法通过公钥获得私钥一样!但事实上保存私钥的文件并不单单保存了私钥,它非本身是保存的有公钥的!也就是说如果一个证书文件只含有公钥时,那就是只有公钥,如果含有私有时一定会含有公钥——并不是你想象的只有一个私钥。

现在来说一下RSA机制,我们知道,RSA基于两个大素数之积,所以,一个正常的容器内包含有几个基本的参数的(RSAParameters类):

d /dp/dq/Expoent/InverseQ/Modulus/p/q

如果是保存私钥时,这几个参数会全部存在,但如果只是一个公钥文件的话,只有n/e(Modulus和Exponent)两个参数是存在的。

所以一般我们使用是否含有私钥作为文件或容量的参数,从另一个角度上来说,一定是存在公钥的,但是否存在私钥做为一个参数。

当然这个内容与具体的语言没有关系——所有的RSA都是这样规定的。

那么请您按以下步骤进行 *** 作:

1、重新安装对应品牌的U盾驱动程序。

2、查看您的系统是否已打全补丁,如果没有,请使用WINDOWS的UPDATE功能进行升级。

3、如果您的系统为2000或XP,请您选择“控制面板”中的“管理工具”下的“服务”,查看SMART CARD是否启用,如未启用,请您启用。本文来自: 工行吧>

点开电脑左下角的“开始—程序—工行个人网银证书工具软件—华虹—华虹客服端管理工具—证书”然后输入证书密码点击确定!下面有一行工行的信息看看那个起始日期跟截止日期是不是相差5年!是的话选中这一行点击下面的安装!看看是不是告诉你证书安装成功!是的话插着u盾重启电脑!实在不行你换台电脑试试啊!换一台看看能不能正常用能的话证明你u盾没问题!那很显然证明跟你这个电脑有关系啊!换了电脑还是给你这个提示那我建议你拿着yhk、本人有效身份z件、带着u盾去你当地指定的“证书代理网点”去做证书恢复,恢复好以后就在柜台叫他们给你下载好!确定能正常用你在回家用那就没问题了!

以上就是关于C#中使用RSAParameters这个类生成公钥出现问题全部的内容,包括:C#中使用RSAParameters这个类生成公钥出现问题、OpenSSL之RSA用法、c#rsa私钥中怎么获取公钥等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存