Apache Shiro AES加密与预期输出不同

时间:2015-07-12 06:42:21

标签: java encryption shiro

我正在使用Apache Shiro的AesCipherService

出于某种原因,我无法像http://aesencryption.net/那样使用它。

我的代码基本上是这样的:

String encrypt(String input) throws Exception {
    StringBuilder builder = new StringBuilder();

    AesCipherService aesCipher = new AesCipherService();
    byte[] bytes = aesCipher.encrypt(input.getBytes(), "0123456789abcdef".getBytes()).getBytes();
    String aesProduct = new String(bytes);
    builder.append(aesProduct);

    byte[]   bytesEncoded = Base64.encodeBase64(builder.toString().getBytes()); 

    return new String(bytesEncoded);
}

如果您加密“Hello”,您将获得

Shvvv71GB++/vULvv73vv71/Zu+/vRIc77+977+9Y33bkmrvv70SOWffqXTvv71777+977+9

该网站何时输出

IM/5UIbDXWhuPz2ZFKyScQ==

我对代码做了什么错误?

1 个答案:

答案 0 :(得分:2)

看起来您可能不止一次进行Base 64编码。此外,site使用" ECB"模式,这不是Cipher中的默认模式。所以,你看到了输出的差异。加密和解密使用相同的算法非常重要。

以下是更正后的代码。

import org.apache.commons.codec.binary.Base64;
import org.apache.shiro.crypto.AesCipherService;

public class Test {

    public static void main(String[] args) throws Exception {
        System.out.println(encrypt("Hello"));
    }

    static String encrypt(String input) throws Exception {
        AesCipherService aesCipher = new AesCipherService();
        aesCipher.setModeName("ECB");
        byte[] bytes = aesCipher.encrypt(input.getBytes("UTF-8"), "0123456789abcdef".getBytes()).getBytes();
        byte[]   bytesEncoded = Base64.encodeBase64(bytes); 
        return new String(bytesEncoded);
    }
}

这会产生

xqkuF4FDmucSdb410R0HPw==

注意:这与site为同一输入产生的内容不同,但是,此字符串可以在site上解密。我不确定区别的原因是什么。

enter image description here