我有这个
RSA public key
,它是在 VB.Net
我的服务器中生成的。
<RSAKeyValue><Modulus>tv0tzng4pW7erDo2ke/Ku9TGKRukAzx+lihZVblIOE6GWIoiwlILOANeVliZLi1s5qMsXEUA4GV2woC1zFdhJvfFja8Nacl4I3CJ4JYmGqcSZinWKgo3MJdoEqFl9NliF4wTYLow3GYoUh03WxoeArozV1S03drP898b9PdbjPY+ji4jpZHJWnbfg+qWSziF1Q/pSAxpzabeoamz1+ekqlhuxZavQUl+hIhx/quHqy3ybFWcX6yE5NKeY1fzX3L7</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
我想将此值设置为我的 Android RSA 公钥,但使用此代码进行转换并不能正确设置密钥。
RSAPublicKeySpec spec = new RSAPublicKeySpec(new BigInteger("tv0tzng4pW7erDo2ke/Ku9TGKRukAzx+lihZVblIOE6GWIoiwlILOANeVliZLi1s5qMsXEUA4GV2woC1zFdhJvfFja8Nacl4I3CJ4JYmGqcSZinWKgo3MJdoEqFl9NliF4wTYLow3GYoUh03WxoeArozV1S03drP898b9PdbjPY+ji4jpZHJWnbfg+qWSziF1Q/pSAxpzabeoamz1+ekqlhuxZavQUl+hIhx/quHqy3ybFWcX6yE5NKeY1fzX3L7".getBytes())
,new BigInteger("AQAB".getBytes()));
首先,您必须从 Base64 解码模数和指数。
其次,你必须为
BigInteger
使用不同的构造函数:
BigInteger(int signum, byte[] magnitude)
与
signum
为一,因为这两个值都不是 2 补码表示法并且始终为正。
我已经编写了一段代码,利用 JDK 1.8,使用从 VB.Net 生成的模数和指数来生成 Base64 公钥。请评估其与预期用例的相关性。
byte[] modulusBytes = Base64.getDecoder().decode("xYWg56Z+F/QOsKgFJE/gMA3j/emq/cVhxNQt4nWmxVWUdV1f9loHq6PK8g2+yRDYwwPmJT2HiafuyE/noJGKlPWNqW2/io6IZbuAvdpZlv4iHQzF/4z6i1wQf/VnFCGQ/ov24sfJgk5ZwqX1CJQcvZJsAmxBB9lEmG95Hx7KAbU=");
byte[] exponentBytes = Base64.getDecoder().decode("AQAB");
BigInteger modulus = new BigInteger(1, modulusBytes);
BigInteger exponent = new BigInteger(1, exponentBytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);
byte[] publicBytes = Base64.getEncoder().encode(pubKey.toString().getBytes());
System.out.println("Public Key: " + new String(publicBytes));