Мой пароль зашифрован с помощью RSA в приложении для Android. На стороне сервера мне нужно расшифровать его. У меня есть файл.pem и php-код для дешифрования:
function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE)
{
$key_content = file_get_contents( $fileName );
$prikeyid = openssl_get_privatekey( $key_content, "1234" );
$crypttext = str_replace(' ', '+', $crypttext);
$crypttext = base64_decode( $crypttext );
$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
if( openssl_private_decrypt( $crypttext, $sourcestr, $prikeyid, $padding ) )
{
return $fromjs ? rtrim( strrev( $sourcestr ), "/0" ) : "" . $sourcestr;
}
return;
}
fileName - файл frivatekey (файл.pem). Теперь мне нужно использовать java для его расшифровки. Я пробовал некоторые методы, все провалились. Вот что я пробовал:
с помощью байта [] читать из.der файла для генерации ключевого файла
public static PrivateKey generatePrivateKey(byte[] key)
throws NoSuchAlgorithmException, InvalidKeySpecException {
KeySpec keySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
расшифровать мой пароль
public static byte[] decrypt(PrivateKey privateKey, byte[] data)
throws Exception {
Cipher ci = Cipher.getInstance(ALGORITHOM, DEFAULT_PROVIDER);
ci.init(Cipher.DECRYPT_MODE, privateKey);
return ci.doFinal(data);
}
Но это не работает, и я не знаю, где идет не так. В php-коде я вижу $prikeyid = openssl_get_privatekey( $key_content, "1234" );
Но я не знаю, что означает "1234". Означает ли это использование "1234" для шифрования ключевого файла? Это причина, по которой дешифрование не удалось?
$padding = $fromjs? OPENSSL_NO_PADDING: OPENSSL_PKCS1_PADDING;
Это и плохие варианты:
Пожалуйста, не применяйте RSA самостоятельно. Вы сделаете свое приложение невероятно неуверенным.
Рекомендуемое чтение: