分享

C#与JAVA平台RSA算法交互示例

 时间要去哪 2014-07-02
算法:RSA/ECB/PKCS1Padding
========================java==========================================================
import org.junit.Test;
 import sun.misc.BASE64Decoder;
 import sun.misc.BASE64Encoder;
 
 import javax.crypto.Cipher;
 import java.io.IOException;
 import java.math.BigInteger;
 import java.security.KeyFactory;
 import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.spec.RSAPrivateKeySpec;
 import java.security.spec.RSAPublicKeySpec;
 

 public class RSATest {
     String e = "65537";
     String n = "123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
     String d = "102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
 
     @Test
     public void testDecrypt() {
         BigInteger bn = new BigInteger(n);
         BigInteger be = new BigInteger(e);
         BigInteger bd = new BigInteger(d);
         RSAPublicKeySpec pub = new RSAPublicKeySpec(bn, be);
         RSAPrivateKeySpec prv = new RSAPrivateKeySpec(bn, bd);
         try {
             KeyFactory kf = KeyFactory.getInstance("RSA");
             PublicKey pubkey = kf.generatePublic(pub);
             PrivateKey prvkey = kf.generatePrivate(prv);
             Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
             //加密
             rsa.init(Cipher.ENCRYPT_MODE, pubkey);
             String txt = "Welcome,RSA!from 博客园";
             byte[] encdata = rsa.doFinal(txt.getBytes());
             System.out.printf("RSA加密:\n明文:%s\n密文:%s\n", txt, convertToBase64(encdata));
             //解密
             rsa.init(Cipher.DECRYPT_MODE, prvkey);
             rsa.update(encdata);
             byte[] res = rsa.doFinal();
             System.out.printf("解密:%s", new String(res));
         } catch (Exception e1) {
             e1.printStackTrace();
         }
     }
 
     public byte[] convertFromBase64(String s) throws IOException {
         s = s.replaceAll("\\\\n", "\n");
         BASE64Decoder decoder = new BASE64Decoder();
         return decoder.decodeBuffer(s);
     }
 
     public String convertToBase64(byte[] data) {
         BASE64Encoder encoder = new BASE64Encoder();
         return encoder.encode(data);
     }
 
 
 }
========================================c#=======================================
using System.Text.RegularExpressions;
 using System.Text;
 using System.IO;
 using System.Net;
 using System.Xml;
 using System.Runtime.InteropServices;
 using System;
 using System.Security;
 using System.Security.Cryptography;
 public class RSATestForJava
 {
     private String p,q,e,n,d,dp,dq,crt;
     private RSAParameters param;
     public void Init(){
         p="12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091";
         q="9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219";
         e="65537";
         n="123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
         d="102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
         dp="1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563";
         dq="769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465";
         crt="12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785";
 
         param=new RSAParameters();
         byte[] bdata=GetBytes(e);
         param.Exponent=bdata;
         param.P=GetBytes(p);
         param.Q=GetBytes(q);
         param.Modulus=GetBytes(n);
         param.D=GetBytes(d);
         param.DP=GetBytes(dp);
         param.DQ=GetBytes(dq);
         param.InverseQ=GetBytes(crt);
     }
     public void DoTest(){
         RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
         rsa.ImportParameters(param);
         String edata="E3F+Qwyk8MJkHv7zEOb4Fdg0CX4pQOKghyOmMew8jPDUbxNJhDSlV/aS5nnVuiEtkWU1BmCrPSEi";
         edata+="swhuEjC7eRJnq5pEkyf0GILHFNkuoqD1o4FjKnl/oTXg83wn5JDgi5Bog5lJM8YcQcExEMsH9IF+";
         edata+="gbeq6rWYrbb4Qj2oM8c=";
         //解密JAVA加密的数据
         Byte[] encdata=Convert.FromBase64String(edata);
         byte[] dedata=rsa.Decrypt(encdata,false);
         Console.WriteLine("\n解密JAVA加密的数据:"+Encoding.Default.GetString(dedata));
     }
     public static void Main(String[] args)
     {
         RSATestForJava obj=new RSATestForJava();
         obj.Init();
         obj.DoTest();
     }
     public static byte[] GetBytes(String num){
         BigInteger n=new BigInteger(num,10);
         String s=n.ToString(2);
         if(s.Length%8>0){
             s=new String('0',8-s.Length%8)+s;
         }
         byte[] data=new byte[s.Length/8];
         String ocetstr;
         for(int i=0;i<data.Length;i++){
             ocetstr=s.Substring(8*i,8);
             data[i]=Convert.ToByte(ocetstr , 2 ) ;
         }
         return data;
     }
 
     public String ConvByteArrayToHex(byte[] data){
         String s="";
         for(int i=0;i<data.Length;i++){
             s+=Convert.ToString(data[i],16);
         }
         return s.ToUpper();
     }
 
 
 }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多