繁体   English   中英

使用RSA(Java)加密长字符串

[英]Encrypt long String with RSA (Java)

我在使用Java时遇到的RSA应用程序出现问题。

我必须从文件中读取一个字符串,对其进行加密,然后将加密的字符串保存在一个新文件中。

我的RSA密钥长度为1024位。

问题所在的代码部分如下:

            readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length);

            while(readBytes != -1){
                encodedContent = ciph.update(bytesToBeEncoded, 0, readBytes);
                out.write(encodedContent);
                bytesToBeEncoded= new byte[(KEY_SIZE/8)-11];
                readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length);                  
            }

            encodedContent = ciph.doFinal();
            out.write(encodedContent);

变量定义如下:

        byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

        FileInputStream in = new FileInputStream(new File(file1));
        FileOutputStream out = new FileOutputStream(new File(file2));
        int readBytes;

关键是当我加密一个小于117字节的字符串时,它完美地工作(加密然后解密),但是当大小更大时,应用程序抛出此异常:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

抛出:

encodedContent = ciph.doFinal();

我不知道问题出在哪里以及我必须做什么。

谁能帮助我? 谢谢。

抱歉我的英语。

问题在于如何初始化正在读取输入的字节数组。 您正在根据RSA密钥的大小而不是输入流的预期大小来设置大小。

byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11];

密钥大小为1024位,因此1024/8 -11 = 128 - 11 = 117字节。 这是您可以从流中读取的数据量,而不应与RSA密钥的大小相关。

您应该将字节数组初始化为您需要读入的最大数据大小,这将避免异常。 例如:

byte[] bytesToBeEncoded = 1024;

允许最大输入字符串为1024个字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM