代码之家  ›  专栏  ›  技术社区  ›  Ranjithkumar

未使用RSA加密加密的大数据

  •  7
  • Ranjithkumar  · 技术社区  · 7 年前

    我的问题:

    我的加密代码 64个字符以下可正常工作 . 但如果超过64个字符,我会得到以下错误

    javax.crypto.IllegalBlockSizeException: input must be under 64 bytes
    

    加密码

            cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding);
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
            rsaEncrypted= Base64.encodeToString(encryptedBytes, Base64.NO_WRAP);
    

    密钥生成代码

          KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
          keyGen.initialize(512);
          KeyPair keypair = keyGen.genKeyPair();
          PublicKey pub = keypair.getPublic();
          byte[] pubs = pub.getEncoded();
    

    我的问题是:

    有可能用512位密钥加密大文本吗?我的密码有误吗?

    注意:如果有人想要完整的代码,我稍后会更新。

    2 回复  |  直到 7 年前
        1
  •  8
  •   Indra Basak    7 年前

    这是一本开创性的书名为 Cryptography Engineering 弗格森,施奈尔和科诺,

    加密消息是RSA的标准应用,但它是 几乎从未在实践中使用过 . 原因很简单: 可以使用RSA加密的消息的大小受n的大小限制 . 在实际系统中,甚至不能使用所有位,因为编码函数有开销。这个 限制邮件大小 也是 不切实际的 对于大多数应用程序,并且由于RSA操作是 很贵的 在计算方面,您不希望将消息分成更小的块,并使用单独的RSA操作对每个块进行加密。

    换句话说,对于n位RSA密钥,数据RSA的最大长度可以以字节加密。

    Floor(n/8) - 11 
    

    其中11个字节用于填充

    因此,对于512位的密钥大小,可以加密的数据的最大长度是:

    512/8 - 11 = 53 bytes
    

    又从书本上 密码学工程 ,

    几乎所有地方使用的解决方案都是选择一个随机密钥K,并使用RSA密钥对K进行加密。然后使用分组密码或流密码用密钥K对实际消息m进行加密。所以不要发送像E这样的东西 RSA公司 (m) ,您发送E RSA公司 (K) ,英 (m) 是的。

    基本上,它告诉你做以下事情来克服RSA的限制,

    1. 生成密钥, K 使用AES等算法。
    2. 加密明文, m ,使用新生成的密钥获取密码文本,例如 (m) 是的。
    3. 加密密钥a RSA公钥,E RSA公司 (K) 是的。
    4. 向客户发送密码文本,E (m) ,以及加密密钥E RSA公司 (K) 是的。
    5. 客户端可以解密 RSA公司 (K) 使用RSA私钥 .
    6. 然后客户端解密密码文本,E (m) 用 得到 .
        2
  •  11
  •   Ebbe M. Pedersen    7 年前

    一个可以加密的字节数 RSA公司 块由使用的键大小减去填充所占用的任何字节决定。

    一般 RSA公司 不适合批量加密,因为它非常慢。而是使用对称加密算法,如 爱依斯 如果可以的话。如果您真的需要RSA的两个密钥,请使用混合方法,使用随机对称密钥加密数据,然后使用RSA密钥加密该密钥。

    使用对称加密的一个好处是库自动支持批量加密,而RSA则不支持批量加密。