编辑2: 问题已解决。我不明白 php 中的 loadkey 函数应该如何工作,我错误地认为它会读取一个密钥文件(它不会)。解决方案是将文件的内容读入一个变量,然后用loadkey加载该变量。
编辑: 问题似乎出在钥匙上。我意识到 loadkey 返回 false,表示它无法读取密钥。phpseclib 接受的格式和在 java 中创建的密钥是否存在差异?
我正在尝试在 Java (android) 中加密 AES 密钥并在 PHP 中解密它以使用对称加密进行数据传输。目前,我能够在 Java 中使用 RSA 加密和解密一个短文件或字符串,但无法在 PHP 中对其进行解密。
我正在使用 phpseclib 在 PHP 中解密,我没有收到任何错误,但我的输出字符串为空。
这是我正在使用的代码:
爪哇:
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 只是将数据逐字节写入文件。
什么可能导致问题?