GNU Crypto Encrypt返回空字符串

时间:2015-08-16 21:30:15

标签: java encryption

我正在使用GNU Crypto库来加密简单的字符串。我相信我已经正确地遵循文档,但问题是它只返回一个空格字符串(在本例中为5个字符)的空格。我不确定我是否错过了编码或是否有一些编码问题。我希望它不是一件令人尴尬的事情。

import gnu.crypto.cipher.CipherFactory;
import gnu.crypto.cipher.IBlockCipher;
import java.util.HashMap;
import java.util.Map;

public class FTNSAMain {

public static void main(String[] args) throws Exception {
    String data = "Apple";
    String key = "ABCDEFGHIJKLMNOP";

    byte[] temp = Encrypt(data.getBytes(), key.getBytes(), "AES");
    System.out.println(new String(temp));
}

public static byte[] Encrypt(byte[] input, byte[] key, String algorithm) throws Exception {
    byte[] output = new byte[input.length];

    IBlockCipher cipher = CipherFactory.getInstance(algorithm);
    Map attributes = new HashMap();

    attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, 16);
    attributes.put(IBlockCipher.KEY_MATERIAL, key);
    cipher.init(attributes);

    int bs = cipher.currentBlockSize();
    for (int i = 0; i + bs < input.length; i += bs) {
        cipher.encryptBlock(input, i, output, i);
    }
    return output;
}

}

1 个答案:

答案 0 :(得分:0)

GNU Crypto文档有关于void encryptBlock(..)方法的以下内容:

  

从inOffset开始,从明文加密一个字节块,存储   密文中的加密字节,从outOffset开始。它取决于   程序员确保至少有一个完整的块   inOffset中的明文和密文中一个完整块的空格   来自outOffset。如果是,则抛出java.lang.IllegalStateException   密码尚未初始化。

您的意见:

String data = "Apple";

不是完整数据块,因为AES需要 16字节块中的数据。此外,您的输出缓冲区也太短。

对于初学者,尝试使用最终为16个字节的输入进行加密,如:

String data = "Apple56789abcdef";