Я надеюсь, что кто-нибудь может помочь мне с моей проблемой.
Я разрабатываю апплет javacard, и моя задача состоит в том, чтобы зашифровать секрет (хранящийся в апплете) с помощью открытого ключа сервера. Возвращаемый шифр будет отправлен на сервер afterwrds — скрипт php на сервере — где шифр должен быть снова расшифрован с помощью закрытого ключа сервера.
И проблема в том, что дешифрование в php-скрипте (openssl_private_decrypt (…)) ничего не возвращает, поэтому оно ни к чему не приводит.
PS: Я также видел несколько примеров шифрования javacard RSA, и почти все они используют закрытый ключ для шифрования, что, по моему мнению, означает, что данные должны быть только подписаны, а не зашифрованы, я прав?
Вот пример кода из апплета javacard:
byte[] secret ={ (byte)0x01,(byte)0x02,(byte)0x03,(byte)0x04}
public Crypto() {
RSAPublicKey rsaPublicKey = (RSAPublicKey) KeyBuilder.buildKey(
KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_2048, false);
Cipher rsaCipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
encryptSecretWithPubKey();
}
.....
// here are some methods for setting the public key
.....
public byte[] encryptSecretWithPubKey() {
if (!isRSAKeyInitialized) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
// make sure the blocks size which should be encrypted is not longer
// than 53 bytes; see ALG_RSA_PKCS1 definition for encryption.
if (secret.length >= rsaKeyModulus.length - 11) {
// normally not the case, so ignore it for this test
}
rsaCipher.init(rsaPublicKey, Cipher.MODE_ENCRYPT);
final byte[] encryptedMsg = JCSystem.makeTransientByteArray(
(short) 256, JCSystem.CLEAR_ON_DESELECT);
if (rsaPublicKey.isInitialized())
rsaCipher.doFinal(secret, (short) 0,
(short) secret.length, encryptedMsg, (short) 0);
return encryptedMsg;
}
А вот функция, которую я использую для расшифровки в сценарии php:
public function decrypt($data)
{ // data is in binary format
if (openssl_private_decrypt($data, $decrypted, $this->privkey))
$data = $decrypted;
else
// openssl function fails here, so no plain data is returned
$data = '';
return $data;
}
Я надеюсь, что вы можете помочь мне понять, что я не так, или это может быть ошибка в классе Cipher, чего я не ожидаю 🙂
РЕДАКТИРОВАТЬ:
Расшифровка openssl на сервере выдает следующее сообщение об ошибке:
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
ошибка означает, что тип блока неправильный. Я использую открытый ключ в апплете, поэтому тип блока должен быть 02, но это не …
РЕДАКТИРОВАТЬ:
Проблема решена сейчас. Это была моя ошибка программирования. Модуль не был установлен правильно (последний байт всегда был установлен на ноль), поэтому расшифровка не работает впоследствии.
Задача ещё не решена.
Других решений пока нет …