欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-08-29 22:20:58
由于公司同是使用.net和java,而且各个服务集使用接口来进行通信,因此某些例如清算系统、收银台之类的安全性比较高的系统会使用rsa进行加密。因此会涉及到秘钥的转换。所以...

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