2011-01-14 2 views
1

Я пытаюсь вручную создать тег подписи для вызова веб-службы. Я получил доступ к сертификату из хранилища ключей и получил доступ к открытому ключу для сертификата. У меня теперь есть проблема с преобразованием RSAKeyValue в ds: CryptoBinary type. Код возвращает значение Biginteger для mudulus и exponent, и я ищу метод или алгоритм для их преобразования в октеты, а затем преобразования в Bas64. Вот мой кодПреобразование из BigInteger в октет?

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

Есть ли какое-либо решение в Java для преобразования целых чисел в октетное представление?

ответ

2

Попробуйте следующий код, используя Apache Commons структуру кодека:

BigInteger modulus = rsaKey.getModulus(); 
org.apache.commons.codec.binary.Base64.encodeBase64String(modulus.toByteArray()); 
+0

спасибо, это так просто –

0

Unfortunatly, modulus.toByteArray() не отображает непосредственно ds:CryptoBinary типу XML Digital Signature, который также требует зачистки ведущих нулевых октета. Вам необходимо сделать что-то вроде следующего, прежде чем сделать кодировку 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); 
} 
Смежные вопросы