【问题标题】:What is the encrypted data size for RSA encryption using blocks使用块的 RSA 加密的加密数据大小是多少
【发布时间】:2017-11-28 13:48:37
【问题描述】:

我有使用 BouncyCastle 库进行 RSA 加密的 c# 代码:

public string EncryptData(string publicKey, string data)
{
    try
    {
        var bytesToEncrypt = Encoding.UTF8.GetBytes(data);
        int srclen = bytesToEncrypt.Length;

        //Prepare encryption engine
        var encryptEngine = new Pkcs1Encoding(new RsaEngine());

        //Initialize Key
        using (var txtreader = new StringReader(publicKey))
        {
            var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
            encryptEngine.Init(true, keyParameter);
        }

        //Encrypt in loop
        byte[] complete = new byte[0];
        int src_block_size = encryptEngine.GetInputBlockSize();
        for (int idx = 0; idx < srclen; idx += src_block_size)
        {
            int data_len = srclen - idx;
            if (data_len > src_block_size)
            {
                data_len = src_block_size;
            }

            var encryptedChunk = encryptEngine.ProcessBlock(bytesToEncrypt, idx, data_len);
            complete = CombineByteArrays(complete, encryptedChunk);
        }

        var finalString = Convert.ToBase64String(complete);
        return finalString;
    }
    catch (InvalidCipherTextException)
    {

    }
}

如您所见,它将数据分块并加密每个块。当我加密数据时,我可以看到finalstring 是可变大小的(请注意finalString 基本上是加密字节的base64 编码)。不确定决定长度的因素是什么,以及它是我可以依赖的固定模式还是不确定的。我需要确保finalString 在限制范围内(字符数)。

【问题讨论】:

  • 使用 RSA 作为分组密码是一个非常糟糕的主意,仅供参考......

标签: c# encryption cryptography bouncycastle


【解决方案1】:

加密 RSA 块的大小由密钥大小决定。 RSA 块中可以加密的数据量同时还取决于 RSA 密钥的大小减去填充占用的数据量.

通常 RSA 不应该用于批量加密,因为它非常慢(可能是 1000 倍)并且由于填充(您应该使用它)在每个块上都有开销。如果您确实需要 RSA 中的两个密钥,您应该使用hybrid encryption 方法。如果您实际上不需要这两个密钥,那么您需要正确使用像 AES 这样的对称密码。此外,使用对称加密时,您将获得开箱即用的阻塞支持,这与 RSA 不同。

【讨论】:

  • 所以输入数据对我们来说永远不会超过 5kb,所以从我的阅读来看,使用 RSA 加密应该是可以的。我们使用的密钥大小是 1024 位。所以这是我的问题,考虑到我也在做 base64 编码,是否有一个固定的模式,base64 编码会增加数据大小?还是为了安全起见,我应该假设 base64 编码会进一步增加 40% 的长度?
  • 当您使用多个 RSA 块时,您误用了 RSA。从安全的角度来看,1024 位 RSA 密钥太小了。此外,谁将解密这个加密它的同一个人?如果是同一个人/系统,那么您实际上不需要两个密钥-使用 RSA 过度杀伤-然后像 AES 这样的对称方法会更适合。至于 Base64 编码:它将输出增加了大约。 33%。
  • 我想这回答了我的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2014-02-21
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多