【问题标题】:mcrypt blowfish php slightly different results when compared to java and .net与 java 和 .net 相比,mcrypt blowfish php 结果略有不同
【发布时间】:2011-03-18 15:50:41
【问题描述】:

以下是一些更改了键值和有效负载的示例代码:

$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,但我注意到几个线程中最后一个 cmets 提到了关于 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 ...

我已经在这方面花费了太多时间,这里有人有什么想法吗?谢谢。

【问题讨论】:

    标签: java php mcrypt blowfish


    【解决方案1】:

    想通了,简单的 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));
    

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 2011-01-22
      • 1970-01-01
      • 2016-04-18
      • 2015-07-12
      • 2012-01-28
      • 1970-01-01
      • 2014-01-29
      • 2021-04-19
      相关资源
      最近更新 更多