代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

RSA加密,长度不正确

  •  47
  • JL. Hans Passant  · 技术社区  · 15 年前

    调用以下函数时:

    byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
    

    我现在得到了错误:长度错误。

    如果使用较小的字符串,那么我传递的字符串的问题可能在200个字符以下。

    3 回复  |  直到 6 年前
        1
  •  66
  •   Mitch Wheat    6 年前

    RSA加密只意味着少量的数据,您可以加密的数据量取决于您使用的密钥的大小,例如1024位RSA密钥和pkcs 1v1.5填充,您最多可以加密117个字节,使用2048个RSA密钥,您可以加密245个字节。

    这是一个很好的原因,不对称加密在计算上很昂贵。如果要加密大量数据,则应使用对称加密。但如果你想要不可抵赖呢?那么你要做的就是两者兼用。您创建一个对称密钥并使用非对称加密进行交换,然后安全地交换对称密钥来加密大量数据。这就是SSL和WS-Secure在封面下的用途。

        2
  •  41
  •   Mitch Wheat    6 年前

    有关RSA错误长度异常的未来搜索…

    您可以使用以下方法计算可使用特定密钥大小加密的最大字节数:

    ((KeySize - 384) / 8) + 37
    

    但是,如果最佳非对称加密填充(OAEP)参数为真(与原始日志中的参数相同),则可以使用以下参数计算最大字节:

    ((KeySize - 384) / 8) + 7
    

    法定密钥大小为384到16384,跳过大小为8。

        3
  •  16
  •   Patrick Hofman    8 年前

    如上所述,解决“长度差”类型异常的方法是混合使用对称和非对称加密,这样您正在加密的文本的大小就不受密钥大小的限制。您基本上使用RSA加密来不对称地加密随机数据 钥匙 .

    加密:

    1. 生成对称加密技术(如aes或rijndael)所需长度的随机密钥。

    2. 使用步骤1中生成的随机密钥,使用aes/rijndael对称地加密文本/数据。

    3. 使用RSA,不对称地加密步骤1中生成的随机密钥。

    解密:

    1. 首先使用您的私有RSA密钥解密AES/Rijndael生成的随机密钥。

    2. 然后使用RSA解密的随机密钥解密原始文本/数据

    对于演示,您可能希望查看下面C中的示例:

    http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/