4

キー値とペイロードを変更したコード例を次に示します。

$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 ...

私はすでにこれに多くの時間を費やしてきました。誰かここに何かアイデアがありますか? ありがとう。

4

1 に答える 1

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));
于 2010-07-20T21:41:40.983 に答える