Ошибка недопустимой длины при расшифровке шифрования Rsa - PullRequest
2 голосов
/ 13 июля 2020

Пожалуйста, помогите мне определить проблему в следующем коде шифрования RSA

public static void Test()
{
    CspParameters cspParams = new CspParameters { ProviderType = 1 };
    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);

    var PublicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));  //I have to save it as string in some json/app.config configuration file
    var PrivateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));  //I have to save it as string in some json/app.config configuration file
    
    var encrypt = EncryptText(PublicKey,  Encoding.UTF8.GetBytes(FromSomeFile()));
    
    var decrypt = DecryptData(PrivateKey, encrypt);
}

static byte[] EncryptText(string publicKey, byte[] dataToEncrypt)
{   
    byte[] encryptedData;
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {                
        rsa.ImportCspBlob(Convert.FromBase64String(publicKey));             
        encryptedData = rsa.Encrypt(dataToEncrypt, false);
    }
    return encryptedData;
}

// Method to decrypt the data withing a specific file using a RSA algorithm private key   
static string DecryptData(string privateKey, byte[] dataToDecrypt)
{
    
    // Create an array to store the decrypted data in it   
    byte[] decryptedData;
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        rsa.ImportCspBlob(Convert.FromBase64String(privateKey));              
        decryptedData = rsa.Decrypt(dataToDecrypt, false);
    }           
    
    return Encoding.UTF8.GetString(decryptedData, 0, decryptedData.Length); ;
}

1 Ответ

2 голосов
/ 15 июля 2020

RSA может использоваться только для шифрования сообщений, длина которых меньше модуля. Насколько меньше зависит от заполнения, например, 11 байт в случае PKCS # 1 v1.5, s. здесь . В случае OAEP количество байтов, требуемых заполнением, зависит от используемого дайджеста s. здесь . Подробности описаны в RFC8017, RSAES-PKCS1-v1_5 и RSAES-OAEP .
Для полноты: RSA без заполнения (учебник RSA) позволяет шифровать сообщения точно до длины модуля. Однако на практике заполнение всегда должно использоваться по соображениям безопасности, поэтому учебник RSA не является реальным вариантом.

Опубликованный код использует ключ RSA из 1024 бит и заполнение PKCS # 1 v1.5. Таким образом, максимальный размер сообщения, подлежащего шифрованию, составляет 117 байт. Сообщения большего размера вызывают исключение CryptographicException (недопустимая длина) . Это причина вашей проблемы.

8192-битный (1024 байт) ключ теоретически позволяет зашифровать сообщения длиной до 1013 байт с помощью PKCS # 1 v1.5 Padding. Однако производительность сильно снижается с увеличением размера ключа s. здесь .

Симметрия c шифрование более производительно, чем асимметрия c шифрование . Таким образом, на практике большие объемы данных шифруются с использованием симметричного c шифрования, например AES. Однако у шифрования symri c есть проблема, заключающаяся в том, что партнеры по обмену данными должны обмениваться ключом symri c. Для этой цели обычно используется асимметричное c шифрование, например RSA ( гибридное шифрование ), поскольку для шифрования необходимы только ключи publi c (которые, следовательно, могут передаваться по незащищенному каналу). Однако для предотвращения обманной замены ключей publi c ( man при атаке middel ) обычно требуется сложная инфраструктура publi c ключей .

...