編集 2: 問題は解決されました。PHP の loadkey 関数がどのように機能するのか理解できず、キー ファイルを読み取ると誤って想定していました (読み取らない)。解決策は、ファイルの内容を変数に読み込んでから、loadkey で変数をロードすることでした。
編集: 問題はキーにあるようです。loadkey が false を返していることに気付きました。これは、キーを読み取ることができなかったことを示しています。phpseclib で受け入れられる形式と Java で作成されたキーに違いはありますか?
Java (android) で AES キーを暗号化し、PHP で復号化して、データ転送に対称暗号化を使用しようとしています。現在、Java で RSA を使用して短いファイルまたは文字列を暗号化および復号化できますが、PHP では復号化できません。
PHPで復号化するためにphpseclibを使用していますが、エラーは発生しませんが、出力文字列はnullです。
これは私が使用しているコードです:
ジャワ:
File archivo_llave_publica = new File(direccion);
byte[] bytes_llave = leer(archivo_llave_publica);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(bytes_llave);
PublicKey pubKey = keyFactory.generatePublic(publicKeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData = cipher.doFinal(src);
return cipherData;
PHP:
<?php
include('./Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey('./key/Pri.txt'); // public key
$temprsa = $rsa->decrypt($key);
if ($temprsa==null){echo "null decrypt";}
キーの生成に使用されるコード:
public void generaArchivoLlaves(String pub_file, String pri_file){
File LlavePrivada = new File(raiz.getAbsolutePath()+"/Bushfire/"+pri_file);
File LlavePublica = new File(raiz.getAbsolutePath()+"/Bushfire/"+pub_file);
try {
KeyPair kp = generaLlaves();
byte[] privateKeyBytes = kp.getPrivate().getEncoded();
byte[] publicKeyBytes = kp.getPublic().getEncoded();
Toast.makeText(this, "Privada: "+kp.getPrivate().getFormat(), Toast.LENGTH_LONG).show();
Toast.makeText(this, "Pública: "+kp.getPublic().getFormat(), Toast.LENGTH_LONG).show();
escribir(LlavePrivada, privateKeyBytes);
escribir(LlavePublica, publicKeyBytes);
}
catch (NoSuchAlgorithmException e) {Toast.makeText(this, "Error al generar llave", Toast.LENGTH_LONG).show();}
}
public KeyPair generaLlaves() throws NoSuchAlgorithmException{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
//Toast.makeText(this, "Se generó correctamente", Toast.LENGTH_LONG).show();
return kp;
}
注: 関数 escribir は、データをバイト単位でファイルに書き込むだけです。
問題の原因は何ですか?