2016-07-26 2 views
2

Я шифрую слово в java, и у меня есть проблема с расшифровкой его в php.RSA - шифрование в Android/расшифровка в PHP

вот как я создаю ключи в андроиде:

public void GenerateAndSaveToFile(){ 
    try { 

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair kp = kpg.genKeyPair(); 
     Key publicKey = kp.getPublic(); 
     Key privateKey = kp.getPrivate(); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(), RSAPublicKeySpec.class); 
     RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(), RSAPrivateKeySpec.class); 
     ////////////////////////// 
     String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
     File myDir = new File(root + "/keys"); 
     myDir.mkdirs(); 
     File file = new File (myDir, "private.key"); 
     FileOutputStream fileout1 = new FileOutputStream(file); 
     ObjectOutputStream oout1 = new ObjectOutputStream(fileout1); 
     oout1.writeObject(priv.getModulus()); 
     oout1.writeObject(priv.getPrivateExponent()); 
     oout1.close(); 
     /////////////////////// 
     File file2 = new File (myDir, "public.key"); 
     FileOutputStream fileout2 = new FileOutputStream(file2); 
     ObjectOutputStream oout2 = new ObjectOutputStream(new BufferedOutputStream(fileout2)); 
     oout2.writeObject(pub.getModulus()); 
     oout2.writeObject(pub.getPublicExponent()); 
     oout2.close(); 

    } 
    catch (Exception ex){ 
     Exception e = ex; 
    } 

} 

вот как я зашифровать слово с сгенерированным открытым ключом в андроиде:

byte[] u1Encrypted = RSAEncrypt(String.valueOf(inputEmail.getText()).getBytes()); 

public byte[] RSAEncrypt(byte[] data) { 
    try { 
     PublicKey pubKey = ReadPublicKey(); 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
     byte[] cipherData = cipher.doFinal(data); 
     return cipherData; 
    }   
    catch (Exception ex) 
    { 
     Exception e = ex; 
     return null; 
    } 

} 


private PublicKey ReadPublicKey() throws IOException { 
    try { 
     AssetManager assetManager = getAssets(); 
     InputStream in = assetManager.open("public.key"); 
     ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in)); 

     try { 

      BigInteger m = (BigInteger) oin.readObject(); 
      BigInteger e = (BigInteger) oin.readObject(); 
      RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e); 
      KeyFactory fact = KeyFactory.getInstance("RSA"); 
      PublicKey pubKey = fact.generatePublic(keySpec); 
      return pubKey; 
     } catch (Exception e) { 
      throw new RuntimeException("Spurious serialisation error", e); 
     } finally { 
      oin.close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Exception e = ex; 
     return null; 
    } 
} 

затем преобразовать зашифрованную строку в base64 в андроиде:

String u1EncryptedBase64 = Base64.encodeToString(u1Encrypted, Base64.DEFAULT); 

и в PHP я декодировать строку base64:

$encryptedString = base64_decode(u1EncryptedBase64); 

получить секретный ключ:

$keytmp = fopen("../../../private.key", "r") or die("Unable to open file!"); 
$key = fread($keytmp,filesize("../../../private.key")); 
$res = openssl_get_privatekey($key); 

и, наконец, я пытаюсь расшифровать строку в PHP:

if (openssl_private_decrypt($encryptedString, $decrypted, $res)) { 

    echo $decrypted; 
} 
else 
{ 
    echo "problem"; 
} 

и ошибок я получаю:

Предупреждение: openssl_private_decrypt(): key parameter является недействительным закрытым ключом ...

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

+0

'openssl_get_privatekey' ожидает закрытый ключ с PEM-кодированием. Это то, что вы создаете на Java? (и то, что вы хотите для PEM-кодирования, вероятно, является 'privateKey.getEncoded()'). – Michael

+0

@ Майкл, нет, я думаю, что это не PEM-кодировка. Я не уверен, какой формат ключа KeyFactory.getInstance («RSA») генерирует. – farhang67

ответ

1

Можете ли вы расшифровать строку в части Android с помощью этого закрытого ключа?

Я думаю, вы могли бы попробовать это сначала. По крайней мере, было бы известно, что проблема вызвана генерацией ключей или функцией получения закрытого ключа в php.

+0

yes Я могу расшифровать строку с помощью закрытого ключа в android. – farhang67

Смежные вопросы