最近在弄C#平台与Java后台网页传字符串RSA加密解密问题。

    因为Java生成的密钥对,由于字节流格式不一样,所以Java后台给的密钥对在C#里面是不能用的。其实解决方案应该是有3个:

1、该Java后台代码生成能与C#通用的代码,但这种方案在其他如Ios、php等其他平台可能不能用,参考 http://www.cnblogs.com/aaaSoft/archive/2011/11/30/2268720.html

2、把Java所写的加密解密封装成Java包(后缀为.jar),然后让C#调用,参考http://www.soaspx.com/dotnet/csharp/csharp_20120315_8762.html

3、通过OpenSSL来进行加密解密(主要记录此方法),参考http://xw-z1985.iteye.com/blog/1837376

http://download.csdn.net/detail/yimi_love/3522577

但是C#中RSA只能加密解密字节有限,所以要做特别处理,参考

http://www.cnblogs.com/kuaileguaiwu/articles/1440471.html

http://download.csdn.net/detail/changyuming/633236

http://www.csharpwin.com/csharpspace/13140r1715.shtml

 

由于密钥长度有限,一次性加密的数据长度也有限,因此必须对明文进行分块加密,再合并加密结果。

以1024位密钥为例,n为1024位,即128个字节,则明文需要分块成每块长128个字节,不足128位的使用特定格式的数据填充。

所以分块的算法称为填充算法,有不同的标准,如NoPPadding、OAEPPadding、PKCS1Padding等。

Java生成的密钥对类似的.pem文件,类似私钥如下:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDBsGcpN1CMEpLofqPtEGSHClPXqCUbimfUKlCEr6YVLfLB6kvv
xARLx5lfKPmghZZyFNVnpqH/ulqRYrAANVXvzXjJWLkDl0BXb3ZB5jqbb8boSjU6
NfXkXa36B2tNIihvsj4HEctF8PiopCNohRKSJ31lpl1LcvKIbwL686acbwIDAQAB
AoGAbR0rgJSg08hC6qctQgfSGiE/SmZ3QSSfiW6tHZK2RYg1Efkj/la29NnlFS7I
Mh4PuwTxlArTiHU7QFwQOo3RcuOx7AFg9/k9EMXBVSBzd2MmeUHqA6vvVxhrwa2r
ul9hT0YctCYCYawUzsIhkE+K/SaYuYerGxZt1/fM2CvKZMECQQDfEF9d/SBmMvFC
Srr3u7yJ6dmyktbLYaFyWBcfGaqa/GWOgRX8En1pvQO7k0kcMHjqOE6e6m7tFIUc
/SNU81MTAkEA3kmvWeNfp2SkOrC/xv70fF83saCve0+C709FTb0G6NTZG2PIoKHS
BkXUyZuWnB2kZ+L12sMb+K+0n3ubpqugtQJBAL7o6lYswD/3tZiBEQfZu4FljZZS
Klei1WRhlFhfxS4kel6+iCxXPtLynHE7m0TvD22Wh2NnTUzHVS38UPLx1dUCQBaC
B4tmho0Al9CJjSGtNzxQt+b4ikxGJM/uiunwNf7lboZjeDErsYSJFZ7Ebl+ocLlE
NfjMwMxRnkx3y674ufECQQDSG1m1lGS341qY8VSoshFfNZyrF6Qt4cauTWFk8RcX
41vhWelXijpUhcvazXm6fos9YaXe1fMiUfVDsupnDbWg
-----END RSA PRIVATE KEY-----

类似公钥的.pem文件:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBsGcpN1CMEpLofqPtEGSHClPX
qCUbimfUKlCEr6YVLfLB6kvvxARLx5lfKPmghZZyFNVnpqH/ulqRYrAANVXvzXjJ
WLkDl0BXb3ZB5jqbb8boSjU6NfXkXa36B2tNIihvsj4HEctF8PiopCNohRKSJ31l
pl1LcvKIbwL686acbwIDAQAB
-----END PUBLIC KEY-----

 

a)从网上下载openssl工具:http://www.slproweb.com/products/Win32OpenSSL.html

b)openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt

c)生成了pkcs8格式的pem文件的私钥(其实生成的密钥是一样的,我的是这样子的,只是后缀前缀少了RSA而已)类似如下:

 -----BEGIN PRIVATE KEY-----
MIICXQIBAAKBgQDBsGcpN1CMEpLofqPtEGSHClPXqCUbimfUKlCEr6YVLfLB6kvv
xARLx5lfKPmghZZyFNVnpqH/ulqRYrAANVXvzXjJWLkDl0BXb3ZB5jqbb8boSjU6
NfXkXa36B2tNIihvsj4HEctF8PiopCNohRKSJ31lpl1LcvKIbwL686acbwIDAQAB
AoGAbR0rgJSg08hC6qctQgfSGiE/SmZ3QSSfiW6tHZK2RYg1Efkj/la29NnlFS7I
Mh4PuwTxlArTiHU7QFwQOo3RcuOx7AFg9/k9EMXBVSBzd2MmeUHqA6vvVxhrwa2r
ul9hT0YctCYCYawUzsIhkE+K/SaYuYerGxZt1/fM2CvKZMECQQDfEF9d/SBmMvFC
Srr3u7yJ6dmyktbLYaFyWBcfGaqa/GWOgRX8En1pvQO7k0kcMHjqOE6e6m7tFIUc
/SNU81MTAkEA3kmvWeNfp2SkOrC/xv70fF83saCve0+C709FTb0G6NTZG2PIoKHS
BkXUyZuWnB2kZ+L12sMb+K+0n3ubpqugtQJBAL7o6lYswD/3tZiBEQfZu4FljZZS
Klei1WRhlFhfxS4kel6+iCxXPtLynHE7m0TvD22Wh2NnTUzHVS38UPLx1dUCQBaC
B4tmho0Al9CJjSGtNzxQt+b4ikxGJM/uiunwNf7lboZjeDErsYSJFZ7Ebl+ocLlE
NfjMwMxRnkx3y674ufECQQDSG1m1lGS341qY8VSoshFfNZyrF6Qt4cauTWFk8RcX
41vhWelXijpUhcvazXm6fos9YaXe1fMiUfVDsupnDbWg
-----END PRIVATE KEY-----

c)openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem


貌似附件传不上,否则上传工程会更明了一点