-
-
[原创].NET中RAS加解密和签名与验证的c#实现代码讲解,及实现程序提供,源码自己Reflector。
-
发表于: 2008-11-24 10:25 9426
-
第一次发表原创,申请加精。提供实现程序,自己可以Reflector。代码没有加密等。
RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德•李维斯特(Ron Rivest)、阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
公钥和私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个密钥:
1.随意选择两个大的质数p和q,p不等于q,计算N=pq。
2.根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)
3.选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
4.用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))
5.将p和q的记录销毁。
e是公钥,d是私钥。d是秘密的,而N是公众都知道的。Alice将她的公钥传给Bob,而将她的私钥藏起来。
加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。可以将n加密为c,计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。可以公式来将c转换为n,得到n后,她可以将原来的信息m重新复原。
签名消息
RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值,然后用她的密钥加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
安全
假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是从c算出n,然后将N分解为p和q,这样她可以计算(p-1)(q-1)并从而由e推算出d。至今为止还没有人找到一个多项式时间的计算方法来分解一个大的整数的因子,但至今为止也还没有人能够证明这种算法不存在(见因式分解)。
至今为止也没有人能够证明对N进行分解因式是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。)
因此今天一般认为只要N足够大,那么黑客就没有办法了。
.Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全。目前应用较为广泛的加密方法是使用RSA算法进行加密。在.Net Framework中与RSA加密算法相关的类主要有两个:RSA 类和RSACryptoServiceProvider 类。按照MSDN的说法RSA 类是“表示 RSA 算法的所有实现均从中继承的基类”,而RSACryptoServiceProvider 类是“使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行不对称加密和解密”。另外,“表示 RSA 算法的标准参数”的RSAParameters 结构也是很重要的,它保存了RSA算法的参数。
这里具体讲述一下在C#中如何使用框架提供的RSA算法来对我们的信息加密、签名、验证签名、解密的这个几个步骤的实现过程
产生私钥和公钥
RAS实现加密
RAS实现解密
获取MD5的Hash描述表
RSA签名
RSA 签名验证
RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德•李维斯特(Ron Rivest)、阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
公钥和私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个密钥:
1.随意选择两个大的质数p和q,p不等于q,计算N=pq。
2.根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)
3.选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
4.用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))
5.将p和q的记录销毁。
e是公钥,d是私钥。d是秘密的,而N是公众都知道的。Alice将她的公钥传给Bob,而将她的私钥藏起来。
加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。可以将n加密为c,计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。可以公式来将c转换为n,得到n后,她可以将原来的信息m重新复原。
签名消息
RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值,然后用她的密钥加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
安全
假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是从c算出n,然后将N分解为p和q,这样她可以计算(p-1)(q-1)并从而由e推算出d。至今为止还没有人找到一个多项式时间的计算方法来分解一个大的整数的因子,但至今为止也还没有人能够证明这种算法不存在(见因式分解)。
至今为止也没有人能够证明对N进行分解因式是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。)
因此今天一般认为只要N足够大,那么黑客就没有办法了。
.Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全。目前应用较为广泛的加密方法是使用RSA算法进行加密。在.Net Framework中与RSA加密算法相关的类主要有两个:RSA 类和RSACryptoServiceProvider 类。按照MSDN的说法RSA 类是“表示 RSA 算法的所有实现均从中继承的基类”,而RSACryptoServiceProvider 类是“使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行不对称加密和解密”。另外,“表示 RSA 算法的标准参数”的RSAParameters 结构也是很重要的,它保存了RSA算法的参数。
这里具体讲述一下在C#中如何使用框架提供的RSA算法来对我们的信息加密、签名、验证签名、解密的这个几个步骤的实现过程
产生私钥和公钥
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider(); //得到私钥主要保存了RSAParameters中的8各参数 privateKey = myrsa.ToXmlString(true); //得到公钥保存了RSAParameters中2个参数 publicKey = myrsa.ToXmlString(false);
RAS实现加密
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider(); //得到公钥 myrsa.FromXmlString(publicKey); //把你要加密的内容转换成byte[] PlainTextBArray = (new UnicodeEncoding()).GetBytes(“这里是你要加密的内容”); //使用.NET中的Encrypt方法加密 CypherTextBArray = myrsa.Encrypt(PlainTextBArray, false); //最后吧加密后的byte[]转换成Base64String,这里就是加密后的内容了 Result = Convert.ToBase64String(CypherTextBArray);
RAS实现解密
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider(); //得到私钥 myrsa.FromXmlString(xmlPrivateKey); //把原来加密后的String转换成byte[] PlainTextBArray = Convert.FromBase64String(“刚才加密后的string”); //使用.NET中的Decrypt方法解密 DypherTextBArray = myrsa.Decrypt(PlainTextBArray, false); //转换解密后的byte[],这就得到了我们原来的加密前的内容了 Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
获取MD5的Hash描述表
System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5"); Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource); HashData = MD5.ComputeHash(Buffer);
RSA签名
System.Security.Cryptography.RSACryptoServiceProvider MYRSA = new System.Security.Cryptography.RSACryptoServiceProvider(); //得到私钥 MYRSA.FromXmlString(KeyPrivate); //使用.NET中提供的RSA签名,生成刚才我们的MYRSA私钥的签名对象RSAFormatter System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(MYRSA); //设置签名的算法为MD5 RSAFormatter.SetHashAlgorithm("MD5"); //执行签名EncryptedSignatureData就是签名后的数据 EncryptedSignatureData = RSAFormatter.CreateSignature(“MD5的Hash描述表”);
RSA 签名验证
System.Security.Cryptography.RSACryptoServiceProvider MYRSA = new System.Security.Cryptography.RSACryptoServiceProvider(); //得到公钥 MYRSA.FromXmlString(strKeyPublic); //使用.NET中提供的RSA签名,生成刚才我们的MYRSA公钥的验证签名对象RSADeformatter System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(MYRSA); //指定解密的时候HASH算法为MD5 RSADeformatter.SetHashAlgorithm("MD5"); //验证签名, RSADeformatter.VerifySignature(“MD5的Hash描述表”, “这里是需要验证的签名数据”)
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-1-4 03:07
伟叔叔
为你点赞~
2023-12-2 00:02
QinBeast
为你点赞~
2023-9-10 04:16
一笑人间万事
为你点赞~
2023-8-26 02:46
shinratensei
为你点赞~
2023-8-14 03:33
心游尘世外
为你点赞~
2023-8-4 00:29
飘零丶
为你点赞~
2023-7-21 02:34
赞赏
他的文章
谁下载
qwher
cd37ycs
SLYBAT
ysoni
似曾相识
jgs
seamew
scxlhg
amdey
jerryme
yzslly
lium
opxlz
RuShi
luohb
niuhacker
rkuk
akyo
jackyped
hiberhe
netekin
方向感
cqxucat
残荷斋
fengyezi
渡渡
linuxos
sdaiwt
usurs
jyhvac
mcalin
JohnsonGuo
alu
feilang非浪
zylzylzyl
xhxdkjtdj
血海枫
sunruping
fzzsh
llwinner
lintuorder
mortimer
net小子
dealty
愚公
roxser
pansiom
gpaul
gxzslz
hezhichun
skytion
allenwolf
tiancy
soarheaven
thinkz
newageq
IamNeil
beyondwl
gdgzchen
changyu
xqtisu
popgao
qvbwcwt
zhangzdzzd
walkghost
jjjyyyppp
swsswssws
jackozoo
coaxecvate
wyufei
ningwine
rxb
Callback
chenjacker
sxliupeng
六被
峰峰兒SHUN
coodi
liuyayun
谁下载
deanlh
kanxue
jmzz
qwher
luoshulin
wangshy
email123
funcc
zxc
sunson
cd37ycs
SLYBAT
Xacs
ysoni
鹰飞
jgs
blackboy
亚洲之鹰
seamew
scxlhg
sunli
gdfspy
猪头三
rufus
amdey
fivewin
jerryme
readyu
yzslly
梦之旅
lium
cnlcg
dummy
lingyu
opxlz
勇者无敌
RuShi
风间仁
xuweilafa
kozyan
logkiller
高阁逆风
luohb
俊囝
niuhacker
sxjswift
lunku
diangongtu
rkuk
akyo
偷月
xihuanxue
AChinese
zrsu
ylautyboy
bbbsl
jackyped
古月亮
zdgwxl
hiberhe
jtong
huigll
netekin
yckhkhkhk
方向感
cqmib
误伤友军
cqxucat
流氓兔
TwoSix
残荷斋
loqich
honghan
qqlinhai
canyun
oldold
fengyezi
linuxos
sttacckz
sdaiwt
jyhvac
mcalin
三寸法师
JohnsonGuo
alu
milanxu
woodwu
ghostljj
babycathq
feilang非浪
xhxdkjtdj
血海枫
sunruping
cooip
llwinner
lintuorder
釖釖
dreamzgj
net小子
看原图
赞赏
雪币:
留言: