2011-06-30 26 views
3

私は、AndroidアプリケーションのRSA公開鍵でAES鍵を暗号化し、phpseclibでPHPを使用してサーバー上のAES鍵を解読しようとしています。私は、静的テキストを暗号化し、それを解読して元のテキストを取得するかどうかを確認することで、両方のプラットフォームでRSA暗号化/復号化が動作することを確認しました。テストによると、RSAコードは各プラットフォームで個別に動作しますが、プラットフォーム間に違いがあるようです。 JavaではJavaでのRSA暗号化、PHPでの復号化

、私が弾む城のライブラリを使用して、次のコード持っています:PHPに続いて

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
new BigInteger("00c897f9e401819e223ffbecc6f715a8d84dce9022762e0e2d54fa434787fcaf230d28bd0c3b6b39b5211f74ffc4871c421362ccfc07ae98b88fa9728f1e26b8210ebbf4981e45867fe810938294d0095d341b646b86dcbd4c246676c203cb1584d01eef0635299714d94fa12933ecd35e6c412573156d9e6e549b7804eb6e165660507d8748bcc8c60da10099bacb94d3f7b50b1883ee108489e0dd97ed7d28e564edd4ee5d6b4225f5c23cdaaf495c3fa08c3b82e1674946e4fa1e79b2493204d6953c261105ba5d0f8dcf3fcd39a51fbc18a5f58ffff169b1bed7ceeded2ae0e8e8e2238e8b77b324d1a482593b1a642e688c860e90d5a3de8515caf384133b", 16), 
new BigInteger("11", 16)); 
keyFactory = KeyFactory.getInstance("RSA", "BC"); 
//RSAPublicKeySpec rsaKeySpec = new RSAPublicKeySpec(rsaKey.MODULUS, new BigInteger("11", 16)); 
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec); 

//Set up the cipher to RSA encryption 
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC"); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

// make sure the Aes Key is less than a block size 
// otherwise major errors will occur 
if(AesKey.length * 8 > pubKey.getModulus().bitLength()) 
    return "Error: AesKey bigger than block size of RSA Key"; 

byte[] encryptedKey = cipher.doFinal(AesKey); 

// return result Base64 encoded 
return Base64.encodeToString(encryptedKey, Base64.DEFAULT); 

を、私は、AESキーを解読するために、次のコードを使用しています:

$AESkey = base64_decode($AES); 

$rsa = new Crypt_RSA(); 
$private = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/PrivateData/private_key.pem'); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
$rsa->loadKey($private); 
$AESkey = $rsa->decrypt($AESkey); 

AESキーがサーバーによって解読されているとき、私はいつも次のエラーを受け取ります:1911年のC:\ xampp \ php \ PEAR \ phpseclib \ Crypt \ RSA.phpの解読エラー。RSA.php 、私はエラーが暗号化中に不適切なパディングと関係があると思うが、私は理解できないようだそれを修正する方法。

更新:私は上記の暗号化/復号化コードが実際に正しいことを理解しました。私が問題を抱えていたのは、アプリケーションのデータをphpに送る前に出力をエンコードしていないので、情報の一部が失われていたということでした。

+0

エラーが最初の上位2バイトの1つ間違っていること、そして通常は秘密鍵が間違っているなど、非常に深刻なエラーを示します:バージョンに応じて、次は役立つかもしれません。エンディアン問題があるかもしれませんか?それが私がチェックする別のものです。 –

+0

どのように正確にチェックするのですか?私はPHPで暗号化と復号化の両方を行っても機能するようになって以来、鍵自体に問題はないと感じていますが、公開鍵をJavaにどのように入力すれば問題になるかもしれないと思っていますまたは私がJavaで使うパディングスキーム。 – UmangB

+0

確認する1つの方法は、暗号化バイトを逆にして復号化が成功するかどうかを確認することです。しかし、最良の方法は、いくつかの既知の良いテストベクタを見つけ、それらがPHP側でどのように処理されるかを確認することです。また、中間値を調べるためにphpseclibにブレークポイントを設定することもできます。 –

答えて

0

どのバージョンのphpseclibを使用していますか?

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414

+0

私はリンクで説明されている修正を含む最新のバージョンを持っています。さらにテストをした後、私はこれがjavaとphpで使われているさまざまな文字セットの問題かもしれないと判断しました。 JavaはデフォルトでUTF-8を使用し、PHPはデフォルトでISO-8859-1を使用します。私はどのようにデータのいずれかを失うことなく2つの間で変換する方法がわかりません。私はまた、どのようにphp base 64のutf-8文字列をデコードするかを理解できません。 – UmangB

+0

パスワードをJavaのStringとして生成するのではなく、ByteArrayなどのパスワードを生成した場合はどうなりますか? –

+0

実際には、一連のテストとデバッグを行って解決策を見つけた後、暗号化は正しいと判断しましたが、アンドロイドアプリとPHPの間で送信される情報は、ベース64エンコードされた後、うんざりする – UmangB

関連する問題