Как обернуть ключ Java RSA для unpad AS3 PKCS1? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь реверс-инжиниринг приложения Flash для решения задач и знаний.

Я должен отправить клиенту BigInteger в кодировке RSA, который проверит его перед использованием.

Моя проблема в том, что когда клиент распаковывает BigInteger, у меня появляется следующее сообщение об ошибке:

PKCS#1 unpad: i=1, expected b[i]==[0,1,2], got b[i]=xx

(где xx - шестнадцатеричное число)

Вот что я сделал на своем Java-сервере:

this.g = new BigInteger("hexString #1", 16);
this.n = new BigInteger("hexString #2", 16);

this.privateKey = generateRandomBI();
this.secretKey = this.g.modPow(this.privateKey, this.n);

KeyFactory factory = KeyFactory.getInstance("RSA");

RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(
    new BigInteger("hexString #3", 16),
    BigInteger.valueOf(65537)
);

RSAPublicKey publicKey = (RSAPublicKey) factory.generatePublic(publicKeySpec);
SecretKey secretKeySpec = new SecretKeySpec(this.secretKey.toByteArray(), "RSA");

Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsa.init(Cipher.WRAP_MODE, publicKey);
byte[] encryptedSecretKey = rsa.wrap(secretKeySpec);

И затем я отправляю encryptedSecretKey клиенту, который затем выдает мне вышеуказанную ошибку.

Вот клиентская сторона:

var rsa:RSAKey = new RSAKey(
    new BigInteger("hexString #3"),
    65537
);
var decoded:ByteArray = new ByteArray();
rsa.verify(key, decoded, key.length);

Где ключ - это то, что я отправил на Java.

Я не могу изменить сторону клиента (AS3), и я уже пытался использовать все остальные алгоритмы RSA / ECB / , но сгенерированный ключ не совместим с ними.

Я могу опубликовать больше кода клиента и сервера, если это необходимо. hexString (# 1, # 2 и # 3), которые я использую, взяты из клиента AS3. Класс AS3 RSAKey относится к as3-crypto .

Не могли бы вы помочь мне с некоторыми подсказками? Большое спасибо и хорошего дня!

С уважением, Ksama

...