Почему размер AIK составляет 281 байт?

Я пытаюсь проверить подпись цитаты tpm, используя код ниже:

Signature publicSignature = Signature.getInstance("SHA1WithRSA");
publicSignature.initVerify(aik);
publicSignature.update(CryptoUtils.sha1(expectedBytes));
System.out.println(publicSignature.verify(quoteBytes));

Но я получаю следующее исключение:

Exception in thread "main" java.security.SignatureException: Signature length not correct: got 256 but was expecting 281

Похоже, ожидаемая длина рассчитывается на основе длины ключа, поскольку длина открытого ключа AIK, который я использую, равна 281. Итак, теперь возникает вопрос, почему длина ключа равна 281 вместо 256 (для RSA 2048)? Должен ли я каким-то образом обрезать шестнадцатеричную строку?

0000    0100    0100    0200    0000    0c00    0000    0008
0000    0200    0000    0000    0000    0001    4a95    8ebb
14da    7a5a    8d8f    0cf1    b918    9bda    9eda    ec02
7e8a    9709    7a4c    05cf    396e    e8cd    8e4d    0cb7
7151    ec15    186f    1856    9b3e    5c6d    fde6    fd43
42d6    ebd6    a286    4150    b25b    03d8    1208    f434
c925    5045    07a0    3345    1cf9    1af8    b530    2191
81d8    e2a6    659d    cdef    c86c    1c25    1893    c26f
39a1    0222    69b8    2132    aadc    9b07    9906    ea73
a1c0    37af    0d81    b204    68cc    163e    e95b    bfca
d16e    deed    be06    a91d    2c9d    5bd0    5ccc    c7ea
d142    aabb    2a6b    03dd    8cc2    4fca    9d0e    8dd6
09c0    c175    ec88    fd19    c6a1    e566    f9a9    391f
cf0e    b493    e20c    7a91    6596    11ed    6fe7    7447
c197    e56b    961b    209a    1956    0b4b    f330    28b9
c92f    998b    60bc    0919    fbd7    01e7    cca2    3a4b
5096    fb15    c877    78be    4560    f50d    ae67    bddc
f5ad    e514    2400    b89f    3c67    bfb1

1 ответ

Решение

Я наткнулся на ответ здесь. Оказывается, что первые 28 байтов в BLOB-объекте AIK используются для специальной структуры, которая дает подробную информацию об алгоритме, схеме кодирования и т. Д., А оставшиеся 256 байтов представляют модуль. Так что сращивание по ключу сработало:

byte[] modulusBytes = Arrays.copyOfRange(aikBytes, 28, aikBytes.length);

// Now get the public key object using:
RSAPublicKeySpec spec = new RSAPublicKeySpec(new BigInteger(Hex.encodeHexString(modulusBytes), 16),
            new BigInteger("010001", 16));

KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey aik = factory.generatePublic(spec);
Другие вопросы по тегам