Вот пример кода с измененными значениями ключа и полезной нагрузкой:
$key = '/4rTInjwg/H/nA=='; $key = base64_decode($key); $data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|'; $data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|'; $data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|'; $data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|'; $result = base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key, $data, MCRYPT_ENCRYPT));
Это шифрует и расшифровывает в PHP, но Java и .NET приходят с разными значениями, и что еще хуже, я не могу расшифровать результаты с Java или .NET. Когда я пытаюсь расшифровать значения из java, я получаю строку, которая начинается справа, но заканчивается мусором на полпути. Я работаю в 5.3x в Windows XP, если кто-нибудь задается вопросом.
В то время как я STFW, я заметил несколько потоков, в которых последние комментарии упоминают о том, что base64 испортил результат из-за проблем с вводом текста, и мне интересно, так ли это, потому что результаты так близки, первые 50 или около того символов совпадают , тогда все идет на @ # $ !.
Я также прочитал несколько потоков о размере блока и дополнении, но никто не может согласиться с тем, что должно быть дополнением. Мне действительно нужно знать, добавляет ли Java текст, каков размер блока по умолчанию, какова будет панель? Смотри ниже:
Разработчик Java:
import org.apache.commons.codec.binary.Base64; import java.util.ResourceBundle; import com.sun.crypto.provider.SunJCE; ... snip ... StringBuffer ourTransferBuffer = new StringBuffer(s); byte abyte0[] = Base64.decodeBase64(encryptionKey); SunJCE sunjce = new SunJCE(); Security.addProvider(sunjce); SecretKeySpec secretkeyspec = new SecretKeySpec(abyte0, "Blowfish"); Cipher cipher = Cipher.getInstance("Blowfish"); cipher.init(1, secretkeyspec); byte abyte1[] = cipher.doFinal(ourTransferBuffer.toString().getBytes()); s = Base64.encodeBase64String(abyte1); return s; ... snip ...
Я уже слишком много времени сжигал, у кого есть идеи? Благодарю.
Выяснив это, простую pkcs5 дополнением исправила проблему.
... snip ... $data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|'; $data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|'; $data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|'; $data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|'; $blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size $pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length $data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data // encrypt and encode $res = base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key, $data, MCRYPT_ENCRYPT));