【发布时间】:2016-07-03 14:35:19
【问题描述】:
我正在努力完成的一些背景。
第 1 部分。
PHP 服务器与基于 Java 的设备通信。 PHP 使用 OpenSSL 生成公钥/私钥对,然后将公钥发送到设备,该设备反过来返回加密的macKey(使用公钥生成),以 base64 编码。 PHP 现在需要使用私钥对 macKey 进行 base64 解码和解密。
下面的Java代码sn-p在PHP中的等价物是什么?
String base64EncodedMacKey = "LkvTT9LFj5lcxRRB8KrwwN906fSIDDcJvQK3E7a5PbR+Ox9WnslOs32jSCC9FkE8ouvr2MfWwtppuZmoPjaxwg3yAQI4UN3T1loISuF2VwKWfJ45fywbK9bNnD5Cw7336mjoGctv77Tg3JXPrsRwgMGIlBsNwdt1B0wgT4MMMAjl32TnBI3iwQ94VTMHffrK+QToddTahRHHoVsr3FVrETdiqKXdkiX1jES53im5lrXYIsY89UFkGzPo+3u4ijKIQWSLvYnA5wXI128gFHKxKYS82MbJDUn9i1RVFsGaP6T3nQRSX5SZNpSe5yGFWwMgYOx0KXMgET82FeaL2hfWuw==";
byte[] base64DecodedMacKey = DatatypeConverter.parseBase64Binary(base64EncodedMacKey);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, keypair.getPrivate());
byte[] macKey = cipher.doFinal(base64DecodedMacKey);
这是我在 PHP 中尝试的,但是在解密 macKey 时我对使用字节数组与字符串感到困惑
$macKey = 'LkvTT9LFj5lcxRRB8KrwwN906fSIDDcJvQK3E7a5PbR+Ox9WnslOs32jSCC9FkE8ouvr2MfWwtppuZmoPjaxwg3yAQI4UN3T1loISuF2VwKWfJ45fywbK9bNnD5Cw7336mjoGctv77Tg3JXPrsRwgMGIlBsNwdt1B0wgT4MMMAjl32TnBI3iwQ94VTMHffrK+QToddTahRHHoVsr3FVrETdiqKXdkiX1jES53im5lrXYIsY89UFkGzPo+3u4ijKIQWSLvYnA5wXI128gFHKxKYS82MbJDUn9i1RVFsGaP6T3nQRSX5SZNpSe5yGFWwMgYOx0KXMgET82FeaL2hfWuw==';
$base64DecodedMacKey = base64_decode($macKey);
openssl_private_decrypt($base64DecodedMacKey, $decrypted, $privateKey);
上面的$decrypted 包含一些二进制数据,所以我不确定是否需要将其转换为字节数组或将其视为字符串...
第 2 部分。
每个请求都有一个counter。上面 Java 代码中的 macKey 用于从 counter 中创建 MAC 值。
下面的Java代码sn-p在PHP中的等价物是什么?
int counter = 0;
String nextCounter = String.valueOf(++counter);
SecretKeySpec signingKey = new SecretKeySpec(macKey, "AES");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] counterMac = mac.doFinal(nextCounter.getBytes("UTF-8"));
String base64EncodedMac = DatatypeConverter.printBase64Binary(counterMac);
上面的base64EncodedMac最终被发送到设备验证通信。
我尝试在谷歌上搜索不同的解决方案,但是我未能成功地在 PHP 中生成有效的 base64EncodedMac 字符串以供设备批准。
【问题讨论】:
标签: java php encryption