.net平台下面的RSA算法实现是RSACryptoServiceProvider,如果安装了 Microsoft Enhanced Cryptographic Provider,则 RSACryptoServiceProvider 支持长度从 384 位至 16384 位(增量为 8 位)的密钥。如果安装了 Microsoft Base Cryptographic Provider,则支持长度从 384 位至 512 位(增量为 8 位)的密钥。
   目前该算法支持的填充Padding算法为PKCS#1 1.5和OAEPPadding,而签名算法目前仅支持SHA1withRSA算法,其他的好像没有提供,或许需要安装其他provider,目前第三方的provider可以使用Bouncy Castle的C#实现http://www.bouncycastle.org/csharp/,使用Bouncy Castle的包可以实现
RIPEMD128、RIPEMD160、RIPEMD256、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、MD2,MD4,MD5等HASH算法与RSA的集成签名算法。
为了更好的处理BigInteger运算的问题,在本文中用到了http://www.codeproject.com/csharp/biginteger.asp提供的BigInteger.cs用来处理大数运算的问题,用来验证的DLL实用delphi实现的,当然也可以用java来验证,效果相同,该DLL的代码在下面专题中作详细讲解。
   具体源代码如下:

  1using System.Text.RegularExpressions;
  2using System.Text;
  3using System.IO;
  4using System.Net;
  5using System.Xml;
  6using System.Runtime.InteropServices;
  7using System;
  8using System.Security;
  9using System.Security.Cryptography;
 10/*
 11    RSA Keyinfo:
 12    ---------------------------------------------------------------------
 13    可以采用java或者.net生成下面参数信息
 14    加密位:1024bits
 15    >>>PrivateKey:
 16    modulus:123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929
 17    public exponent:65537
 18    private exponent:102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233
 19    prime p:12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091
 20    prime q:9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219
 21    prime exponent p:1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563
 22    prime exponent q:769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465
 23    crt coefficient:12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785
 24    >>>PublicKey:
 25    modulus:123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929
 26    public exponent:65537
 27    */
 28
 29public class RSATest
 30{
 31    [DllImport("cmipcrypt.dll")]
 32    public static extern String Cmip_Encrypt(String text,String exp,String module);
 33
 34    [DllImport("cmipcrypt.dll")]
 35    public static extern String Cmip_Decrypt(String etext,String d,String module);
 36
 37    [DllImport("cmipcrypt.dll")]
 38    public static extern String Cmip_SignData(String text,String d,String module,String alg);
 39
 40    [DllImport("cmipcrypt.dll")]
 41    public static extern String Cmip_VerifyData(String text,String signtext,String r,String module);
 42
 43    [DllImport("cmipcrypt.dll")]
 44    public static extern String Cmip_ComputeHash(String text,String alg);
 45
 46    private String p,q,e,n,d,dp,dq,crt;
 47    private RSAParameters param;
 48
 49    public void init(){
 50        p="12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091";
 51        q="9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219";
 52        e="65537";
 53        n="123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
 54        d="102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
 55        dp="1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563";
 56        dq="769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465";
 57        crt="12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785";
 58
 59        param=new RSAParameters();
 60        byte[] bdata=GetBytes(e);
 61        param.Exponent=bdata;
 62        param.P=GetBytes(p);
 63        param.Q=GetBytes(q);
 64        param.Modulus=GetBytes(n);
 65        param.D=GetBytes(d);
 66        param.DP=GetBytes(dp);
 67        param.DQ=GetBytes(dq);
 68        param.InverseQ=GetBytes(crt);
 69    }
 70
 71    public static void Main(String[] args)
 72    {
 73        if(args.Length<2){
 74            Console.WriteLine("\nRSATest.exe [text明文] [hash算法]。");
 75            return;
 76        }
 77        RSATest rsa=new RSATest();
 78        rsa.init();
 79        rsa.DelphiDllTest(args[0],args[1]);
 80        rsa.DotnetRSATest(args[0],args[1]);
 81        rsa.InteropTest(args[0],args[1]);
 82        
 83
 84
 85    }
 86    
 87    public void DelphiDllTest(String text,String alg){
 88        String res=Cmip_Encrypt(text,e,n);
 89        Console.WriteLine("=====================Dll调用RSA测试=====================");
 90        Console.WriteLine("\n1.明文:"+text);
 91        //加密
 92        Console.WriteLine("\n2.RSA加密:"+res);    
 93        res=Cmip_Decrypt(res,d,n);
 94        Console.WriteLine("\n3.RSA解密:"+res);    
 95        //签名
 96        String signdata=Cmip_SignData(text,d,n,alg);
 97        Console.WriteLine("\n4.对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+signdata);    
 98        Console.WriteLine("\n5.RSA验证签名:"+Cmip_VerifyData(text,signdata,e,n));    
 99
100        Console.WriteLine("\n6.采用HASH算法"+alg+"计算明文的结果:"+Cmip_ComputeHash(text,alg));
101    }
102    //.net只实现了SHA1的rsa签名算法
103    public void  DotnetRSATest(String text,String alg){
104        Console.WriteLine("\n\n\n=========.net RSACryptoServiceProvider调用RSA测试=========");
105        
106        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
107        rsa.ImportParameters(param);
108        RSAParameters param1=rsa.ExportParameters(true);
109
110        Console.WriteLine("1.明文:"+text);
111        byte[] data=Encoding.Default.GetBytes(text);
112        byte[] endata=rsa.Encrypt(data,false);
113        Console.WriteLine("\n2.publicKey加密后的数据:"+Convert.ToBase64String(endata));
114        byte[] dedata=rsa.Decrypt(endata,false);
115        Console.WriteLine("\n3.privateKey解密后的数据:"+Encoding.Default.GetString(dedata));
116        //签名
117        HashAlgorithm hashalg=null;
118        switch(alg.ToUpper()){
119            case "MD5":
120                hashalg=new MD5CryptoServiceProvider();
121                break;
122            case "SHA1":
123                hashalg=new SHA1CryptoServiceProvider (); ;
124                break;
125            case "SHA256":
126                hashalg=new SHA256Managed();
127                break;
128            case "SHA384":
129                hashalg=new SHA384Managed();
130                break;
131            case "SHA512":
132                hashalg=new SHA512Managed();
133                break;
134            default:
135                throw new Exception("不支持的HASH算法:"+alg);
136        }
137        try{
138            byte[] signdata=rsa.SignData(data,hashalg);
139            Console.WriteLine("\n4.对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+Convert.ToBase64String(signdata));    
140            Console.WriteLine("\n5.RSA验证签名:"+rsa.VerifyData(data,hashalg,signdata));    
141        }catch(CryptographicException ex){
142            Console.WriteLine("\n===================================");
143            Console.WriteLine("!!!指定的HASH算法在.net中可能未实现!:"+ex.Message+"\n.net可用算法"+rsa.SignatureAlgorithm);
144            Console.WriteLine("===================================");
145        }
146        byte[] hash=hashalg.ComputeHash(data);
147        Console.WriteLine("\n6.采用HASH算法"+alg+"计算明文的结果:"+ConvByteArrayToHex(hash));
148
149
150        String res=Cmip_Decrypt(Convert.ToBase64String(endata),d,n);
151        Console.WriteLine("\n"+res);
152        Console.WriteLine(Encoding.Default.ToString());
153
154    }
155    //dll加密,.net解密
156    //dll签名,.net验证
157    public void InteropTest(String text,String alg){
158        String res=Cmip_Encrypt(text,e,n);
159        Console.WriteLine("\n=====================跨语言平台调用RSA测试=====================");
160        Console.WriteLine("\n1.明文:"+text);
161        //加密
162        Console.WriteLine("\n2.DLL RSA加密:"+res);    
163        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
164        rsa.ImportParameters(param);
165        byte[] txdata=rsa.Decrypt(Convert.FromBase64String(res),false);
166
167        Console.WriteLine("\n3.RSACryptoServiceProvider RSA解密:"+Encoding.Default.GetString(txdata));    
168        //dll签名,.net验证
169        String signdata=Cmip_SignData(text,d,n,alg);
170        Console.WriteLine("\n4.DLL 对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+signdata);    
171        //签名
172        HashAlgorithm hashalg=null;
173        switch(alg.ToUpper()){
174            case "MD5":
175                hashalg=new MD5CryptoServiceProvider();
176                break;
177            case "SHA1":
178                hashalg=new SHA1CryptoServiceProvider (); ;
179                break;
180            case "SHA256":
181                hashalg=new SHA256Managed();
182                break;
183            case "SHA384":
184                hashalg=new SHA384Managed();
185                break;
186            case "SHA512":
187                hashalg=new SHA512Managed();
188                break;
189            default:
190                throw new Exception("不支持的HASH算法:"+alg);
191        }
192        try{
193            Console.WriteLine("\n5.RSACryptoServiceProvider RSA验证签名:"+rsa.VerifyData(Encoding.Default.GetBytes(text),hashalg,Convert.FromBase64String(signdata)));    
194        }catch(CryptographicException ex){
195            Console.WriteLine("\n===================================");
196            Console.WriteLine("!!!指定的HASH算法在.net中可能未实现!:"+ex.Message+"\n.net可用算法"+rsa.SignatureAlgorithm);
197            Console.WriteLine("===================================");
198        }
199    }
200
201    public static byte[] GetBytes(String num){
202        BigInteger n=new BigInteger(num,10);
203        String s=n.ToString(2);
204        if(s.Length%8>0){
205            s=new String('0',8-s.Length%8)+s;
206        }
207        byte[] data=new byte[s.Length/8];
208        String ocetstr;
209        for(int i=0;i<data.Length;i++){
210            ocetstr=s.Substring(8*i,8);
211            data[i]=Convert.ToByte(ocetstr , 2 ) ;
212        }
213        return data;
214    }
215
216    public String ConvByteArrayToHex(byte[] data){
217        String s="";
218        for(int i=0;i<data.Length;i++){
219            s+=Convert.ToString(data[i],16);
220        }
221        return s.ToUpper();
222    }
223
224
225}

运行结果如下:

d:\>rsatest hello加密 sha1
=====================Dll调用RSA测试=====================

1.明文:hello加密

2.RSA加密:A/0ZWckK9C6JyTk8NmwESVSI/N8OyQ7nYBEK8cpzo30nHj+Pb0WfvQ+lFa38Xk3cd+d8ueysTSc7tqr4Wjk831d0MexAC2yJ4SkqLWfKnhuU0OxF6d4s8UpegvuMBy1KWpzovbFGa3HUGRmMVbu4GqPDdzkvFmfWzGArXXiDpVw=

3.RSA解密:hello加密

4.对明文采用sha1withRSA的签名算法,签名数据为:
iz5J3e3H9NhHhs0qV7GlAODemWR8k7lhubqQJ+rdWl00ekOXu1EgULmeqalfip/3G98+X2eQyJ37bTjSpZ2oW4sIDYDJ3tHaaqooLtS6Iz8GWND+52YDZFLX8t+Yure5+tn2e1C9R181RnZfKt9dKQ2vpw0H6KqXNRwbmQJLynY=

5.RSA验证签名:true

6.采用HASH算法sha1计算明文的结果:C3F118FF24E166AC977EC9C3D69A5AF8B7C78F8B

=========.net RSACryptoServiceProvider调用RSA测试=========

1.明文:hello加密

2.publicKey加密后的数据:NrW/Uwjd72SduBgQkOFjjtEibTX/+WOCV0/oIFMiEln5uhLZ5OaH6cyWPEXBEwjZIiUY78dmdk8BW6SmiDArNwFePf/tM7KCAcSU9Zz3PGl07ZDmvT1P8F24caKaX9+fGwy72mOtoBhFnKh18oOjq4wZ06e1g8IQQQco9W+kHgU=

3.privateKey解密后的数据:hello加密

4.对明文采用sha1withRSA的签名算法,签名数据为:
iz5J3e3H9NhHhs0qV7GlAODemWR8k7lhubqQJ+rdWl00ekOXu1EgULmeqalfip/3G98+X2eQyJ37bTjSpZ2oW4sIDYDJ3tHaaqooLtS6Iz8GWND+52YDZFLX8t+Yure5+tn2e1C9R181RnZfKt9dKQ2vpw0H6KqXNRwbmQJLynY=

5.RSA验证签名:True

6.采用HASH算法sha1计算明文的结果:C3F118FF24E166AC977EC9C3D69A5AF8B7C78F8B

hello加密

System.Text.DBCSCodePageEncoding

=====================跨语言平台调用RSA测试=====================

1.明文:hello加密

2.DLL RSA加密:P/AP7Iwv7pYxh+T1a/PZ4UBCZABu7zPpNt65W5ncNfo8eVQbH8jlH/Jv+fGa0x4CCmRUaTA0O1HeO4LowRpFyPJkwLxQAsMedvfRcQ7Ro2Hggoz5uwRG6QZ2go0Io0KAOGhcV4efKHFG2xro4jYX2O2hWyHTeMldDQPxt98z2co=

3.RSACryptoServiceProvider RSA解密:hello加密

4.DLL 对明文采用sha1withRSA的签名算法,签名数据为:
iz5J3e3H9NhHhs0qV7GlAODemWR8k7lhubqQJ+rdWl00ekOXu1EgULmeqalfip/3G98+X2eQyJ37bTjSpZ2oW4sIDYDJ3tHaaqooLtS6Iz8GWND+52YDZFLX8t+Yure5+tn2e1C9R181RnZfKt9dKQ2vpw0H6KqXNRwbmQJLynY=

5.RSACryptoServiceProvider RSA验证签名:True

有关程序下载:
http://files.cnblogs.com/midea0978/rsa.net.rar

附注:对于这个RSA的跨平台技术,已经是07年研究的结果,后来就没怎么深入了,目前本人已经在一个项目中使用这方面该技术,应用在delphi,powerbuilder,J2EE复合环境中。对于这方面的详细源代码或者技术支持感兴趣的话,如能提供一定报酬的基础上,可使用站内消息联系博主转让!

当然如果免费使用的话,附件中的cmipcrypt.dll是没有任何限制,随便使用。

.net平台的RSA实现以及与Delphi之间的互操作性的更多相关文章

  1. 支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对

    进入到第一次配置支付宝支付服务了 配置支付宝服务,需要去支付宝的开放平台申请服务 需要设置一些参数 其中需要在后台设置配置RSA(SHA1)密钥(公钥(注意这个子读"yao")) ...

  2. BUUCTF平台:RSA

    RSA import gmpy2 def Decrypt(c,e,p,q): L=(p-1)*(q-1) d=gmpy2.invert(e,L) n=p*q m=gmpy2.powmod(c,d,n) ...

  3. php 、asp、 java、 c#、 delphi之间的语言对照

    PHP是一种跨平台的server端的嵌入式脚本语言.它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发人员能够高速地写出动态产生页面. 它支持眼下绝大多数数据库. 另 ...

  4. RSA密钥,JAVA与.NET之间转换

    最近在做银联的一个接口,用到RSA签名,悲剧来了,.net用的RSA密钥格式和JAVA用的不一样 .net为XML格式 <RSAKeyValue><Modulus>53Knuj ...

  5. 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)

    摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...

  6. 支付宝RSA签名之Delphi实现

    Delphi有个很大的问题就是,厂商的不作为(没有封装标准的Cipher类库),让大家自己造轮子. 今天的轮子就是RSA签名,由于Delphi没有封装Cipher类库,所以只的自己写了. 因为要在Fi ...

  7. Delphi RSA加解密【 (RSA公钥加密,私钥解密)、(RSA私钥加密,公钥解密)、MD5加密、SHA加密】

    作者QQ:(648437169) 点击下载➨delphi RSA加解密 [Delphi RSA加解密]支持 (RSA公钥加密,私钥解密).(RSA私钥加密,公钥解密).MD5加密.SHA1加密.SHA ...

  8. DELPHI支付宝支付代码

    真实业务场景的考虑 按照支付宝或者微信支付的开发手册的说法,一个标准的客户端接入支付业务模型应该是这样的,我忽略时序图,只用文字描述: 用户登录客户端,选择商品,然后点击客户端支付. 客户端收集商品信 ...

  9. 教程-Delphi第三方控件安装卸载指南

    1 只有一个DCU文件的组件.DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误.也正是因为没有源 ...

随机推荐

  1. 分布式消息队列kafka系列介绍 — 核心API介绍及实例

    原文地址:http://www.inter12.org/archives/834 一 PRODUCER的API 1.Producer的创建,依赖于ProducerConfig public Produ ...

  2. Iptables 规则 一些简单实例和详细介绍

    设定规则 iptables -p INPUT DROP iptables -p OUTPUT ACCEPT iptables -p FORWARD DROP 1.防止外网用内网IP欺骗 iptable ...

  3. PAT (Basic Level) Practise:1029. 旧键盘

    [题目链接] 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的 ...

  4. java 中的几种 "通用方法“

    前言 Java中,除了基本的数值类型,其他所有数据类型(包括数组)都是对象. 而Object这个类是所有类的超类,它提供的方法,自然能够使用于它的所有子类(所有非基本数值类型). 本文介绍了Objec ...

  5. 书评<<剑指offer 名企面试官精讲典型编程题>>

      前前后后阅读了一周, 感慨很多, 面试考察的是一个人的综合能力, 这一点从面试官的角度去解读, 确实对面试的理解更立体. *) 具体考察的点1) 扎实的基础2) 高质量的代码3) 清晰的思路4) ...

  6. css ul li 水平布局问题

    可以有俩种方法,暂时只用float:left:   找到每一个li进行水平浮动 #hd_nav li{ border-right: 1px solid rgba(255,255,255,0.2); f ...

  7. my Style

    1. box-sizing语法: box-sizing : content-box || border-box || inherit 参数取值: content-box:此值为其默认值,其让元素维持W ...

  8. JS初学之-自定义属性(索引值)

    重点:1.添加索引值的作用:建立匹配.对应的关系. 比如:使每一个按钮对应数组里的每一张图,arrImg[this.index]. 2.不要在for循环的函数里面使用i. 3.添加索引值的方法aBtn ...

  9. JAG Practice Contest for ACM-ICPC Asia Regional 2016

    2016弱校联盟十一专场10.3 传送门 B. Help the Princess! 计算皇后和士兵谁先到达出口即可. C. We don't wanna work! 两个优先队列维护工作中积极性最小 ...

  10. 【BZOJ1011】【HNOI2008】遥远的行星

    奇奇怪怪突然出戏的奇葩题 原题: 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小 ...