以下是一些更改了键值和有效负载的示例代码:
$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 解密这些值时,我得到一个字符串,该字符串一开始是正确的,但中途却变成了垃圾。我正在 Windows XP 5.3x 中工作,以防有人想知道。
虽然我 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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)