Unable to exchange data encrypted with AES-256 between Java and PHP

前端 未结 4 1562
陌清茗
陌清茗 2020-12-04 22:51

My problem is: what I encrypt in Java I can decrypt perfectly in Java, but PHP mcrypt can\'t decrypt. What I encrypt with mcrypt I can decrypt with

4条回答
  •  無奈伤痛
    2020-12-04 23:36

    BUG#1

    MCRYPT_RIJNDAEL_256 is not AES. The 256 in that constant refers to the blocksize, not the keysize. Use MCRYPT_RIJNDAEL_128 to get the same algorithm as AES. The keysize is set just by the number of bytes in the key argument you supply. So supply 32 bytes and you get AES with a 256-bit key.

    BUG#2

    These two lines are never correct in Java and indicate a fundamental misunderstanding of the nature of the arbitrary binary data produced by cryptographic transforms:

    output = cipher.doFinal(Base64.decodeBase64(input));
    return new String(output);
    

    There is nothing wrong with transmitting and storing byte[] directly, but if you must use only printable strings then you should base64 encode/decode to do so. As you are already using base64 extensively that would seem like the way to go. I would guess that the correct two lines would be:

    output = cipher.doFinal(Base64.decodeBase64(input));
    return new String(Base64.encodeBase64(output), "UTF-8");
    

    EDIT:

    Just kidding about bug #2. Really, I was wrong, I didn't notice it was the decrypt direction. Of course, if you know the decrypted byte[] is a valid string then it is perfectly correct to do what your code does.

提交回复
热议问题