我正在使用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;
}
}
答案 0 :(得分:0)
GNU Crypto文档有关于void encryptBlock(..)
方法的以下内容:
从inOffset开始,从明文加密一个字节块,存储 密文中的加密字节,从outOffset开始。它取决于 程序员确保至少有一个完整的块 inOffset中的明文和密文中一个完整块的空格 来自outOffset。如果是,则抛出java.lang.IllegalStateException 密码尚未初始化。
您的意见:
String data = "Apple";
不是完整数据块,因为AES需要 16字节块中的数据。此外,您的输出缓冲区也太短。
对于初学者,尝试使用最终为16个字节的输入进行加密,如:
String data = "Apple56789abcdef";