从BigInteger转换为八位字节?

时间:2011-01-14 09:29:36

标签: java rsa public-key-encryption

我正在尝试为Web服务调用手动创建签名标记。我从密钥库访问了证书并访问了证书的公钥。我现在遇到了将RSAKeyValue转换为ds:CryptoBinary类型的问题。代码返回mudulus和exponent的Biginteger值,我正在寻找一种方法或算法将它们转换为八位字节,然后转换为Bas64。这是我的代码

RSAPublicKey rsaKey  = (RSAPublicKey)certificate.getPublicKey();
customSignature.Modulus = rsaKey.getModulus(); 
customSignature.Exponent = rsaKey.getPublicExponent();

Java中是否有可用于将整数转换为八位字节表示的解决方案?

2 个答案:

答案 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);
}