首页 > Web开发 > 详细

.net平台的RSA实现以及与Delphi之间的互操作性

时间:2014-03-19 18:11:35      阅读:1132      评论:0      收藏:0      [点我收藏+]

.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的代码在下面专题中作详细讲解。
   具体源代码如下:

  1bubuko.com,布布扣using System.Text.RegularExpressions;
  2bubuko.com,布布扣using System.Text;
  3bubuko.com,布布扣using System.IO;
  4bubuko.com,布布扣using System.Net;
  5bubuko.com,布布扣using System.Xml;
  6bubuko.com,布布扣using System.Runtime.InteropServices;
  7bubuko.com,布布扣using System;
  8bubuko.com,布布扣using System.Security;
  9bubuko.com,布布扣using System.Security.Cryptography;
 10bubuko.com,布布扣/*
 11bubuko.com,布布扣    RSA Keyinfo:
 12bubuko.com,布布扣    ---------------------------------------------------------------------
 13bubuko.com,布布扣    可以采用java或者.net生成下面参数信息
 14bubuko.com,布布扣    加密位:1024bits
 15bubuko.com,布布扣    >>>PrivateKey:
 16bubuko.com,布布扣    modulus:123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929
 17bubuko.com,布布扣    public exponent:65537
 18bubuko.com,布布扣    private exponent:102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233
 19bubuko.com,布布扣    prime p:12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091
 20bubuko.com,布布扣    prime q:9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219
 21bubuko.com,布布扣    prime exponent p:1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563
 22bubuko.com,布布扣    prime exponent q:769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465
 23bubuko.com,布布扣    crt coefficient:12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785
 24bubuko.com,布布扣    >>>PublicKey:
 25bubuko.com,布布扣    modulus:123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929
 26bubuko.com,布布扣    public exponent:65537
 27bubuko.com,布布扣    */

 28bubuko.com,布布扣
 29bubuko.com,布布扣public class RSATest
 30bubuko.com,布布扣{
 31bubuko.com,布布扣    [DllImport("cmipcrypt.dll")]
 32bubuko.com,布布扣    public static extern String Cmip_Encrypt(String text,String exp,String module);
 33bubuko.com,布布扣
 34bubuko.com,布布扣    [DllImport("cmipcrypt.dll")]
 35bubuko.com,布布扣    public static extern String Cmip_Decrypt(String etext,String d,String module);
 36bubuko.com,布布扣
 37bubuko.com,布布扣    [DllImport("cmipcrypt.dll")]
 38bubuko.com,布布扣    public static extern String Cmip_SignData(String text,String d,String module,String alg);
 39bubuko.com,布布扣
 40bubuko.com,布布扣    [DllImport("cmipcrypt.dll")]
 41bubuko.com,布布扣    public static extern String Cmip_VerifyData(String text,String signtext,String r,String module);
 42bubuko.com,布布扣
 43bubuko.com,布布扣    [DllImport("cmipcrypt.dll")]
 44bubuko.com,布布扣    public static extern String Cmip_ComputeHash(String text,String alg);
 45bubuko.com,布布扣
 46bubuko.com,布布扣    private String p,q,e,n,d,dp,dq,crt;
 47bubuko.com,布布扣    private RSAParameters param;
 48bubuko.com,布布扣
 49bubuko.com,布布扣    public void init(){
 50bubuko.com,布布扣        p="12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091";
 51bubuko.com,布布扣        q="9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219";
 52bubuko.com,布布扣        e="65537";
 53bubuko.com,布布扣        n="123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
 54bubuko.com,布布扣        d="102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
 55bubuko.com,布布扣        dp="1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563";
 56bubuko.com,布布扣        dq="769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465";
 57bubuko.com,布布扣        crt="12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785";
 58bubuko.com,布布扣
 59bubuko.com,布布扣        param=new RSAParameters();
 60bubuko.com,布布扣        byte[] bdata=GetBytes(e);
 61bubuko.com,布布扣        param.Exponent=bdata;
 62bubuko.com,布布扣        param.P=GetBytes(p);
 63bubuko.com,布布扣        param.Q=GetBytes(q);
 64bubuko.com,布布扣        param.Modulus=GetBytes(n);
 65bubuko.com,布布扣        param.D=GetBytes(d);
 66bubuko.com,布布扣        param.DP=GetBytes(dp);
 67bubuko.com,布布扣        param.DQ=GetBytes(dq);
 68bubuko.com,布布扣        param.InverseQ=GetBytes(crt);
 69bubuko.com,布布扣    }

 70bubuko.com,布布扣
 71bubuko.com,布布扣    public static void Main(String[] args)
 72bubuko.com,布布扣    {
 73bubuko.com,布布扣        if(args.Length<2){
 74bubuko.com,布布扣            Console.WriteLine("\nRSATest.exe [text明文] [hash算法]。");
 75bubuko.com,布布扣            return;
 76bubuko.com,布布扣        }

 77bubuko.com,布布扣        RSATest rsa=new RSATest();
 78bubuko.com,布布扣        rsa.init();
 79bubuko.com,布布扣        rsa.DelphiDllTest(args[0],args[1]);
 80bubuko.com,布布扣        rsa.DotnetRSATest(args[0],args[1]);
 81bubuko.com,布布扣        rsa.InteropTest(args[0],args[1]);
 82bubuko.com,布布扣        
 83bubuko.com,布布扣
 84bubuko.com,布布扣
 85bubuko.com,布布扣    }

 86bubuko.com,布布扣    
 87bubuko.com,布布扣    public void DelphiDllTest(String text,String alg){
 88bubuko.com,布布扣        String res=Cmip_Encrypt(text,e,n);
 89bubuko.com,布布扣        Console.WriteLine("=====================Dll调用RSA测试=====================");
 90bubuko.com,布布扣        Console.WriteLine("\n1.明文:"+text);
 91bubuko.com,布布扣        //加密
 92bubuko.com,布布扣        Console.WriteLine("\n2.RSA加密:"+res);    
 93bubuko.com,布布扣        res=Cmip_Decrypt(res,d,n);
 94bubuko.com,布布扣        Console.WriteLine("\n3.RSA解密:"+res);    
 95bubuko.com,布布扣        //签名
 96bubuko.com,布布扣        String signdata=Cmip_SignData(text,d,n,alg);
 97bubuko.com,布布扣        Console.WriteLine("\n4.对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+signdata);    
 98bubuko.com,布布扣        Console.WriteLine("\n5.RSA验证签名:"+Cmip_VerifyData(text,signdata,e,n));    
 99bubuko.com,布布扣
100bubuko.com,布布扣        Console.WriteLine("\n6.采用HASH算法"+alg+"计算明文的结果:"+Cmip_ComputeHash(text,alg));
101bubuko.com,布布扣    }

102bubuko.com,布布扣    //.net只实现了SHA1的rsa签名算法
103bubuko.com,布布扣    public void  DotnetRSATest(String text,String alg){
104bubuko.com,布布扣        Console.WriteLine("\n\n\n=========.net RSACryptoServiceProvider调用RSA测试=========");
105bubuko.com,布布扣        
106bubuko.com,布布扣        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
107bubuko.com,布布扣        rsa.ImportParameters(param);
108bubuko.com,布布扣        RSAParameters param1=rsa.ExportParameters(true);
109bubuko.com,布布扣
110bubuko.com,布布扣        Console.WriteLine("1.明文:"+text);
111bubuko.com,布布扣        byte[] data=Encoding.Default.GetBytes(text);
112bubuko.com,布布扣        byte[] endata=rsa.Encrypt(data,false);
113bubuko.com,布布扣        Console.WriteLine("\n2.publicKey加密后的数据:"+Convert.ToBase64String(endata));
114bubuko.com,布布扣        byte[] dedata=rsa.Decrypt(endata,false);
115bubuko.com,布布扣        Console.WriteLine("\n3.privateKey解密后的数据:"+Encoding.Default.GetString(dedata));
116bubuko.com,布布扣        //签名
117bubuko.com,布布扣        HashAlgorithm hashalg=null;
118bubuko.com,布布扣        switch(alg.ToUpper()){
119bubuko.com,布布扣            case "MD5":
120bubuko.com,布布扣                hashalg=new MD5CryptoServiceProvider();
121bubuko.com,布布扣                break;
122bubuko.com,布布扣            case "SHA1":
123bubuko.com,布布扣                hashalg=new SHA1CryptoServiceProvider (); ;
124bubuko.com,布布扣                break;
125bubuko.com,布布扣            case "SHA256":
126bubuko.com,布布扣                hashalg=new SHA256Managed();
127bubuko.com,布布扣                break;
128bubuko.com,布布扣            case "SHA384":
129bubuko.com,布布扣                hashalg=new SHA384Managed();
130bubuko.com,布布扣                break;
131bubuko.com,布布扣            case "SHA512":
132bubuko.com,布布扣                hashalg=new SHA512Managed();
133bubuko.com,布布扣                break;
134bubuko.com,布布扣            default:
135bubuko.com,布布扣                throw new Exception("不支持的HASH算法:"+alg);
136bubuko.com,布布扣        }

137bubuko.com,布布扣        try{
138bubuko.com,布布扣            byte[] signdata=rsa.SignData(data,hashalg);
139bubuko.com,布布扣            Console.WriteLine("\n4.对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+Convert.ToBase64String(signdata));    
140bubuko.com,布布扣            Console.WriteLine("\n5.RSA验证签名:"+rsa.VerifyData(data,hashalg,signdata));    
141bubuko.com,布布扣        }
catch(CryptographicException ex){
142bubuko.com,布布扣            Console.WriteLine("\n===================================");
143bubuko.com,布布扣            Console.WriteLine("!!!指定的HASH算法在.net中可能未实现!:"+ex.Message+"\n.net可用算法"+rsa.SignatureAlgorithm);
144bubuko.com,布布扣            Console.WriteLine("===================================");
145bubuko.com,布布扣        }

146bubuko.com,布布扣        byte[] hash=hashalg.ComputeHash(data);
147bubuko.com,布布扣        Console.WriteLine("\n6.采用HASH算法"+alg+"计算明文的结果:"+ConvByteArrayToHex(hash));
148bubuko.com,布布扣
149bubuko.com,布布扣
150bubuko.com,布布扣        String res=Cmip_Decrypt(Convert.ToBase64String(endata),d,n);
151bubuko.com,布布扣        Console.WriteLine("\n"+res);
152bubuko.com,布布扣        Console.WriteLine(Encoding.Default.ToString());
153bubuko.com,布布扣
154bubuko.com,布布扣    }

155bubuko.com,布布扣    //dll加密,.net解密
156bubuko.com,布布扣    //dll签名,.net验证
157bubuko.com,布布扣    public void InteropTest(String text,String alg){
158bubuko.com,布布扣        String res=Cmip_Encrypt(text,e,n);
159bubuko.com,布布扣        Console.WriteLine("\n=====================跨语言平台调用RSA测试=====================");
160bubuko.com,布布扣        Console.WriteLine("\n1.明文:"+text);
161bubuko.com,布布扣        //加密
162bubuko.com,布布扣        Console.WriteLine("\n2.DLL RSA加密:"+res);    
163bubuko.com,布布扣        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
164bubuko.com,布布扣        rsa.ImportParameters(param);
165bubuko.com,布布扣        byte[] txdata=rsa.Decrypt(Convert.FromBase64String(res),false);
166bubuko.com,布布扣
167bubuko.com,布布扣        Console.WriteLine("\n3.RSACryptoServiceProvider RSA解密:"+Encoding.Default.GetString(txdata));    
168bubuko.com,布布扣        //dll签名,.net验证
169bubuko.com,布布扣        String signdata=Cmip_SignData(text,d,n,alg);
170bubuko.com,布布扣        Console.WriteLine("\n4.DLL 对明文采用"+alg.Trim()+"withRSA的签名算法,签名数据为:\n"+signdata);    
171bubuko.com,布布扣        //签名
172bubuko.com,布布扣        HashAlgorithm hashalg=null;
173bubuko.com,布布扣        switch(alg.ToUpper()){
174bubuko.com,布布扣            case "MD5":
175bubuko.com,布布扣                hashalg=new MD5CryptoServiceProvider();
176bubuko.com,布布扣                break;
177bubuko.com,布布扣            case "SHA1":
178bubuko.com,布布扣                hashalg=new SHA1CryptoServiceProvider (); ;
179bubuko.com,布布扣                break;
180bubuko.com,布布扣            case "SHA256":
181bubuko.com,布布扣                hashalg=new SHA256Managed();
182bubuko.com,布布扣                break;
183bubuko.com,布布扣            case "SHA384":
184bubuko.com,布布扣                hashalg=new SHA384Managed();
185bubuko.com,布布扣                break;
186bubuko.com,布布扣            case "SHA512":
187bubuko.com,布布扣                hashalg=new SHA512Managed();
188bubuko.com,布布扣                break;
189bubuko.com,布布扣            default:
190bubuko.com,布布扣                throw new Exception("不支持的HASH算法:"+alg);
191bubuko.com,布布扣        }

192bubuko.com,布布扣        try{
193bubuko.com,布布扣            Console.WriteLine("\n5.RSACryptoServiceProvider RSA验证签名:"+rsa.VerifyData(Encoding.Default.GetBytes(text),hashalg,Convert.FromBase64String(signdata)));    
194bubuko.com,布布扣        }
catch(CryptographicException ex){
195bubuko.com,布布扣            Console.WriteLine("\n===================================");
196bubuko.com,布布扣            Console.WriteLine("!!!指定的HASH算法在.net中可能未实现!:"+ex.Message+"\n.net可用算法"+rsa.SignatureAlgorithm);
197bubuko.com,布布扣            Console.WriteLine("===================================");
198bubuko.com,布布扣        }

199bubuko.com,布布扣    }

200bubuko.com,布布扣
201bubuko.com,布布扣    public static byte[] GetBytes(String num){
202bubuko.com,布布扣        BigInteger n=new BigInteger(num,10);
203bubuko.com,布布扣        String s=n.ToString(2);
204bubuko.com,布布扣        if(s.Length%8>0){
205bubuko.com,布布扣            s=new String(‘0‘,8-s.Length%8)+s;
206bubuko.com,布布扣        }

207bubuko.com,布布扣        byte[] data=new byte[s.Length/8];
208bubuko.com,布布扣        String ocetstr;
209bubuko.com,布布扣        for(int i=0;i<data.Length;i++){
210bubuko.com,布布扣            ocetstr=s.Substring(8*i,8);
211bubuko.com,布布扣            data[i]=Convert.ToByte(ocetstr , 2 ) ;
212bubuko.com,布布扣        }

213bubuko.com,布布扣        return data;
214bubuko.com,布布扣    }

215bubuko.com,布布扣
216bubuko.com,布布扣    public String ConvByteArrayToHex(byte[] data){
217bubuko.com,布布扣        String s="";
218bubuko.com,布布扣        for(int i=0;i<data.Length;i++){
219bubuko.com,布布扣            s+=Convert.ToString(data[i],16);
220bubuko.com,布布扣        }

221bubuko.com,布布扣        return s.ToUpper();
222bubuko.com,布布扣    }

223bubuko.com,布布扣
224bubuko.com,布布扣
225bubuko.com,布布扣}


运行结果如下:

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之间的互操作性,布布扣,bubuko.com

.net平台的RSA实现以及与Delphi之间的互操作性

原文:http://www.cnblogs.com/adylee/p/3611772.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!