Я пытаюсь зашифровать данные в андроида стороне и расшифровать его в сторону PHP я использую phpseclib в PHP для создания общественных/частных ключейОткрытый/закрытый ключ шифрования Android-PHP
после того как я генерировать ключи этого открытый ключ я получил в PHP стороны:
-----BEGIN RSA PUBLIC KEY-----".
"MIGJAoGBAKks62Itns2uU/dVZJ4kCkMinHgyeh/rdMD53a4Zu2a76OIJvdSZ8q4c".
"YTWvPj0giefVtMc7tV4c6AAw04jyIfmCTvcQUlHI+sspHxXDlQTagNoxCuA29b5L".
"9MKO6Ok0LwF9rGgTywC1heNEulZz9ISn9FQDazJT+Bd9cnNOrJRdAgMBAAE=".
"-----END RSA PUBLIC KEY-----
, а затем я закодирован его в base64 и получил этот base64 закодированного ключ
LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tTUlHSkFvR0JBS2tzNjJJdG5zMnVVL2RWWko0a0NrTWluSGd5ZWgvcmRNRDUzYTRadTJhNzZPSUp2ZFNaOHE0Y1lUV3ZQajBnaWVmVnRNYzd0VjRjNkFBdzA0anlJZm1DVHZjUVVsSEkrc3NwSHhYRGxRVGFnTm94Q3VBMjliNUw5TUtPNk9rMEx3RjlyR2dUeXdDMWhlTkV1bFp6OUlTbjlGUURhekpUK0JkOWNuTk9ySlJkQWdNQkFBRT0tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0t
я скопировал его андроид стороны для шифрования данных, используя его, но я получил InvalidKeySpecException
Android Side Код:
public static byte[] encrypt(String text) {
byte[] encodedPublicKey= Base64.decode("LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tTUlHSkFvR0JBS2tzNjJJdG5zMnVVL2RWWko0a0NrTWluSGd5ZWgvcmRNRDUzYTRadTJhNzZPSUp2ZFNaOHE0Y1lUV3ZQajBnaWVmVnRNYzd0VjRjNkFBdzA0anlJZm1DVHZjUVVsSEkrc3NwSHhYRGxRVGFnTm94Q3VBMjliNUw5TUtPNk9rMEx3RjlyR2dUeXdDMWhlTkV1bFp6OUlTbjlGUURhekpUK0JkOWNuTk9ySlJkQWdNQkFBRT0tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0t", Base64.DEFAULT);
PublicKey publicKey=null;
KeyFactory keyFactory = null;
try {
keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedPublicKey);
publicKey = keyFactory.generatePublic(publicKeySpec);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (InvalidKeySpecException e) {
e.printStackTrace();
}
byte[] cipherText = null;
try {
// get an RSA cipher object and print the provider
final Cipher cipher = Cipher.getInstance("RSA");
// encrypt the plain text using the public key
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipherText = cipher.doFinal(text.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return cipherText;
}
Согласно [DOCS] (http://docs.oracle.com/javase/7/docs/api/java/security/spec/X509EncodedKeySpec.html), X509EncodedKeySpec ожидает ASN.1 отформатирован ключ , тогда как вы передаете форматированный ключ [PEM] (https://en.wikipedia.org/wiki/Privacy-enhanced_Electronic_Mail). – adelphus
Хе, двойное кодирование base64. Это действительно не имеет смысла. Вам нужно base64 для преобразования двоичного кода в текст; для base64 мало используется, если вход * уже является текстовым *, не согласны ли вы? Снимите верхний и нижний колонтитулы и посмотрите, работает ли это. –
@MaartenBodewes: Это не сработает, потому что формат является более простым открытым ключом PKCS # 1, просто модулем и показателем. Java ожидает более сложного зверя SubjectPublicKeyInfo, известного как «X509EncodedKey» в Java-ese. –