Java GNU Crypto Encrypt返回空字符串

Java GNU Crypto Encrypt返回空字符串,java,encryption,Java,Encryption,我正在使用GNU加密库对简单字符串进行加密。我相信我正确地遵循了文档,但问题是它只返回一个空白字符串(在本例中为5个字符)的空格。我不确定我是否错过了编码,或者是编码问题。我希望这不是一件令人尴尬的简单事情 import gnu.crypto.cipher.CipherFactory; import gnu.crypto.cipher.IBlockCipher; import java.util.HashMap; import java.util.Map; public class FTNSA

我正在使用GNU加密库对简单字符串进行加密。我相信我正确地遵循了文档,但问题是它只返回一个空白字符串(在本例中为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;
}

}
导入gnu.crypto.cipher.CipherFactory;
导入gnu.crypto.cipher.IBlockCipher;
导入java.util.HashMap;
导入java.util.Map;
公共类FTNSAMIN{
公共静态void main(字符串[]args)引发异常{
String data=“苹果”;
String key=“ABCDEFGHIJKLMNOP”;
byte[]temp=Encrypt(data.getBytes(),key.getBytes(),“AES”);
System.out.println(新字符串(temp));
}
公共静态字节[]加密(字节[]输入,字节[]密钥,字符串算法)引发异常{
字节[]输出=新字节[input.length];
IBlockCipher=CipherFactory.getInstance(算法);
Map attributes=newhashmap();
attributes.put(IBlockCipher.CIPHER\u块大小,16);
attributes.put(IBlockCipher.KEY\u材质,KEY);
cipher.init(属性);
int bs=cipher.currentBlockSize();
对于(int i=0;i+bs
GNU加密文档对
void encryptBlock(..)
方法有以下说明:

从inOffset开始加密明文中的字节块,存储 密文中的加密字节,从outOffset开始。这取决于 程序员必须确保至少有一个完整的块 密文中一个完整块的inOffset和空格中的明文 自上而下。如果发生以下情况,将引发java.lang.IllegalStateException 密码尚未初始化

你的意见:

String data = "Apple";
不是完整的数据块,因为AES需要16字节的数据块。此外,输出缓冲区也太短

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

String data = "Apple56789abcdef";

GNU加密文档对
void encryptBlock(..)
methode有以下说明:

从inOffset开始加密明文中的字节块,存储 密文中的加密字节,从outOffset开始。这取决于 程序员必须确保至少有一个完整的块 密文中一个完整块的inOffset和空格中的明文 自上而下。如果发生以下情况,将引发java.lang.IllegalStateException 密码尚未初始化

你的意见:

String data = "Apple";
不是完整的数据块,因为AES需要16字节的数据块。此外,输出缓冲区也太短

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

String data = "Apple56789abcdef";

byte[]
可能包含您试图打印的不可打印字符。您应该将结果编码为Base64或十六进制,以便查看它。@ArtjomB。我尝试将结果转换为十六进制,但得到的结果是“0000000000”。
byte[]
可能包含您试图打印的不可打印字符。您应该将结果编码为Base64或十六进制,以便查看它。@ArtjomB。我尝试将结果转换为十六进制,但得到的结果是“0000000000”。要加密最后一个块(在本例中是唯一的块),也可以使用
加密最后一个块(在本例中是唯一的块),也可以使用