我正在尝试为Web服务调用手动创建签名标记。我从密钥库访问了证书并访问了证书的公钥。我现在遇到了将RSAKeyValue转换为ds:CryptoBinary类型的问题。代码返回mudulus和exponent的Biginteger值,我正在寻找一种方法或算法将它们转换为八位字节,然后转换为Bas64。这是我的代码
RSAPublicKey rsaKey = (RSAPublicKey)certificate.getPublicKey();
customSignature.Modulus = rsaKey.getModulus();
customSignature.Exponent = rsaKey.getPublicExponent();
Java中是否有可用于将整数转换为八位字节表示的解决方案?
答案 0 :(得分:2)
使用apache commons编解码器框架尝试以下代码:
BigInteger modulus = rsaKey.getModulus();
org.apache.commons.codec.binary.Base64.encodeBase64String(modulus.toByteArray());
答案 1 :(得分:0)
不幸的是,modulus.toByteArray()
没有直接映射到XML数字签名的ds:CryptoBinary类型,这也需要剥离前导零八位字节。在执行base64编码之前,您需要执行以下操作
byte[] modulusBytes = modulus.toByteArray();
int numLeadingZeroBytes = 0;
while( modulusBytes[numLeadingZeroBytes] == 0 )
++numLeadingZeroBytes;
if ( numLeadingZeroBytes > 0 ) {
byte[] origModulusBytes = modulusBytes;
modulusBytes = new byte[origModulusBytes.length - numLeadingZeroBytes];
System.arraycopy(origModulusBytes,numLeadingZeroBytes,modulusBytes,0,modulusBytes.length);
}