由于公司同是使用.NET和JAVA,而且各个服务集使用接口来进行通信,因此某些例如清算系统、收银台之类的安全性比较高的系统会使用RSA进行加密。因此会涉及到秘钥的转换。所以大概看了下C#的秘钥跟JAVA的秘钥区别。
RSA对于程序本身是没有区别的,其格式都是相同的。对于不同的程序来说,存储使用的语法(包装的类)会有所不同。
RSA语法和语法标准有很多,大的类型大概分为ASN.1、PKCS、X.509。
RSA语法介绍
ASN.1、PKCS是最初的,也是最主要的RSA公钥和私钥的语法标准,被RSALab所维护。
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"); BigIntegerb1=newBigInteger(1,m); BigIntegerb2=newBigInteger(1,e); byte[]m1=Base64.decodeBase64("3RgqP5YOYUXft8YOlDphyaCoof27MSfTD2eVCFVXB5hatrls1fSUcmUuWuGV970sS6KQZZtyWHQ5970sCzKFlq82He8Uoe0JM3axBvd6PbSGjulUJr62qNW5hgkIEfxSRYl8AQsbbusFtks4obfepsfE02cLmmZepnZAdIOWifE="); byte[]e1=Base64.decodeBase64("QcSZdLbHakolxX4GAjPnuNmwsBdRIsss7o0qeQMh02GPwoEgDfkmW20bv+8Q9FPypEEkYQU/m25ffAFq453QvLegYYi8OvWN+dvgchQRdeb22d+s6xYGGN9DRcPFRE48INde8FBHf/lzVgToV75h1H7g+jB4hLmLeuIuHsB43/0="); BigIntegerb11=newBigInteger(1,m1); BigIntegerb21=newBigInteger(1,e1); KeyFactorykeyFactory=KeyFactory.getInstance("RSA"); RSAPublicKeySpeckeySpec=newRSAPublicKeySpec(b1,b2); RSAPublicKeypubKey=(RSAPublicKey)keyFactory.generatePublic(keySpec); RSAPrivateKeySpecpriKeySpec=newRSAPrivateKeySpec(b11,b21); RSAPrivateKeypriKey=(RSAPrivateKey)keyFactory.generatePrivate(priKeySpec);
私钥
C#使用的是标准的RSA格式,PKCS#1语法中包含了标准RSA格式私钥中的所有整数值。配置对象需要生成PKCS#1语法的RSA对象(RSAPrivateCrtKey),获取对象属性,自行构造私钥XML。
privatestaticStringgetRSAPrivateKeyAsNetFormat(byte[]encodedPrivateKey){ try{ StringBufferbuff=newStringBuffer(1024); PKCS8EncodedKeySpecpvkKeySpec=newPKCS8EncodedKeySpec(encodedPrivateKey); KeyFactorykeyFactory=KeyFactory.getInstance("RSA"); RSAPrivateCrtKeypvkKey=(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>"); returnbuff.toString(); }catch(Exceptione){ System.err.println(e); returnnull; } }
公钥
公钥跟私钥生成步骤相同,配置生成标准的RSA对象(RSAPublicKey)。
privatestaticStringgetRSAPublicKeyAsNetFormat(byte[]encodedPublicKey){ try{ StringBufferbuff=newStringBuffer(1024); //OnlyRSAPublicKeySpecandX509EncodedKeySpecsupportedforRSApublickeys KeyFactorykeyFactory=KeyFactory.getInstance("RSA"); RSAPublicKeypukKey=(RSAPublicKey)keyFactory.generatePublic(newX509EncodedKeySpec(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>"); returnbuff.toString(); }catch(Exceptione){ System.err.println(e); returnnull; } }
上述就是C#学习教程:C#和Java有什么区别和联系分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/907482.html