[求助]C#使用RSA加密,只有一个公钥,要加密后的密文长度要256bit,如何实现?

Smellyfish 2014-08-25 06:50:26
一天快把csdn、msdn和百度知道搜烂了,也没找到,只能在此发帖请教大神,在线等orz
问题是这样,有一串公钥(256字节)
14112A2B2074D68E6EB78F42357FD257CEFDCF642D80A8E143BE25DDE8F971F9164DD7F3AA685B791F2E57B8193FC6A984542D4DCFA4AA1B382F51DBD31E43524A7D54A5261E07E69515FFD627640FDF20E7A268C88C7223145ABEE01F9E9A4149CF480D4B425C28AE5ED1958FCC9B97A119B855058088B4A98C36ED963DF2159FAC7B4541350A84C6826305AFF2E0B964115B72CB223EBCEED8D00092B5AD862DFE3A4A65B12CFABF597E65E1A4C4A184ABA96D33322DAE4A062359F132E0B228C6100E18B89485216B1DBEF2B095360356963BB334CE46DAEFF4760A98FE1EECA1C7B61DC6778D252C307A7B7AC184C1C3CA390E259FF20A93BB90C59DFED1
和一串明文(24字节)
02916F3E78E59E22D2EE1880069CD821admin123
现在需要用RSA算法进行加密明文,加密后的长度也需要256字节,能否实现
我翻到的帖子都不行,首先大多都需要在RSAParameters中填写Exponent这个值,这个值压根儿就没提供
就算我按照网上说的使用比较常见的{0x01,0x00,0x01}凑数,但是生成的密钥只有135个字节左右。发送到对端是解密失败的。
有python脚本实现了,就两行也没用到Exponent什么的
pubkey = rsa.PublicKey._load_pkcs1_der(binascii.a2b_hex(public_key))
enc_msg = rsa.encrypt(org_msg, pk)
这个脚本发送到对端是能解密的,我看了下这个密码有256字节。所以我也想做一个256字节的密文出来,看看行不行,如果还不行就没招了。
难道我大c#比python差这么多么,求解啊
...全文
2122 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
叫我健忘 2016-04-13
  • 打赏
  • 举报
回复
哎,我也遇到这个问题,国内的大神都去哪儿了?
小学生张三 2016-04-06
  • 打赏
  • 举报
回复
我也遇到了这问题,哎
qq_15161913 2015-12-15
  • 打赏
  • 举报
回复
后来怎么样,解决了吗。。我也遇到这问题了
Smellyfish 2014-08-27
  • 打赏
  • 举报
回复
另外我在顶楼贴的公钥也不对,误导大家了。。 应该是这个: 30820122300D06092A864886F70D01010105000382010F003082010A0282010100B9F4F0E24B476AA71FA12A809EA9FE75257B9335BD9889265AC5668F1D8F5F7B18F451337568BC8B199421E56426A090AA3A745DEB7572045D8F86FC20BDE20AD261B4AC91BBBE6BD865CB5A6183A2DF2F1586A6B9546644D096F516F1737BE229D45F06AB28029B9DE50144BE2E49E57648BB1ABEFACF27A102EF41011A91E3CAA5ADAA691CB0F17307C08F2B2A6A8379DA094D81B66BCC01FCB4DF3C73A7513736D881115648C5B03D05243D3BED003D4E73FA27BF3CB26EC9E1281E825B806E30BB59C734CCAD3460619E9C4A5A0350E8180EC56A441D5791B56655AAB50FBAF3999849061F54E5055CC2399266CE42B0EBA92D28B481771527E6F0CABFCD0203010001
Smellyfish 2014-08-27
  • 打赏
  • 举报
回复
To #13 多谢大侠指点 我用晚上的时间也搜到关于公钥的ASN.1编码和DER编码格式了,按照它的讲解,我也提出了modulus和exponent 而且modulus是257位,去掉开头的00,刚好是256位。 可是悲剧的是我现在生成的密文虽然也是256位了,但是生成的密文给对端还是认证失败。。。我已经崩溃了 附上我搜到的两篇文章,供大家参考: http://blog.csdn.net/qq387732471/article/details/6800388 http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys
Forty2 2014-08-27
  • 打赏
  • 举报
回复
建议你参考下贴5楼的回答,那个例子正好是der编码的270个字节,你可以手工裁出modulus和exponent。 http://bbs.csdn.net/topics/390717980 (X509Certificate2类怎样导入一个公钥字符串)
notfoundme 2014-08-27
  • 打赏
  • 举报
回复
顶你一个吧,继续关注
Smellyfish 2014-08-27
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/320113932 这个帖子和我的疑问类似,可惜它沉了,沉。。。了。。。
Smellyfish 2014-08-27
  • 打赏
  • 举报
回复
To #9 我现在就是用公钥当私钥用的,然后搞不定。 我求助里面的内容给错了,公钥是270位的,不是256位,生成的密文是256位 关键是我现在要用c#加密的话,要给两个参数啊!! 一个是Exponent,一个是Modulus,我只有一个公钥,都不知道要怎么填。。 好像有个参数是指明可以用公钥加密的,不过不知道怎么弄
於黾 2014-08-27
  • 打赏
  • 举报
回复
秘钥分公钥私钥,只有公钥没有私钥,你把公钥也当私钥用,加密,看是什么
Smellyfish 2014-08-27
  • 打赏
  • 举报
回复
6#,我确定就两行,原代码因为还对加密的原文做了一些处理(比如拼接两个字符串啊什么的),我简化掉了,简化的过程中变量没弄好,呵呵。 pk = rsa.PublicKey._load_pkcs1_der(binascii.a2b_hex(public_key)) enc_msg = rsa.encrypt(org_msg, pk) 其中org_msg就是待加密的原文,publi_key就是公钥,其他就没了 7#,我也觉得有衍生算法。今天查资料搜到http://zhidao.baidu.com/question/60831983.html这个帖子里面有提到填充模式和PKCS#1 1.5 版填充,这个和我之前提到的PYTHON里面的load_pkcs1_der很像。 还在继续查资料中。。。
於黾 2014-08-26
  • 打赏
  • 举报
回复
pubkey = rsa.PublicKey._load_pkcs1_der(binascii.a2b_hex(public_key)) enc_msg = rsa.encrypt(org_msg, pk) 你确定就2行?为什么我看到了org_msg, pk两个没有定义也没有赋值的变量
Smellyfish 2014-08-26
  • 打赏
  • 举报
回复
2#,3#给的文章我都仔细看过了,都不是。 2#的是说明文很长,密钥很短时的分段加密算法 3#给的是一篇加密科普文章啊。。。我连评论都看完了,什么都没找到。 4#说的我昨天翻资料也看到了,还有密钥至少要比待加密的明文大11位什么的,好像确实是这样。但我这边给的公钥就是这么长。 难道无解了么? 我把RSA算法也翻过了,RSA加密确实是需要两个数字的,一个e一个n 我奇怪的是为啥python可以搞定啊!!! 是不是还有其他衍生的RSA算法什么的?
Forty2 2014-08-26
  • 打赏
  • 举报
回复
不管输入长度如何,RSA产生的秘文跟key的长度是一样的。(注,输入长度有限制,小于Key长度)。 如果你公钥的Modulus长度是256字节,那么密的长度也会是256字节。

public static string RSAEncrypt(string hexKey, string data)
{
    Func<string, byte[]> hexToBytes = (s) =>
    {
        byte[] bytes = new byte[s.Length / 2];
        for (int i = 0; i < bytes.Length; i++)
        {
            bytes[i] = Convert.ToByte(s[i*2] + "" + s[i*2 + 1], 16);
        }
        return bytes;
    };

    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        RSAParameters rsaParams = new RSAParameters()
        {
            Exponent = new byte[] { 1,0,1},
            Modulus = hexToBytes(hexKey),
        };
        rsa.ImportParameters(rsaParams);

        byte[] encrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(data), false);
        return BitConverter.ToString(encrypted).Replace("-", "");
    }
}

static void Main(string[] args)
{
    string key = "14112A2B2074D68E6EB78F42357FD257CEFDCF642D80A8E143BE25DDE8F971F9164DD7F3AA685B791F2E57B8193FC6A984542D4DCFA4AA1B382F51DBD31E43524A7D54A5261E07E69515FFD627640FDF20E7A268C88C7223145ABEE01F9E9A4149CF480D4B425C28AE5ED1958FCC9B97A119B855058088B4A98C36ED963DF2159FAC7B4541350A84C6826305AFF2E0B964115B72CB223EBCEED8D00092B5AD862DFE3A4A65B12CFABF597E65E1A4C4A184ABA96D33322DAE4A062359F132E0B228C6100E18B89485216B1DBEF2B095360356963BB334CE46DAEFF4760A98FE1EECA1C7B61DC6778D252C307A7B7AC184C1C3CA390E259FF20A93BB90C59DFED1";
    string data = "02916F3E78E59E22D2EE1880069CD821admin123";
    string secret = RSAEncrypt(key, data);
    bool sameLength = key.Length == secret.Length; // true
}
PaulyJiang 2014-08-26
  • 打赏
  • 举报
回复
RSA算法有衍生?
devmiao 2014-08-25
  • 打赏
  • 举报
回复
参考 http://www.codeproject.com/Articles/10154/NET-Encryption-Simplified
wangnaisheng 2014-08-25
  • 打赏
  • 举报
回复
帮顶一下吧。看看下面连接有帮助没。 http://waterwood.blog.163.com/blog/static/4359655420105138477804/
Smellyfish 2014-08-25
  • 打赏
  • 举报
回复
自己顶一下吧,再搬个小板凳坐等
【课程介绍】     课程目标:             - 有状态登录和无状态登录的区别             - 常见的非对称加密算法和非对称的加密方式             - 老版本只使用jwt进行加密的弊端             - 授权中心的授权流程             - 如何整合网关组件实现jwt安全验证             - 理解什么是公钥什么是私钥      - 深刻理解授权流程什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?- 服务端保存大量数据,增加服务端压力- 服务端保存用户状态,无法进行水平扩展- 客户端请求依赖服务端,多次请求必须访问同一台服务器。什么是无状态? 微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:- 服务端不保存任何客户端请求者信息- 客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份带来的好处是什么呢?- 客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务- 服务端的集群和状态对客户端透明- 服务端可以任意的迁移和伸缩- 减小服务端存储压力

110,536

社区成员

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

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

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