Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在新数组或ArrayList AES加密中存储45个字符_Java_Arrays_Encryption_Arraylist_Aes - Fatal编程技术网

Java在新数组或ArrayList AES加密中存储45个字符

Java在新数组或ArrayList AES加密中存储45个字符,java,arrays,encryption,arraylist,aes,Java,Arrays,Encryption,Arraylist,Aes,我有一个AES 128位加密方法,可以对消息进行加密。但它不会加密长度超过45个字符的消息。因此,我在想,如果我可以通过将长度超过45个字符的消息拆分为大小为45个字符的数组或数组列表来实现这一点,那么我可以一次加密每个块 因此,如果我有一个长90的消息,我应该有两个数组,每个数组的大小为45(或者数组的大小为2,每个数组的大小为45字符)。或者一个arraylist来做这件事。如果我有一个长180的消息,那么我应该有一个由4个数组组成的块 更新:所以我的首要问题是无法在客户端-服务器聊天中使用

我有一个AES 128位加密方法,可以对消息进行加密。但它不会加密长度超过45个字符的消息。因此,我在想,如果我可以通过将长度超过45个字符的消息拆分为大小为45个字符的数组或数组列表来实现这一点,那么我可以一次加密每个块

因此,如果我有一个长90的消息,我应该有两个数组,每个数组的大小为45(或者数组的大小为2,每个数组的大小为45字符)。或者一个arraylist来做这件事。如果我有一个长180的消息,那么我应该有一个由4个数组组成的块

更新:所以我的首要问题是无法在客户端-服务器聊天中使用AES加密发送长消息。

以下是AES实现的代码,但没有任何填充或IV

首先我有一个客户;谁发送使用下面的AESmsgEncryption类加密的消息

客户端类

    public void send(String sendMessage) {

        userName = GUI.getUserName();

        //each index of the array will contain a substring of the send message (maximum length 45 char)
        if (sendMessage.length() > 45) {
//      String [] arrayOfStrings = new String[sendMessage.length()/45];
        int sizeOfArray = sendMessage.length()/45;
        System.out.println("CANT SEND MESSAGES LONGER THAN 45");

        } else {    

            String ciphertext  = msgAESEnDe.encryptAES(sendMessage, scrtkey);
            System.out.println(userName + ": " + ciphertext + "  <-- encrypted before sending");
            out.println(userName + "#ciphertext$" + ciphertext);
            out.flush();

        }
}
String username = recMessage.substring(0, recMessage.indexOf(' '));
                String ciphertxtWithNoName = recMessage.substring(recMessage.indexOf(':') + 2);

                scrtkey = new SecretKeySpec(secrtKeyByte, "AES");

                String plaintext = msgAESEnDe.decryptedPlain(ciphertxtWithNoName, scrtkey);
                System.out.println(username +" " + plaintext +"  <-- after decryption");

                //current time
                String time = log.format(new Date());

                // Displaying received message.
                ClientGUI.TA_CONVERSATION.append(time+ " ["+username.substring(0, username.length()-1) + "]: " + plaintext + "\n");
AES密钥在服务器端生成,并使用RSA加密发送,然后发送到每个客户端,这就是为什么在客户端,我必须在调用encryptAES和decryptedPlain方法时提供scrtkey的原因

重新陈述我的问题;上述代码无法发送超过45个字符的消息,如何使其发送超过45个字符的消息?如果我需要使用填充和IV,服务器应该发送IV和密钥,对吗

我希望上面的描述是清楚的

我如何在JAVA中做到这一点


谢谢

我想你可以这样做:

int length=input.length();
for(int i=0; i<length; i+=45) {
    encrypt(input.substring(i, i+45<=length ? i+45 : length ));
}
int length=input.length();

对于(int i=0;i,您得到的这种填充通常与密码的任何限制无关。这是因为:

  • 您在通信过程中丢失了数据
  • 您在编码/解码过程中丢失了数据
  • 最后一个是最有可能的,如果使用随机IV或键,很可能是随机发生的。在这种情况下,拆分字符串可能只是暂时隐藏问题,而不是解决问题

    如果密文作为字符串数据处理,则应使用base 64编码。通过将其视为十六进制字符串,确保加密方法之后和解密方法之前的完整密文(以字节为单位)相同


    AES可以轻松加密千兆字节的信息(尽管安全性取决于用例和操作模式)。拆分明文应该没有必要。

    我已经解决了这个问题,这是因为密文很长,所以密文最终会进入一个新行。所以我只是删除了新行,然后它就工作了。稍后我已经实现了CBC和IV。感谢您的澄清。
    int length=input.length();
    for(int i=0; i<length; i+=45) {
        encrypt(input.substring(i, i+45<=length ? i+45 : length ));
    }