2016-07-03 2 views
1

내가 성취하고자하는 것에 대한 배경 지식.PHP에서 Java 암호화를 복제하는 방법은 무엇입니까?

1 부

PHP 서버는 자바 기반 장치와 통신합니다. PHP는 OpenSSL을 사용하여 공개/개인 키 쌍을 생성 한 다음 장치에 공개 키를 보내고 공개 키를 사용하여 생성 된 macKey (base64로 인코딩 됨)을 다시 제공합니다. PHP는 이제 개인 키를 사용하여 macKey을 base64 디코딩하고 해독해야합니다.

PHP의 Java 코드 단편에 해당하는 것은 무엇입니까? 여기

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); 

그러나 나는 macKey

나타나는대로 $decrypted 위의 일부 이진 데이터를 보유하고
$macKey = 'LkvTT9LFj5lcxRRB8KrwwN906fSIDDcJvQK3E7a5PbR+Ox9WnslOs32jSCC9FkE8ouvr2MfWwtppuZmoPjaxwg3yAQI4UN3T1loISuF2VwKWfJ45fywbK9bNnD5Cw7336mjoGctv77Tg3JXPrsRwgMGIlBsNwdt1B0wgT4MMMAjl32TnBI3iwQ94VTMHffrK+QToddTahRHHoVsr3FVrETdiqKXdkiX1jES53im5lrXYIsY89UFkGzPo+3u4ijKIQWSLvYnA5wXI128gFHKxKYS82MbJDUn9i1RVFsGaP6T3nQRSX5SZNpSe5yGFWwMgYOx0KXMgET82FeaL2hfWuw=='; 
$base64DecodedMacKey = base64_decode($macKey); 
openssl_private_decrypt($base64DecodedMacKey, $decrypted, $privateKey); 

를 해독 할 때 문자열 대 바이트 배열을 사용하는 방법에 대한 혼란 스러워요, 그래서 '내가 PHP에서 시도거야


부 ... 내가 바이트 배열로 변환 또는 문자열로 처리해야하는지 여부를 확실 해요 2.

각 요청에는 counter이 있습니다. 위의 Java 코드에서 macKeycounter에서 MAC 값을 만드는 데 사용됩니다.

PHP의 Java 코드 단편에 해당하는 것은 무엇입니까?

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 문자열을 생성하지 못했습니다.

답변

0

해결책을 직접 찾았습니다. Part 1에서는 phpseclib을 사용하여 공개/개인 키를 생성하고 암호화 알고리즘을 지정했습니다. macKey 해독 :

$rsa = new Crypt_RSA(); 
$keys = $rsa->createKey(2048); 
// [...] 

$macKey = base64_decode($base64EncodedMacKey); 

$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
$rsa->loadKey($keys['privatekey']); 
$decryptedMac = $rsa->decrypt($macKey); 

2 부 얹는 : PHP에서 hash_hmac 기능으로 문자열을 기대하면서 주요 혼란스러운 부분은 자바, HMAC는, 바이트 배열에서 이루어졌다 것을

$counter = 0; 
$hmac = hash_hmac('sha256', ++$counter, $decryptedMac, true); 
$counterMac = base64_encode($hmac); 

의 두 번째 매개 변수이므로 unpack()을 사용하는 것으로 충분하지 않았습니다. 그러나 $counter을 직접 전달하는 것으로 보입니다. 또한 원시 데이터를 반환하려면으로 네 번째 매개 변수를 사용하는 것이 중요합니다.

관련 문제