zoukankan      html  css  js  c++  java
  • C#与JAVA平台RSA算法交互示例

    很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的。之前也有博友私信请教这方面的问题,现在放出一个demo实现:

    一、概述

    算法:RSA/ECB/PKCS1Padding

    RSA KEY:为了便于演示,使用http://www.cnblogs.com/midea0978/articles/768824.html中的Key

    代码:C# & JAVA

    二、JAVA平台

    复制代码
     1 import org.junit.Test;
     2 import sun.misc.BASE64Decoder;
     3 import sun.misc.BASE64Encoder;
     4 
     5 import javax.crypto.Cipher;
     6 import java.io.IOException;
     7 import java.math.BigInteger;
     8 import java.security.KeyFactory;
     9 import java.security.PrivateKey;
    10 import java.security.PublicKey;
    11 import java.security.spec.RSAPrivateKeySpec;
    12 import java.security.spec.RSAPublicKeySpec;
    13 
    14 /**
    15  * 基于.net的PKCS1Padding加密信息的JAVA解密交互操作
    16  * 参考:http://www.cnblogs.com/midea0978/articles/768824.html
    17  * User: midea0978
    18  * Date: 11-12-10 上午10:51
    19  */
    20 public class RSATest {
    21     String e = "65537";
    22     String n = "123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
    23     String d = "102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
    24 
    25     @Test
    26     public void testDecrypt() {
    27         BigInteger bn = new BigInteger(n);
    28         BigInteger be = new BigInteger(e);
    29         BigInteger bd = new BigInteger(d);
    30         RSAPublicKeySpec pub = new RSAPublicKeySpec(bn, be);
    31         RSAPrivateKeySpec prv = new RSAPrivateKeySpec(bn, bd);
    32         try {
    33             KeyFactory kf = KeyFactory.getInstance("RSA");
    34             PublicKey pubkey = kf.generatePublic(pub);
    35             PrivateKey prvkey = kf.generatePrivate(prv);
    36             Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    37             //加密
    38             rsa.init(Cipher.ENCRYPT_MODE, pubkey);
    39             String txt = "Welcome,RSA!from 博客园";
    40             byte[] encdata = rsa.doFinal(txt.getBytes());
    41             System.out.printf("RSA加密: 明文:%s 密文:%s ", txt, convertToBase64(encdata));
    42             //解密
    43             rsa.init(Cipher.DECRYPT_MODE, prvkey);
    44             rsa.update(encdata);
    45             byte[] res = rsa.doFinal();
    46             System.out.printf("解密:%s", new String(res));
    47         } catch (Exception e1) {
    48             e1.printStackTrace();
    49         }
    50     }
    51 
    52     public byte[] convertFromBase64(String s) throws IOException {
    53         s = s.replaceAll("\\n", " ");
    54         BASE64Decoder decoder = new BASE64Decoder();
    55         return decoder.decodeBuffer(s);
    56     }
    57 
    58     public String convertToBase64(byte[] data) {
    59         BASE64Encoder encoder = new BASE64Encoder();
    60         return encoder.encode(data);
    61     }
    62 
    63 
    64 }
    复制代码

    运行结果:

    RSA加密:
    明文:Welcome,RSA!from 博客园
    密文:E3F+Qwyk8MJkHv7zEOb4Fdg0CX4pQOKghyOmMew8jPDUbxNJhDSlV/aS5nnVuiEtkWU1BmCrPSEi
    swhuEjC7eRJnq5pEkyf0GILHFNkuoqD1o4FjKnl/oTXg83wn5JDgi5Bog5lJM8YcQcExEMsH9IF+
    gbeq6rWYrbb4Qj2oM8c=
    解密:Welcome,RSA!from 博客园

     三:C#解密

    将上面JAVA加密的信息加入到程序中解密:

    复制代码
     1 using System.Text.RegularExpressions;
     2 using System.Text;
     3 using System.IO;
     4 using System.Net;
     5 using System.Xml;
     6 using System.Runtime.InteropServices;
     7 using System;
     8 using System.Security;
     9 using System.Security.Cryptography;
    10 public class RSATestForJava
    11 {
    12     private String p,q,e,n,d,dp,dq,crt;
    13     private RSAParameters param;
    14     public void Init(){
    15         p="12794390226544301614076650435602993036558056678553112540698297249963365434628505393116653422818365344228379828231764392521731584684435248093787027949139091";
    16         q="9645694015283940797244851561543569992525098416055322825220116046655435860727361740896753161534492415500799272063647633894112205918420307541634544631799219";
    17         e="65537";
    18         n="123410773237385713572440712840019405878257600213906351775134402766524785605776353635515879438375969303333340691224323217379791619946464100287854264933660919378485000299257054039555887477610831829409144592603086784397675690934246422666689022312589317493002336070775714030955737435316659994026756956753416169929";
    19         d="102299672961750099570264341757280532275542401837445663770632643616494888426681205847125069294737520917541038900032845310395266178574112466427178094767628391398378924953787043659322148498169017989730953803803890989295625028193153480552247210183981959942844345362118479513739632952091865360095551345350474614233";
    20         dp="1529969882744521289493243655703200580244831014386083326692594344385048063096931454992679141166478923397741927672190328275520857365639547725880173612423563";
    21         dq="769453717928871362558494956494038236735297839680443531596667023084892788499361386413907037681040120057954721673997128797449053397950796768659923391901465";
    22         crt="12583540851660819630796910273258143748946857763306703439274571717196507402536398234616014735603915981141807543055250658251670340810611251684169356826070785";
    23 
    24         param=new RSAParameters();
    25         byte[] bdata=GetBytes(e);
    26         param.Exponent=bdata;
    27         param.P=GetBytes(p);
    28         param.Q=GetBytes(q);
    29         param.Modulus=GetBytes(n);
    30         param.D=GetBytes(d);
    31         param.DP=GetBytes(dp);
    32         param.DQ=GetBytes(dq);
    33         param.InverseQ=GetBytes(crt);
    34     }
    35     public void DoTest(){
    36         RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    37         rsa.ImportParameters(param);
    38         String edata="E3F+Qwyk8MJkHv7zEOb4Fdg0CX4pQOKghyOmMew8jPDUbxNJhDSlV/aS5nnVuiEtkWU1BmCrPSEi";
    39         edata+="swhuEjC7eRJnq5pEkyf0GILHFNkuoqD1o4FjKnl/oTXg83wn5JDgi5Bog5lJM8YcQcExEMsH9IF+";
    40         edata+="gbeq6rWYrbb4Qj2oM8c=";
    41         //解密JAVA加密的数据
    42         Byte[] encdata=Convert.FromBase64String(edata);
    43         byte[] dedata=rsa.Decrypt(encdata,false);
    44         Console.WriteLine(" 解密JAVA加密的数据:"+Encoding.Default.GetString(dedata));
    45     }
    46     public static void Main(String[] args)
    47     {
    48         RSATestForJava obj=new RSATestForJava();
    49         obj.Init();
    50         obj.DoTest();
    51     }
    52     public static byte[] GetBytes(String num){
    53         BigInteger n=new BigInteger(num,10);
    54         String s=n.ToString(2);
    55         if(s.Length%8>0){
    56             s=new String('0',8-s.Length%8)+s;
    57         }
    58         byte[] data=new byte[s.Length/8];
    59         String ocetstr;
    60         for(int i=0;i<data.Length;i++){
    61             ocetstr=s.Substring(8*i,8);
    62             data[i]=Convert.ToByte(ocetstr , 2 ) ;
    63         }
    64         return data;
    65     }
    66 
    67     public String ConvByteArrayToHex(byte[] data){
    68         String s="";
    69         for(int i=0;i<data.Length;i++){
    70             s+=Convert.ToString(data[i],16);
    71         }
    72         return s.ToUpper();
    73     }
    74 
    75 
    76 }
    复制代码

    编译运行结果:

    D:allproject sa.net>csc RSATestForJava.cs BigInteger.cs
    Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.3053
    for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
    Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


    D:allproject sa.net>RSATestForJava

    解密JAVA加密的数据:Welcome,RSA!from 博客园

    D:allproject sa.net>

    C#代码下载:RSAtestForJava.rar

    达成交互效果!

  • 相关阅读:
    Windows 10 IoT Core 17101 for Insider 版本更新
    Windows 10 IoT Core 17093 for Insider 版本更新
    Windows 10 IoT Serials 10 – 如何使用OCR引擎进行文字识别
    2017年全国大学生物联网设计竞赛(TI杯)华东分赛区决赛总结
    Windows 10 IoT Core 17083 for Insider 版本更新
    My Feedback for Windows 10 IoT Core on Feedback Hub App (4/1/2017-1/23/2018)
    为 Azure IoT Edge 设备部署 Azure Stream Analytics 服务
    Azure IoT Edge on Raspberry Pi 3 with Raspbian
    Azure IoT Edge on Windows 10 IoT Core
    Mixed Reality-宁波市VR/AR技术应用高研班总结
  • 原文地址:https://www.cnblogs.com/adylee/p/3611769.html
Copyright © 2011-2022 走看看