前一篇主要是简单的实现了 php 的加密和解密问题,只是对秘钥格式的处理。这篇主要说我遇到的问题,java 加密以后,php 没办法解密,代码如下:

public static function decryptPrivate($data, $rsakeypath) {
$content = self::getContent($rsakeypath);
if ($content) {
$pem = self::transJavaRsaKeyToPhpOpenSSL($content);
$pem = self::appendFlags($pem, false);
$res = openssl_pkey_get_private($pem);
if ($res) {
$opt = openssl_private_decrypt($data, $result, $res);
if ($opt) {
return $result;
}
}
}
return false;
}

也就是说 $res 这个返回是正确的,而openssl_private_decrypt 这个函数解密失败,下面先看看 java 的部分代码

protected String getAligorithm()
{
return "RSA"; // must be RSA/ECB/PKCS1Padding ? why ?
}

public String encrypty(String src)
{
if (this.encrypt != null)
src = this.encrypt.encrypty(src);
try {
Cipher cipher = Cipher.getInstance(getAligorithm());
cipher.init(1, getKey(Base64.decodeBase64(this.sKey.getBytes())));
byte[] clearData = src.getBytes(this.encoding);
byte[] secData = new byte[((clearData.length - 1) / 117 + 1) * 128];
int m = 0;
int n = 0;
for (; clearData.length - m > 117; m += 117)
n += cipher.doFinal(clearData, m, 117, secData, n);
cipher.doFinal(clearData, m, clearData.length - m, secData, n);
return new String(Base64.encodeBase64(secData));
} catch (Exception e) {
throw new EncryptyException(e);
}
}

上面 java 代码的 getAligorithm() 这个方法,返回了 “RSA” ,查阅了很多的资料,显示他是失败之源,需要改成 RSA/ECB/PCKS1Padding ,因为 jar 包是第三方合作项目,所以这里也只能是反编译来查看代码,没有办法在原来的代码基础上进行修改,为什么需要改成 RSA/ECB/PCKS1Padding 我还不清楚,也没有从官方文档查到相关说明,唯一网上的解释是 如果用php解密必须这样设置。