2017-12-28 30 views
-1

일부 데이터를 암호화하여 PBEWITHSHAAND3-KEYTRIPLEDES-CBC를 사용하여 제 3 자 서비스에 보내야합니다.phpseclib를 사용하여 PBEWITHSHAAND3-KEYTRIPLEDES-CBC로 암호화

I가 타사에서 제공하는이 작업 예제 자바 코드 :

$hash = 'sha1'; 
$kdf = 'pkcs12'; 
$password = 'eKhfdPKO54OddrfgghuBGHsA5BGTYHon'; 
$salt = chr(-87) . chr(-101) . chr(-56) . chr(50) . chr(86) . chr(52) . chr(-29) . chr(3); 
$iterations = 19; 

$text = "foobar"; 

$cipher = new \phpseclib\Crypt\TripleDES('cbc'); 
$cipher->setPassword($password, $kdf, $hash, $salt, $iterations); 

echo base64_encode($cipher->encrypt($text)); 
// Output: daAlVF+JjNg= 

질문 :이 phpseclib를 사용하여 내 (작동하지 않는) PHP 코드가

String algorithm = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC"; 
String password = "eKhfdPKO54OddrfgghuBGHsA5BGTYHon"; 
byte[] salt = {-87, -101, -56, 50, 86, 52, -29, 3}; 
int iterations = 19; 

String text = "foobar"; 

Provider bouncy = new org.bouncycastle.jce.provider.BouncyCastleProvider(); 
Security.addProvider(bouncy); 

KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations); 
SecretKey key = SecretKeyFactory.getInstance(algorithm, bouncy).generateSecret(keySpec); 

Cipher cipher = Cipher.getInstance(algorithm, bouncy); 
cipher.init(1, key, new PBEParameterSpec(salt, iterations)); 

System.out.println(new String(Base64.getEncoder().encode(cipher.doFinal(text.getBytes("UTF8"))))); 
// Output: kaxAiR1Qb9s= 

입니다 : PHP 코드가 Java 코드와 동일한 결과를 내도록하려면 어떻게해야합니까?

+1

왜 Java를 PHP로 변환 할 수 있다고 생각하십니까? – Zorkind

+0

코드에 많은 오류가 있습니다 : - \ – Zorkind

+0

나는 자바로 PHP를 번역하려하지 않고 PHP로 암호화하려고합니다. Java 코드는 제 3 자에 의해 참조 용으로 제공되었습니다. 두 가지 코드 모두 작동하며 수입품을 놓치고 포함합니다. – txigreman

답변

0

마지막으로 해결책을 찾았습니다. 내가 추출했습니다

자바 버전에서 키와 IV 바이트 생성 :

byte[] keyBytes = key.getEncoded(); 
byte[] iv = cipher.getIV(); 

을 그리고 PHP에서 직접 사용 : 그들이 할 수 있도록

$key = chr(208) . chr(193) . chr(208) . chr(49) . chr(81) . chr(84) . chr(244) . chr(181) . chr(234) . chr(244) . chr(94) . chr(164) . chr(44) . chr(55) . chr(244) . chr(64) . chr(233) . chr(97) . chr(4) . chr(64) . chr(179) . chr(155) . chr(161) . chr(155); 
$iv = chr(187) . chr(159) . chr(143) . chr(131) . chr(24) . chr(115) . chr(157) . chr(64); 

$text = "foobar"; 

echo openssl_encrypt($text, 'DES-EDE3-CBC', $key, 0, $iv); 
// Output: kaxAiR1Qb9s= 
심지어 키 인코딩 할 수

및 IV 64 기수로 설정 파일에 쉽게 작성하십시오 :

$key = base64_decode('0MHQMVFU9LXq9F6kLDf0QOlhBECzm6Gb'); 
$iv = base64_decode('u5+PgxhznUA='); 

감사합니다!

관련 문제