Я пытаюсь реверс-инжиниринг приложения 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