C#和Java有甚麼差別和接洽。本站提示廣大學習愛好者:(C#和Java有甚麼差別和接洽)文章只能為提供參考,不一定能成為您想要的結果。以下是C#和Java有甚麼差別和接洽正文
因為公司同是應用.NET和JAVA,並且各個辦事集應用接口來停止通訊,是以某些例如清理體系、收銀台之類的平安性比擬高的體系會應用RSA停止加密。是以會觸及到秘鑰的轉換。所以年夜概看了下C#的秘鑰跟JAVA的秘鑰差別。
RSA關於法式自己是沒有差別的,其格局都是雷同的。關於分歧的法式來講,存儲應用的語法(包裝的類)會有所分歧。
RSA語法和語法尺度有許多,年夜的類型年夜概分為ASN.1、PKCS、X.509。
RSA語法引見
ASN.1、PKCS是最後的,也是最重要的RSA公鑰和私鑰的語法尺度,被RSA Lab所保護。
ASN.1、PKCS#1都界說了公鑰和私鑰的類型——序列化的數字。為了下一個條理的籠統(恰當的包裝),如今普通應用的組合是:PKCS#8的私鑰,X.509的公鑰 。
PKCS語法重要用於私鑰,其外部尺度今朝有10種。今朝JAVA廣泛應用的是PKCS#8,用作私鑰格局。
X.509語法重要用於公鑰,普遍應用於web閱讀器和SLL。
3種語法尺度的公私鑰可以完成互相轉化,其焦點為ASN1語法中的整數值(modulus,PublicExponent,privateExponent )。
.NET應用的是尺度的RSA格局,然後將個中的數字base64編碼後,生成XML停止存儲。
java中應用的是PKCS#8,、X.509的公私鑰語法,存儲的都是響應的JAVA類主動生成的base64字符串。
因為存儲格局的差別,在互相轉換、讀取的時刻,須要懂得RSA相干的常識,能力准確應用類來轉換。
C#轉JAVA
C#中的公私鑰應用XML字符串停止存儲,讀取時直接讀入字符串便可。
因為C#應用的是尺度的RSA格局,是以JAVA的RSAPublicKeySpec、RSAPrivateKeySpec設置裝備擺設類的焦點參數(modulus,PublicExponent,privateExponent )都可以從對應XML中的節點值(Modulus-modulus 、Exponent-PublicExponent 、D-privateExponent )base64解碼後獲得。然後將其傳入JAVA設置裝備擺設類中,然後依據設置裝備擺設類生成響應的RSA公私鑰。
JAVA轉C#
JAVA中的公私鑰應用base64停止存儲,解碼成字節數組後,須要師長教師成響應的設置裝備擺設對象(PKCS#8,、X.509 ),依據設置裝備擺設生成RSA公私鑰。
byte[] m = Base64.decodeBase64("mX/9zl8rflH5pLaP5P1Qd/9wXwNBSx7OpLlYDnGr7wD0njiDfPSUkgf9oF5NcvZwl24qdJ1SLmrgUtnr+yeXBNZNKaan1xXKISHdlHvbW5G8nJCJW6CuaHMkVw3Y7kwaIIlUdv09vxfjj0AoabttjbtF1kqETzbQ6fK3EN6sY5U="); byte[] e = Base64.decodeBase64("AQAB"); BigInteger b1 = new BigInteger(1, m); BigInteger b2 = new BigInteger(1, e); byte[] m1 = Base64.decodeBase64("3RgqP5YOYUXft8YOlDphyaCoof27MSfTD2eVCFVXB5hatrls1fSUcmUuWuGV970sS6KQZZtyWHQ5970sCzKFlq82He8Uoe0JM3axBvd6PbSGjulUJr62qNW5hgkIEfxSRYl8AQsbbusFtks4obfepsfE02cLmmZepnZAdIOWifE="); byte[] e1 = Base64.decodeBase64("QcSZdLbHakolxX4GAjPnuNmwsBdRIsss7o0qeQMh02GPwoEgDfkmW20bv+8Q9FPypEEkYQU/m25ffAFq453QvLegYYi8OvWN+dvgchQRdeb22d+s6xYGGN9DRcPFRE48INde8FBHf/lzVgToV75h1H7g+jB4hLmLeuIuHsB43/0="); BigInteger b11 = new BigInteger(1, m1); BigInteger b21 = new BigInteger(1, e1); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2); RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(b11, b21); RSAPrivateKey priKey = (RSAPrivateKey) keyFactory.generatePrivate(priKeySpec);
私鑰
C#應用的是尺度的RSA格局,PKCS#1語法中包括了尺度RSA格局私鑰中的一切整數值。設置裝備擺設對象須要生成PKCS#1語法的RSA對象(RSAPrivateCrtKey),獲得對象屬性,自行結構私鑰XML。
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; } }
公鑰
公鑰跟私鑰生成步調雷同,設置裝備擺設生成尺度的RSA對象(RSAPublicKey)。
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#和Java有甚麼差別和接洽,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!