日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Java间进行RSA加密解密交互(二)

發布時間:2023/11/29 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Java间进行RSA加密解密交互(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接著前面一篇文章C# Java間進行RSA加密解密交互,繼續探討這個問題。

在前面,雖然已經實現了C# Java間進行RSA加密解密交互,但是還是與項目中要求的有所出入。在項目中,客戶端(Java)的加密是通過這么一個方法實現的:

?

[java]?view plain?copy
  • /**?
  • ?*?RSA加密?
  • ?*?@param?text--待加密的明文?
  • ?*?@param?key--公鑰,由服務器端提供的經base64編碼的字符串?
  • ?*?@return?
  • ?*/??
  • public?static?String?RSAEncryptoWithPublicKey(String?text,?String?key)?{??
  • ????String?result?=?null;??
  • ????try?{??
  • ????????byte[]?publicKeyByte?=?base64Decrypto(key);??
  • ??
  • ????????X509EncodedKeySpec?x509?=?new?X509EncodedKeySpec(publicKeyByte);??
  • ????????KeyFactory?keyFactory?=?KeyFactory.getInstance("RSA");??
  • ????????PublicKey?publicKey?=?keyFactory.generatePublic(x509);??
  • ??
  • ????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());??
  • ????????cipher.init(Cipher.ENCRYPT_MODE,?publicKey);??
  • ??
  • ????????result?=?base64Encrypto(cipher.doFinal(text.getBytes()));??
  • ????}?catch?(Exception?e)?{??
  • ????????e.printStackTrace();??
  • ????????return?null;??
  • ????}??
  • ????return?result;??
  • }??

  • 在上一篇中的實現,需要客戶端先做一次解析工作,而已經開發好的客戶端是沒有這一層的,所以得想個辦法,在服務器端(C#)完成這項工作。但是經過多次嘗試,依然未果。于是換一種方式,密鑰對不由C#提供,而轉而有Java提供,生成客戶端需要的公鑰形式,并解析公鑰私鑰,組裝C# 的XML格式的密鑰對字符串。

    ?

    下面貼一下RSA密鑰對生成代碼(參考RSA的密鑰把JAVA格式轉換成C#的格式)

    ?

    [java]?view plain?copy
  • import?java.io.UnsupportedEncodingException;??
  • import?java.lang.reflect.Method;??
  • import?java.security.KeyFactory;??
  • import?java.security.KeyPair;??
  • import?java.security.KeyPairGenerator;??
  • import?java.security.NoSuchAlgorithmException;??
  • import?java.security.PublicKey;??
  • import?java.security.interfaces.RSAPrivateCrtKey;??
  • import?java.security.interfaces.RSAPrivateKey;??
  • import?java.security.interfaces.RSAPublicKey;??
  • import?java.security.spec.PKCS8EncodedKeySpec;??
  • import?java.security.spec.X509EncodedKeySpec;??
  • import?java.util.HashMap;??
  • ??
  • /**?
  • ?*?@author?Administrator?
  • ?*??
  • ?*/??
  • public?class?RSAJavaToCSharp?{??
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ????????HashMap<String,?Object>?map?=?getKeys();??
  • ????????RSAPublicKey?publicKey?=?(RSAPublicKey)?map.get("PUBLIC");??
  • ????????RSAPrivateKey?privateKey?=?(RSAPrivateKey)?map.get("PRIVATE");??
  • ??????????
  • ????????String?publicKeyString?=?getRSAPublicKeyAsNetFormat(publicKey.getEncoded());??
  • ????????String?privateKeyString?=?getRSAPrivateKeyAsNetFormat(privateKey.getEncoded());??
  • ??????????
  • ????????System.out.println(encodeBase64(publicKey.getEncoded()));//此處為客戶端加密時需要的公鑰字符串??
  • ????????System.out.println(encodePublicKeyToXml(publicKey));??
  • ????????System.out.println(publicKeyString);??
  • ????????System.out.println(privateKeyString);??
  • ????}??
  • ??
  • ????/**獲取密鑰對?
  • ?????*?@return?
  • ?????*?@throws?NoSuchAlgorithmException?
  • ?????*/??
  • ????public?static?HashMap<String,?Object>?getKeys()??
  • ????????????throws?NoSuchAlgorithmException?{??
  • ????????HashMap<String,?Object>?map?=?new?HashMap<String,?Object>();??
  • ????????KeyPairGenerator?keyPairGen?=?KeyPairGenerator.getInstance("RSA");??
  • ????????keyPairGen.initialize(1024);??
  • ????????KeyPair?keyPair?=?keyPairGen.generateKeyPair();??
  • ????????RSAPublicKey?publicKey?=?(RSAPublicKey)?keyPair.getPublic();??
  • ????????RSAPrivateKey?privateKey?=?(RSAPrivateKey)?keyPair.getPrivate();??
  • ????????map.put("PUBLIC",?publicKey);??
  • ????????map.put("PRIVATE",?privateKey);??
  • ????????return?map;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?私鑰轉換成C#格式?
  • ?????*?@param?encodedPrivkey?
  • ?????*?@return?
  • ?????*/??
  • ????private?static?String?getRSAPrivateKeyAsNetFormat(byte[]?encodedPrivateKey)?{??
  • ????????try?{??
  • ????????????StringBuffer?buff?=?new?StringBuffer(1024);??
  • ??
  • ????????????PKCS8EncodedKeySpec?pvkKeySpec?=?new?PKCS8EncodedKeySpec(??
  • ????????????????????encodedPrivateKey);??
  • ????????????KeyFactory?keyFactory?=?KeyFactory.getInstance("RSA");??
  • ????????????RSAPrivateCrtKey?pvkKey?=?(RSAPrivateCrtKey)?keyFactory??
  • ????????????????????.generatePrivate(pvkKeySpec);??
  • ??
  • ????????????buff.append("<RSAKeyValue>");??
  • ????????????buff.append("<Modulus>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getModulus()??
  • ????????????????????????????.toByteArray()))?+?"</Modulus>");??
  • ??
  • ????????????buff.append("<Exponent>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPublicExponent()??
  • ????????????????????????????.toByteArray()))?+?"</Exponent>");??
  • ??
  • ????????????buff.append("<P>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPrimeP()??
  • ????????????????????????????.toByteArray()))?+?"</P>");??
  • ??
  • ????????????buff.append("<Q>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPrimeQ()??
  • ????????????????????????????.toByteArray()))?+?"</Q>");??
  • ??
  • ????????????buff.append("<DP>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPrimeExponentP()??
  • ????????????????????????????.toByteArray()))?+?"</DP>");??
  • ??
  • ????????????buff.append("<DQ>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPrimeExponentQ()??
  • ????????????????????????????.toByteArray()))?+?"</DQ>");??
  • ??
  • ????????????buff.append("<InverseQ>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getCrtCoefficient()??
  • ????????????????????????????.toByteArray()))?+?"</InverseQ>");??
  • ??
  • ????????????buff.append("<D>"??
  • ????????????????????+?encodeBase64(removeMSZero(pvkKey.getPrivateExponent()??
  • ????????????????????????????.toByteArray()))?+?"</D>");??
  • ????????????buff.append("</RSAKeyValue>");??
  • ??
  • ????????????return?buff.toString();??
  • ????????}?catch?(Exception?e)?{??
  • ????????????System.err.println(e);??
  • ????????????return?null;??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?公鑰轉成C#格式?
  • ?????*?@param?encodedPrivkey?
  • ?????*?@return?
  • ?????*/??
  • ????private?static?String?getRSAPublicKeyAsNetFormat(byte[]?encodedPublicKey)?{??
  • ????????try?{??
  • ????????????StringBuffer?buff?=?new?StringBuffer(1024);??
  • ??????????????
  • ????????????//Only?RSAPublicKeySpec?and?X509EncodedKeySpec?supported?for?RSA?public?keys??
  • ????????????KeyFactory?keyFactory?=?KeyFactory.getInstance("RSA");??
  • ????????????RSAPublicKey?pukKey?=?(RSAPublicKey)?keyFactory??
  • ????????????????????.generatePublic(new?X509EncodedKeySpec(encodedPublicKey));??
  • ??
  • ????????????buff.append("<RSAKeyValue>");??
  • ????????????buff.append("<Modulus>"??
  • ????????????????????+?encodeBase64(removeMSZero(pukKey.getModulus()??
  • ????????????????????????????.toByteArray()))?+?"</Modulus>");??
  • ????????????buff.append("<Exponent>"??
  • ????????????????????+?encodeBase64(removeMSZero(pukKey.getPublicExponent()??
  • ????????????????????????????.toByteArray()))?+?"</Exponent>");??
  • ????????????buff.append("</RSAKeyValue>");??
  • ????????????return?buff.toString();??
  • ????????}?catch?(Exception?e)?{??
  • ????????????System.err.println(e);??
  • ????????????return?null;??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?公鑰轉換成C#格式?
  • ?????*?@param?key?
  • ?????*?@return?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?String?encodePublicKeyToXml(PublicKey?key)?throws?Exception?{??
  • ????????if?(!RSAPublicKey.class.isInstance(key))?{??
  • ????????????return?null;??
  • ????????}??
  • ????????RSAPublicKey?pubKey?=?(RSAPublicKey)?key;??
  • ????????StringBuilder?sb?=?new?StringBuilder();??
  • ??
  • ????????sb.append("<RSAKeyValue>");??
  • ????????sb.append("<Modulus>")??
  • ????????????????.append(encodeBase64(removeMSZero(pubKey.getModulus()??
  • ????????????????????????.toByteArray()))).append("</Modulus>");??
  • ????????sb.append("<Exponent>")??
  • ????????????????.append(encodeBase64(removeMSZero(pubKey.getPublicExponent()??
  • ????????????????????????.toByteArray()))).append("</Exponent>");??
  • ????????sb.append("</RSAKeyValue>");??
  • ????????return?sb.toString();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?@param?data?
  • ?????*?@return?
  • ?????*/??
  • ????private?static?byte[]?removeMSZero(byte[]?data)?{??
  • ????????byte[]?data1;??
  • ????????int?len?=?data.length;??
  • ????????if?(data[0]?==?0)?{??
  • ????????????data1?=?new?byte[data.length?-?1];??
  • ????????????System.arraycopy(data,?1,?data1,?0,?len?-?1);??
  • ????????}?else??
  • ????????????data1?=?data;??
  • ??
  • ????????return?data1;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?base64編碼?
  • ?????*?@param?input?
  • ?????*?@return?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?String?encodeBase64(byte[]?input)?throws?Exception?{??
  • ????????Class?clazz?=?Class??
  • ????????????????.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");??
  • ????????Method?mainMethod?=?clazz.getMethod("encode",?byte[].class);??
  • ????????mainMethod.setAccessible(true);??
  • ????????Object?retObj?=?mainMethod.invoke(null,?new?Object[]?{?input?});??
  • ????????return?(String)?retObj;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?base64解碼??
  • ?????*?@param?input?
  • ?????*?@return?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?byte[]?decodeBase64(String?input)?throws?Exception?{??
  • ????????Class?clazz?=?Class??
  • ????????????????.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");??
  • ????????Method?mainMethod?=?clazz.getMethod("decode",?String.class);??
  • ????????mainMethod.setAccessible(true);??
  • ????????Object?retObj?=?mainMethod.invoke(null,?input);??
  • ????????return?(byte[])?retObj;??
  • ????}??
  • ??
  • ????public?static?String?byteToString(byte[]?b)??
  • ????????????throws?UnsupportedEncodingException?{??
  • ????????return?new?String(b,?"utf-8");??
  • ????}??
  • }??
  • ?

    為了方便在服務器端使用,初始想法是想將java文件封裝為.dll文件,共C#調用,測試后,發現這樣做行不通,bug提示類找不到,這是因為java代碼中還導入了其他jar包的緣故。

    于是,退而求其次,將上述java文件Export為可執行的jar文件,并將生成的密鑰對寫入相應文件中。再由C#讀取,提供給客戶端。

    ---------------------------------------------------------------------------------------------

    C# Java間進行RSA加密解密交互

    C# Java間進行RSA加密解密交互(三)

    轉載于:https://www.cnblogs.com/amylis_chen/p/8604970.html

    總結

    以上是生活随笔為你收集整理的C# Java间进行RSA加密解密交互(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。