广告
返回顶部
首页 > 资讯 > 后端开发 > Python >C#与Java的RSA(3)
  • 513
分享到

C#与Java的RSA(3)

JavaRSA 2023-01-31 07:01:29 513人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

原创文章,转载请注明出处 Http://boytnt.blog.51cto.com/966121/1351207。在上一篇文章里,我们已经成功的解析出了公钥加密至关重要的modulus和publicExponent,胜利在望,心急的同学肯定

原创文章,转载请注明出处 Http://boytnt.blog.51cto.com/966121/1351207。


在上一篇文章里,我们已经成功的解析出了公钥加密至关重要的modulus和publicExponent,胜利在望,心急的同学肯定要开始这么写了:


                                                     
//设定RSA参数,用于指定modulus和exponent
var parameter = new RSAParameters();
parameter.Modulus = modulusBytes;       //modulusBytes是转化后的byte[]
parameter.Exponent = exponentBytes;
                                                     
//加密
var rsa = RSACryptoServiceProvider.Create("RSA");
rsa.ImportParameters(parameter);
byte[] result = rsa.EncryptValue(Encoding.UTF8.GetBytes("PASSWord"));
                                                   
//把密文转化为HEX形式
string resultHex = BitConverter.ToString(result).Replace("-", "");


对不起要无情的打击你了,这么做行不通,因为C#的RSA加密不是标准RSA,为了加强安全性,它强制使用了PKCS1填充(或OAEP填充),导致密文在Java端解密失败,因为Java端用的是无填充模式(RSA/ECB/NoPadding)。


怎么办? 自己实现标准RSA加密吧。modulus和publicExponent都有了,再加上密码,都转化成大整数,做一个ModPow操作,就得到结果密文了。正好.netFramework从4.0起在System.Numerics命名空间下直接提供BigInterger类了,上手试试:


                                            
//把3个变量转化为System.Numerics.BigInteger
var modulus = new BigInteger(modulusBytes);
var exponent = new BigInteger(exponentBytes);
var data = new BigInteger(Encoding.UTF8.GetBytes("PASSWORD"));
                                            
//做ModPow运算得到密文,也是BigInteger
var result = BigInteger.ModPow(data, exponent, modulus);
                                            
//把密文BigInteger对应的byte[]转化为HEX形式
string resultHex = BitConverter.ToString(result.ToByteArray()).Replace("-", "");


OH MY GoD!!!  还是不行,为什么?


是字节序在捣乱,我们上面分析ASN.1结构时得到的所有数据都是大字节序的,而System.Numerics.BigInteger是小字节序的,需要转化之后才能使用。这点很烦人,要转来转去的。


                                            
//把3个变量转化为System.Numerics.BigInteger
var modulus = new BigInteger(modulusBytes.Reverse().ToArray());
var exponent = new BigInteger(exponentBytes.Reverse().ToArray());
var data = new BigInteger(Encoding.UTF8.GetBytes("PASSWORD").Reverse().ToArray());
                                            
//做ModPow运算得到密文,也是BigInteger
var result = BigInteger.ModPow(d, e, m);
                                            
//把密文BigInteger对应的byte[]转化为HEX形式
string resultHex = BitConverter.ToString(result.ToByteArray().Reverse().ToArray()).Replace("-", "");


再试一下,这下终于OK了。


问题完美解决了吗? 很遗憾,没有,因为System.Numerics.BigInteger是4.0以上版本才提供的,低于此版本的只好去使用第三方的实现,比如这个:http://www.codeproject.com/Articles/2728/Csharp-BigInteger-Class,但要注意以下2点:


1、它默认只支持560bit,代码最开头有写:private const int maxLength = 70;

把maxLength改成256才能支持2048位的RSA运算了。

2、它是大字节序的,在使用时不用反转modulus和publicExponent对应的byte[]。

3、我们得到的modulus是257个字节,需要去掉首字节的0,用剩下的256个字节实例化BigInteger。



好,至此问题算是告一段落了,实测通过。以后想起来什么再继续补充吧。

我没有提供完整解决方案的代码,只给出了部分代码片断,希望对此问题有兴趣的同学把重点放在理解过程上,而不是仅仅搬代码。



--结束END--

本文标题: C#与Java的RSA(3)

本文链接: https://www.lsjlt.com/news/191686.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#与Java的RSA(3)
    原创文章,转载请注明出处 http://boytnt.blog.51cto.com/966121/1351207。在上一篇文章里,我们已经成功的解析出了公钥加密至关重要的modulus和publicExponent,胜利在望,心急的同学肯定...
    99+
    2023-01-31
    Java RSA
  • c#与js的rsa加密互通示例
    这篇文章主要介绍了c#与js的rsa加密互通示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ASN.1 抽象语法表示(标记)ASN.1(Abstract Synt...
    99+
    2023-06-14
  • 详解c#与js的rsa加密互通
    目录ASN.1密钥结构类型PKCS#1PKCS#8密钥编码类型der格式pem格式证书类型X.509证书PKCS#12证书PKCS#7证书证书后缀证书与密钥关系密钥生成后端加/解密方...
    99+
    2022-11-12
  • RSA密钥--JAVA和C#的区别及联系
    目录1、RSA语法介绍1.1 C#转JAVA1.2 JAVA转C#首先感谢:http://www.codeproject.com/Articles/25487/Cryptograph...
    99+
    2022-11-12
  • 详解RSA加密算法的原理与Java实现
    目录对称加密和非对称加密RSA加密是什么RSA的加密过程前几天阿粉刚刚说了这个 MD5 加密的前世今生,因为 MD5 也确实用的人不是很多了,阿粉就不再继续的一一赘述了,今天阿粉想给...
    99+
    2022-11-13
    Java RSA加密算法 Java RSA加密 Java RSA
  • 【JAVA】JAVA与C++的区别与联系
    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言两方介绍C++JAVA 不同==|Java不支持指针、模板、指针重载、联合等|====|支持析构函数|====|条件编译和包含|...
    99+
    2023-08-16
    java c++ 开发语言
  • Java与C/C++的区别(转)
    首先应该清楚,Java是由C++发展而来的,它保留了c++的大部分内容,类似于c++,但句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了c++的固有缺陷,而产生的一种...
    99+
    2023-06-03
  • Java类与对象详解(3)
    目录 封装 封装的概念 访问限定符 封装扩展之包 包的概念 导入包中的类 自定义包 基本规则 包的访问权限控制举例 常见的包 static 成员 static 修饰成员变量 static修饰成员方法  static 成员变量的初始化 代码...
    99+
    2023-08-31
    java 开发语言
  • 怎么实现security.js RSA加密与java客户端解密
    本篇文章给大家分享的是有关怎么实现security.js RSA加密与java客户端解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  在通常的http协议的网站中直接提交数...
    99+
    2023-06-02
  • java与c的区别
    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM...
    99+
    2018-11-16
    java入门 java
  • 用C++来解决3*3拼图的问题
    目录解决3*3拼图的问题拼图问题代码纯C语言写的拼图游戏以下正文解决3*3拼图的问题 拼图问题 在3*3的拼图中,如何用最少步骤拼好它,这个问题是一个最短路径问题,可以使用BFS来求...
    99+
    2022-11-13
  • Java与C#的区别是怎样的
    本篇文章给大家分享的是有关Java与C#的区别是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近在学C#,从来没有想过,还会学习C#。在学习C#中,我发现C#真是个好东...
    99+
    2023-06-17
  • Python2与Python 3的对比
    首发 http://www.everlose.info/notes/2013/10/31/difference-between-python3-to-python2/ 这篇文章总结了一些与Python2.6相比Python3.0中的新特性...
    99+
    2023-01-31
    Python
  • 如何在java中使用RSA算法对密码进行加密与解密
    本篇文章给大家分享的是有关如何在java中使用RSA算法对密码进行加密与解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言:  RSA是第一个比较完善的公开密钥算...
    99+
    2023-05-31
    java rsa算法 ava
  • Android Rsa数据加解密的介绍与使用示例
    Rsa加密 RSA是目前最有影响力的公钥加密算法,RSA也是第一个既能用于数据加密也能用于数字签名的算法。该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要...
    99+
    2022-06-06
    示例 rsa Android
  • c#接口与java接口的区别
    接口中定义成员C#,如图我在接口ITest添加了一个字段n,那么vs直接就显示红色的底线,而错误就是接口不能包含字段java,如下图,编译也是报错但是并不是接口中不能包含而是缺少赋值,那么我们赋值一下再看。可以看到没有问题,也就是成员变量默...
    99+
    2016-05-24
    java基础 c# java 接口 区别
  • 3种C# 加载Word的方法
    目录1.加载本地Word2.以只读模式加载Word3.从流加载Word【程序环境】 Windows 10 Visual Studio 2017 Word ...
    99+
    2022-11-12
  • ADO.NET与ORM的比较(3)Lin
    说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具...
    99+
    2023-01-31
    NET ADO Lin
  • 流畅的 Python - 3. 文本与
    对于字符串,我们接触得挺多的。而编码问题,也不时令人头疼的。 由于一开始接触的就是 Python3,所以一些在 Python2 上的编码上的坑我没遇到,甚至在 Python3 上都很少遇到编码问题,因为 Python3 默认的编码是 ut...
    99+
    2023-01-31
    流畅 文本 Python
  • 如何实现Linux下OpenSSL的DSA与RSA非对称加密
    这篇文章主要讲解了“如何实现Linux下OpenSSL的DSA与RSA非对称加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现Linux下OpenSSL的DSA与RSA非对称加密”吧...
    99+
    2023-06-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作