程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#和Java有甚麼差別和接洽

C#和Java有甚麼差別和接洽

編輯:C#入門知識

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有甚麼差別和接洽,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved