今天突然发现RSA对加密报文是有字数限制的TAT

发布时间 2023-11-22 11:14:59作者: 一语子

之前一直在用Hutool的RSA加密,从没碰到过字数限制问题,就也没仔细研究过RSA,hutool的好东西嘛都是开箱即用,主打一个能用就不细想(当然下面的事情说明要提升技术还是得多想想哈哈哈,不然碰到问题那是一脸懵)。

结果今天在和对接方沟通时,对方对着我提供的接口文档一顿捣鼓,接口入参需要进行RSA加密,我依旧是用hutool的RSA,但对方没有用,并且可能也没RSA分段加密经验,于是向我抛出一个javax.crypto.IllegalBlockSizeException: input must be under 256 bytes,即加密报文长度不能超过256bytes。

我拿着报错一搜,很快啊,啪的就出来了一大堆分段加密相关文章,表示明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。

看起来解决方法找到了,但我又有些疑惑为什么Hutoool的RSA任我传多长,它都岿然不动,毫不报错?莫非里面已经集成了分段加密?

我先查看了下Hutool的文档,里面只有使用方式,没提到这方面,于是又去看源码,顺着encryptBase64翻了五分钟,果然!hutool会先根据密钥拿到一个encryptBlockSize,再一路走到AsymmetricCrypto类的doFinal方法中,将加密报文长度与encryptBlockSize进行对比,决定是直接加密还是需要进行分段加密,最底层还是调的Cipher。

hutool里的分段加密主要代码:
    private byte[] doFinalWithBlock(byte[] data, int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException {
        int dataLength = data.length;
        FastByteArrayOutputStream out = new FastByteArrayOutputStream();
        int offSet = 0;

        for(int remainLength = dataLength; remainLength > 0; remainLength = dataLength - offSet) {
            int blockSize = Math.min(remainLength, maxBlockSize);
            out.write(this.getCipher().doFinal(data, offSet, blockSize));
            offSet += blockSize;
        }

        return out.toByteArray();
    }

差不多搞懂了,但以后当然还是继续用Hutool的傻瓜式操作哈哈哈>v<