自带的RSA加密,如何实现用私钥加密数据?

高坚果兄弟 2015-10-30 01:56:31
c#新手,现在要搞一个rsa加密组件给asp用(asp其实还是很牛逼),本来asp里是用的JavaScript类库,浏览器里面执行加密解密消耗时间忽略不计,到asp里却要4秒多钟。没办法,然后想过用php的rsa加密,搜了一下感觉太复杂,还要安装各种各样的东西。。昨天搜了一下发现.net framework里面的很多组件asp里面其实是可以直接用的,然后就想出了用c#开发组件然后给asp用,今天就把这个功能给实现了。

已经能够实现C#公钥加密数据,私钥解密数据,asp调用正常,浏览器和服务器交互正常。用的是System.Security.Cryptography.RSACryptoServiceProvider,这货是干嘛的不清楚,反正能够实现rsa算法。但是这货却只提供了公钥加密数据,私钥解密数据。

场景:
服务器持有私钥,客户持有公钥,只有一套密钥。

1、客户发送数据用公钥加密,然后服务器私钥解密。
2、服务器用私钥加密数据,然后客户用公钥解密。

很合理的逻辑。

那么问题来了,第1条C#用RSACryptoServiceProvider就能实现,第2条就没辙了,RSACryptoServiceProvider如何用私钥加密数据?

不可能把私钥发给客户,也不要两套密钥增加复杂性,尽量用自带的api,很久没来csdn发求助帖了,希望能有个好的解决方案
...全文
615 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
时间之外 2017-08-03
  • 打赏
  • 举报
回复
引用 15 楼 Forty2 的回复:
[quote=引用 楼主 xiangyuecn 的回复:] ... 场景: 服务器持有私钥,客户持有公钥,只有一套密钥。 1、客户发送数据用公钥加密,然后服务器私钥解密。 2、服务器用私钥加密数据,然后客户用公钥解密。 很合理的逻辑。 ...
一、 如果只有一个客户可以‘持有公钥’,那么就没有‘非对称’加密的优点了。完全可以用更快速的对称加密。 如果允许多个客户可以‘持有公钥’,那么”服务器用私钥加密的数据“,就有多个客户可以解密。 因此不难理解,为什么在Dotnet里面,不支持”服务器用私钥加密数据,然后客户用公钥解密“。 二、 RSA一般不用来直接加密数据,因为a)明文的长度必须小于密码长度,b)RSA的计算量比较大。 一般RSA是用来加密一个‘传输密码’的,然后客户和服务端用‘传输密码’进行对称加密。 比如: a) 客户发送数据(密码)用公钥加密,然后服务器私钥解密得到会话 密码。(客户由此验证服务端,因为只有服务端才有私钥) b) 双方使用‘会话 密码’开始安全通讯。 c) 在完全通讯中客户发送‘用户名/密码等’进行验证,(服务端由此验证客户端,因为只有客户才拥有它的用户名/密码等) d) 由此开始保密通讯... 三、 不需要搞一个”rsa加密组件给asp用“。启用IIS的SSL,并要求站点使用SSL就可以了。 [/quote] 学习了
Forty2 2015-11-01
  • 打赏
  • 举报
回复
引用 楼主 xiangyuecn 的回复:
... 场景: 服务器持有私钥,客户持有公钥,只有一套密钥。 1、客户发送数据用公钥加密,然后服务器私钥解密。 2、服务器用私钥加密数据,然后客户用公钥解密。 很合理的逻辑。 ...
一、 如果只有一个客户可以‘持有公钥’,那么就没有‘非对称’加密的优点了。完全可以用更快速的对称加密。 如果允许多个客户可以‘持有公钥’,那么”服务器用私钥加密的数据“,就有多个客户可以解密。 因此不难理解,为什么在Dotnet里面,不支持”服务器用私钥加密数据,然后客户用公钥解密“。 二、 RSA一般不用来直接加密数据,因为a)明文的长度必须小于密码长度,b)RSA的计算量比较大。 一般RSA是用来加密一个‘传输密码’的,然后客户和服务端用‘传输密码’进行对称加密。 比如: a) 客户发送数据(密码)用公钥加密,然后服务器私钥解密得到会话 密码。(客户由此验证服务端,因为只有服务端才有私钥) b) 双方使用‘会话 密码’开始安全通讯。 c) 在完全通讯中客户发送‘用户名/密码等’进行验证,(服务端由此验证客户端,因为只有客户才拥有它的用户名/密码等) d) 由此开始保密通讯... 三、 不需要搞一个”rsa加密组件给asp用“。启用IIS的SSL,并要求站点使用SSL就可以了。
高坚果兄弟 2015-11-01
  • 打赏
  • 举报
回复
引用 15 楼 Forty2 的回复:
[quote=引用 楼主 xiangyuecn 的回复:] ... 场景: 服务器持有私钥,客户持有公钥,只有一套密钥。 1、客户发送数据用公钥加密,然后服务器私钥解密。 2、服务器用私钥加密数据,然后客户用公钥解密。 很合理的逻辑。 ...
一、 如果只有一个客户可以‘持有公钥’,那么就没有‘非对称’加密的优点了。完全可以用更快速的对称加密。 如果允许多个客户可以‘持有公钥’,那么”服务器用私钥加密的数据“,就有多个客户可以解密。 因此不难理解,为什么在Dotnet里面,不支持”服务器用私钥加密数据,然后客户用公钥解密“。 二、 RSA一般不用来直接加密数据,因为a)明文的长度必须小于密码长度,b)RSA的计算量比较大。 一般RSA是用来加密一个‘传输密码’的,然后客户和服务端用‘传输密码’进行对称加密。 比如: a) 客户发送数据(密码)用公钥加密,然后服务器私钥解密得到会话 密码。(客户由此验证服务端,因为只有服务端才有私钥) b) 双方使用‘会话 密码’开始安全通讯。 c) 在完全通讯中客户发送‘用户名/密码等’进行验证,(服务端由此验证客户端,因为只有客户才拥有它的用户名/密码等) d) 由此开始保密通讯... 三、 不需要搞一个”rsa加密组件给asp用“。启用IIS的SSL,并要求站点使用SSL就可以了。 [/quote] 恩 你这样一解释 就明白多了,我这个小白滥用rsa了,其实我现在也就用rsa加密了一下用户的密码而已,以后要加密其他比较多的数据的话会用aes加密,rsa加密aes密钥,人家这样设计有人家的道理,只不过自己不懂而已,就不纠结这个不应该有的问题了。 组件是一定要的,asp太弱了,很多功能要么安装破解别人的组件,要么压根实现不了,图片处理啥的,自己写一个想要什么功能就加什么功能爽歪歪。ssl有点高级,小白还没这么牛的技术呢 客户端给服务器发数据是没问题了,还想请教一下,服务器端数据如何安全的发送到客户端呢?
高坚果兄弟 2015-10-31
  • 打赏
  • 举报
回复
还有人要说的么
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
引用 12 楼 yushuihani 的回复:
楼主你好, 没有法解决你的问题, 想咨询你一个问题: hsVfcTtzU4eIg4coYnlGkw2kzkMoA6MzapEc0JuwUJPc2TbgRLzDyzKRyDAAnJyPWUvuivo7iWCipEcNPqRFMSc*AxvLP5*s5HkMFXuCX5mzK7mn*YydCVkV-H*WMkRq4ZGpefL92YxYAfW8i0esk6ZKxU1dU1Z8LBdj99x7vxKyf*mF7rG4kVZ14detMKw9xmXzAU4XZ9vtNXt6DURenA__ 这种加密结果是RSA加密吗? 我找了一些代码,尝试试了一下好像得到的结果并不是这样的,没有这么长的字符,原码是:123456789 如果您知道我这种是什么加密方式,还请赐教,谢谢!
rsa加密后的字节数组长度是密钥长度的整数倍,加密结果可以用base64显示成字符串,这段显然不是用标准base64转换的加密结果,可能是自己定义的加密算法或者纯粹是些随机字符,说了这么多其实归纳起来就是我不知道是什么加密的
yushuihani 2015-10-30
  • 打赏
  • 举报
回复
楼主你好, 没有法解决你的问题, 想咨询你一个问题: hsVfcTtzU4eIg4coYnlGkw2kzkMoA6MzapEc0JuwUJPc2TbgRLzDyzKRyDAAnJyPWUvuivo7iWCipEcNPqRFMSc*AxvLP5*s5HkMFXuCX5mzK7mn*YydCVkV-H*WMkRq4ZGpefL92YxYAfW8i0esk6ZKxU1dU1Z8LBdj99x7vxKyf*mF7rG4kVZ14detMKw9xmXzAU4XZ9vtNXt6DURenA__ 这种加密结果是RSA加密吗? 我找了一些代码,尝试试了一下好像得到的结果并不是这样的,没有这么长的字符,原码是:123456789 如果您知道我这种是什么加密方式,还请赐教,谢谢!
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
引用 10 楼 xdashewan 的回复:
[quote=引用 8 楼 xiangyuecn 的回复:] 好像就是要这样,密钥一个客户对应一个,公钥私钥其实都长的一样,客户发数据公钥加密一下,服务器发数据私钥加密一下,反一下也可以,客户要是泄露打死他,这样会安全点点吗
我指的安全是说,当你的客户不只一个时候,他们都将有你发布的公钥,场景1客户加密,你解密当然没问题,问题出在场景2,当你用你的私钥加密私密的回扣信息给客户A的时候,客户B恰巧也拿到了这份信息,客户B用它的公钥轻松地解开了你给客户A的秘密信息,结果发现你给他的回扣要比给客户A的少了很多,于是客户B一不做二不休,把你的信息发给客户C,D,E,客户CDE一看,大惊,随即客户BCDE把你堵在办公室里讨要回扣的差额。大致就是这么一个悲惨的故事。[/quote] 这样说就懂了
xdashewan 2015-10-30
  • 打赏
  • 举报
回复
引用 8 楼 xiangyuecn 的回复:
好像就是要这样,密钥一个客户对应一个,公钥私钥其实都长的一样,客户发数据公钥加密一下,服务器发数据私钥加密一下,反一下也可以,客户要是泄露打死他,这样会安全点点吗
我指的安全是说,当你的客户不只一个时候,他们都将有你发布的公钥,场景1客户加密,你解密当然没问题,问题出在场景2,当你用你的私钥加密私密的回扣信息给客户A的时候,客户B恰巧也拿到了这份信息,客户B用它的公钥轻松地解开了你给客户A的秘密信息,结果发现你给他的回扣要比给客户A的少了很多,于是客户B一不做二不休,把你的信息发给客户C,D,E,客户CDE一看,大惊,随即客户BCDE把你堵在办公室里讨要回扣的差额。大致就是这么一个悲惨的故事。
秋的红果实 2015-10-30
  • 打赏
  • 举报
回复
可以考虑AES
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
私钥只能用来解密和做数字签名吧,用私钥加密数据,所有公钥都能解,有何安全性。两方传输安全应该走ssl吧
好像就是要这样,密钥一个客户对应一个,公钥私钥其实都长的一样,客户发数据公钥加密一下,服务器发数据私钥加密一下,反一下也可以,客户要是泄露打死他,这样会安全点点吗
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
引用 3 楼 From_TaiWan 的回复:
我想知道,你客户端是怎么加密解密的,用javascript吗?要是浏览器屏蔽js执行呢。可以用AcviveX组建,但这要设置浏览器,允许下载、执行才行。你的需求可以考虑https协议,SSL证书
不懂AcviveX、ssl,还没用到这些东西哦,不过连javascript都不支持。。。好黑暗
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
.net 的 RSA 不支持私钥加密,只支持公钥加密。你需要搜一下使用c#的其它实现,很多的。
有你这句话就可以死心了 只是以前java、JavaScript都实现了双向加密解密,做一个c#组件出来支持的不全感觉有点可惜
  • 打赏
  • 举报
回复
.net 的 RSA 不支持私钥加密,只支持公钥加密。你需要搜一下使用c#的其它实现,很多的。
秋的红果实 2015-10-30
  • 打赏
  • 举报
回复
有的浏览器,不执行某些js SSL证书可以购买,也可以自己颁发,如12306就是
秋的红果实 2015-10-30
  • 打赏
  • 举报
回复
我想知道,你客户端是怎么加密解密的,用javascript吗?要是浏览器屏蔽js执行呢。可以用AcviveX组建,但这要设置浏览器,允许下载、执行才行。你的需求可以考虑https协议,SSL证书
xdashewan 2015-10-30
  • 打赏
  • 举报
回复
私钥只能用来解密和做数字签名吧,用私钥加密数据,所有公钥都能解,有何安全性。两方传输安全应该走ssl吧
高坚果兄弟 2015-10-30
  • 打赏
  • 举报
回复
代码丑了点,大家将就着看看

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

namespace AspCSharp
{
    class RSA:Help
    {
        public string Help()
        {
            return "";
        }

        private RSACryptoServiceProvider rsa;
        public RSA()
        {
            CspParameters RSAParams = new CspParameters();
            RSAParams.Flags = CspProviderFlags.UseMachineKeyStore;
            rsa = new RSACryptoServiceProvider(1024, RSAParams);
        }
        public void setKey(string key)
        {
            rsa.FromXmlString(key);
        }
        public string getKey()
        {
            return rsa.ToXmlString(true);
        }
        public string enByPublic(string str) {
            return Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(str), false));
        }
        public string enByPrivate() {
            throw new NotSupportedException();
        }
        public string deByPublic()
        {
            throw new NotSupportedException();
        }
        public string deByPrivate(string str)
        {
            return Encoding.UTF8.GetString(rsa.Decrypt(Convert.FromBase64String(str), false));
        }
    }
}
【课程介绍】     课程目标:             - 有状态登录和无状态登录的区别             - 常见的非对称加密算法和非对称的加密方式             - 老版本只使用jwt进行加密的弊端             - 授权中心的授权流程             - 如何整合网关组件实现jwt安全验证             - 理解什么是公钥什么是私钥      - 深刻理解授权流程什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?- 服务端保存大量数据,增加服务端压力- 服务端保存用户状态,无法进行水平扩展- 客户端请求依赖服务端,多次请求必须访问同一台服务器。什么是无状态? 微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:- 服务端不保存任何客户端请求者信息- 客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份带来的好处是什么呢?- 客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务- 服务端的集群和状态对客户端透明- 服务端可以任意的迁移和伸缩- 减小服务端存储压力

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧