当前位置: 移动技术网 > IT编程>开发语言>c# > C#和Java有什么区别和联系

C#和Java有什么区别和联系

2019年07月18日  | 移动技术网IT编程  | 我要评论

由于公司同是使用.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有什么区别和联系,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网