Blowfish на php и на java

progr

Новичок
Если не в ту ветку запостил, прошу прощения. Не нашел более подходящей

Вопрос в следующем. Пишу алгоритм blowfish шифрования для общения между андроид приложением и сервером с ПХП.
Ключевая фраза по кторой происходит криптование одинаковая на обеих платформах.
Но в итоге после криптования на ПХП в JAVA расшифровать не удается

Для теста была установлена одинаковая строка которая шифруется и в ПХП и в JAVA c одинаковым ключем но на выходе получаю разные данные

Код на пхп:
PHP:
echo "<pre>";
$cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');

$iv =  '87654321';
$key256 = '1234567890123456ABCDEFGHIJKLMNOP';

$cleartext = 'Hello World!';
printf("clearText: %s\n\n",$cleartext);

if (mcrypt_generic_init($cipher, $key256, $iv) != -1)
{
     $cipherText = mcrypt_generic($cipher,$cleartext );
     mcrypt_generic_deinit($cipher);
     printf("256-bit blowfish encrypted:\n%s\n\n",base64_encode($cipherText));
}
Результат:
Код:
clearText: Hello World!

256-bit blowfish encrypted:
GzPEICvhvK7TZyhPbkRCzw==

Код на яве:
Код:
package com.example.xcrypttest;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import android.app.Activity;
import android.os.Bundle;
import android.util.Base64;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	TextView viText1, viText2;
	static final String IV_MY = "87654321";
	static final String strkey = "1234567890123456ABCDEFGHIJKLMNOP";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		viText1 = (TextView) findViewById(R.id.ShowInfo1);
		
		String res1 = encryptBlowfish("Hello World!",strkey);
		viText1.setText(res1);
	}

	 
	public static String encryptBlowfish(String to_encrypt, String strkey) {
		try {
		    SecretKeySpec key = new SecretKeySpec(strkey.getBytes(), "Blowfish");
		    Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
		    
		    byte[] ivBytes = IV_MY.getBytes();
		    IvParameterSpec iv = new IvParameterSpec(ivBytes);

        		    cipher.init(Cipher.ENCRYPT_MODE, key, iv);
		    
		    
		    byte[] en = to_encrypt.getBytes();
		    byte[] enbt = cipher.doFinal(en);
		    String result1 = Base64.encodeToString(enbt, Base64.DEFAULT);
		    
		    return result1;//new String();
		} catch (Exception e) { return null; }
	}
		 
	
}
Результат:
Код:
GzPEICvhvK5T+z8xf/d6MA==
Видно что итоговый результат частично похож
подозреваю что связано с какими то скрытыми символами

Возможно с этим
// PHP pads with NULL bytes if $cleartext is not a multiple of the block size..


но не пойму как возможно это устранить
 

Вурдалак

Продвинутый новичок
Попробуй так:
PHP:
function padPKCS5($clearText, $blockSize = 16)
{
	$l = strlen($clearText);
	$m = $blockSize * ceil($l / $blockSize);

	return str_pad($clearText, $m, chr($m - $l));
}

$cleartext = padPKCS5('Hello World!');
P.S. Java ≠ JavaScript.
 

progr

Новичок
Спасибо помогли.
Нашел решение


PHP:
function pkcs5_pad($text, $blocksize) 
{ 
  $pad = $blocksize - (strlen($text) % $blocksize); 
  return $text . str_repeat(chr($pad), $pad); 
} 

$size_block = mcrypt_get_block_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);  // вернуло 8 а не 16
$cleartext = pkcs5_pad($cleartext,$size_block);
ПС
>>>P.S. Java ≠ JavaScript.
это я знаю.
написал выше - что просто не нашел более подходящей ветки
 

Вурдалак

Продвинутый новичок
Здесь, кстати, просто повезло, длина строки была между 8 и 16, поэтому я получил ту же строку, что ты получал с Java.
 
Сверху