шифровать / дешифровать с помощью Android и переполнения стека

Извините за этот вопрос. Я прочитал все предыдущие вопросы, но мой код все еще не работает.
Заранее спасибо всем, кто поможет мне понять, в чем проблема.

В Android я использую этот код для чтения открытого ключа и выдаю зашифрованный текст:

public static PublicKey getPublicKeyFromString(String stringKey) throws Exception {
byte[] keyBytes = stringKey.getBytes();
byte[] decode = Base64.decode(keyBytes, Base64.DEFAULT);
KeyFactory fact = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decode);
return (PublicKey) fact.generatePublic(x509KeySpec);
}
public static String RSAEncrypt(final String plain, final PublicKey publicKey)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] encryptedBytes;
Cipher cipher;
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedBytes = cipher.doFinal(plain.getBytes());
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
//I call these functions in this manner.
private final String pubKeyString =
//"-----BEGIN PUBLIC KEY-----" +
"MIG..." +
"...";
//"-----END PUBLIC KEY-----"PublicKey pubKey = RSAFunctions.getPublicKeyFromString(pubKeyString);
String encData = RSAFunctions.RSAEncrypt("prova", pubKey);

Файлы publickey.php и privatekey.php создаются в php с помощью этого кода:

<?php
include('./Crypt/RSA.php');
$rsa = new Crypt_RSA();
extract($rsa->createKey()); // == $rsa->createKey(1024) where 1024 is the key size
$File1 = "./privatekey.php";
$Handle = fopen($File1, 'w');
fwrite($Handle, "<?php \$privatekey=\"" . $privatekey . "\"?>");
fclose($Handle);
$File2 = "./publickey.php";
$Handle = fopen($File2, 'w');
fwrite($Handle, "<?php \$publickey=\"" . $publickey . "\"?>");
fclose($Handle);
?>

В php я использую этот код для расшифровки данных:

<?php
include('Crypt/RSA.php');
require('privatekey.php');

$rsa = new Crypt_RSA();
$rsa->loadKey($privatekey); // private key

$base64_string = $_GET["data"];
$base64_string = str_replace(' ', '+', $base64_string);

$ciphertext = base64_decode( $base64_string );

//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$plaintext = $rsa->decrypt($ciphertext);

echo $plaintext;
?>

Я также сделал скрипт php crypt для тестирования моей функции php расшифровки. Это код моего encrypt.php:

<?php
include('Crypt/RSA.php');
require('publickey.php');

$rsa = new Crypt_RSA();
$rsa->loadKey($publickey); // public key

$plaintext = $_GET["data"];

//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$ciphertext = $rsa->encrypt($plaintext);
echo base64_encode( $ciphertext );
?>

У меня нет проблем при шифровании и дешифровании текста с использованием только php, но если я использую зашифрованные данные, созданные с помощью приложения для Android, php выдает ошибку при расшифровке.

Спасибо за внимание.

-2

Решение

В вашем php есть:
CRYPT_RSA_ENCRYPTION_PKCS1

но когда вы создаете свой объект Cipher на Android, вы пропускаете режим и отступы

cipher = Cipher.getInstance("RSA");

ты должен попробовать что-то вроде

Cipher c = Cipher.getInstance("AES/CBC/PKCS1Padding");

ссылка:
http://developer.android.com/reference/javax/crypto/Cipher.html

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector