我在.net中模拟新浪所有注册时所发出的http请求,密码也是在本地用rsa的方式加密码之后post到地址:http://weibo.com/signup/v5/reg
加密代码如下:
RSASetPublic(pubkey, "10001");
string password = RSAEncrypt(psw);
pubkey 是通过请求 http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1392861001300 这个地址获取的
具体加密码方式是:http://pwg17.github.io/2012/12/16/weibo-qq-rsa-csharp/
但是post到http://weibo.com/signup/v5/reg之后一直报如下的错误:
我估计是rsa加密的问题,但是找不出问题出在哪里,头都大了好几圈儿了...哪位大神了解这块儿的,还请指点一二,多谢!
location.replace("?callback=parent.weiboRegController.feedBackUrlCallBack&code=100001&msg=注册失败error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
&checktype=&href=&formresult=&validateExtra=");
这个错误的意思是是指加密时随机填充的数据不正确。
哥们儿能说的详细一点么?我这种加密方式在做新浪微博登录的时候是没问题的
只不过调用的时候有点区别
strRSAPassword = login.RSAEncrypt(strPwd);//注册时用
strRSAPassword = login.RSAEncrypt(servertime + "\t" + nonce + "\n" + strPwd);//登录时用
我是通过看新浪微博的注册时的脚步找出的这个区别,其它的部分都一样,但现在这两种我都在注册的时候试过了.报的错误都一样...
难道新浪微博注册时的脚本里修改过rsa的加密方式?
@小祁: 从它返回的错误看,应该是用的 openssl 的库来实现,采用了 RSA_padding_check_PKCS1_type_2 填充模式,而错误提示填充的数据不正确。我建议你再写个 RSADecrypt 方法来验证你的 RSAEncrypt 的输出是否正确。
@Launcher: 好的多谢!我试试去
error:0906D06C:PEM routines:PEM_read_bio:no start line
微博不是.NET开发的吧,你必须指明填充方式。
//
// 摘要:
// 使用 System.Security.Cryptography.RSA 算法对数据进行加密。
//
// 参数:
// rgb:
// 要加密的数据。
//
// fOAEP:
// 如果为 true,则使用 OAEP 填充(仅在运行 Microsoft Windows XP 或更高版本的计算机上可用)执行直接的 System.Security.Cryptography.RSA
// 加密;否则,如果为 false,则使用 PKCS#1 1.5 版填充。
//
// 返回结果:
// 已加密的数据。
//
// 异常:
// System.Security.Cryptography.CryptographicException:
// 无法获取加密服务提供程序 (CSP)。- 或 -rgb 参数的长度大于最大允许长度。- 或 -fOAEP 参数为 true,而且不支持 OAEP
// 填充。
//
// System.ArgumentNullException:
// rgb 为 null。
[SecuritySafeCritical]
public byte[] Encrypt(byte[] rgb, bool fOAEP);
元数据下有好几个方法,仔细查看下。