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有什么区别和联系,希望对大家有所帮助