criptografia C # RSA usando módulo e expoente público
-
09-09-2019 - |
Pergunta
Eu tenho que implementar um envelope digital usando AES e RSA, mas estou tendo problemas com a implementação .NET do algoritmo RSA.
Eu consegui criptografar os dados (AES) com a chave simétrica aleatória, mas agora eu tenho para criptografar a chave com RSA.
A chave é um array de bytes (byte[]
) e a chave pública que tenho me diz apenas o módulo e o expoente público, ambas as matrizes de bytes (byte[]
).
Usando apenas os dois parâmetros, como posso criptografar meu AES chave gerada com RSA?
O código a seguir recupera a mensagem do arquivo e criptografa com AES.
Depois, a chave pública é lido a partir do arquivo de chave pública e o módulo eo expoente estão em suas matrizes de bytes apropriadas. Como eu poderia continuar para criptografar o symmetricKey
com RSA?
String msgString = Systematic.GetFileContents(messagePath);
Byte[] initVector = new byte[] { 50, 60, 70, 80, 90, 40, 50, 60, 70, 80, 90, 40, 60, 80, 70, 90 };
Byte[] symetricKey = AesCrypt.GenerateRandomKey();
Byte[] encryptedMessage = AesCrypt.Encrypt(msgString, symetricKey, initVector, mode);
Byte[] modulus = null;
Byte[] publicExp = null;
DataFormatHelper.ReadPublicKey(publicKeyPath, "RSA", ref modulus, ref publicExp);
P.S. Em resposta à rsa.ImportParameters
resposta menção:
Eu tentei com o rsa.ImportParameters(keyInfo)
mas ele lança um CryptographicException
("Bad Data"
). E sobre tamanhos de matriz?
Actualmente, o módulo é de 128 bytes e o expoente 64 bytes.
Solução
Usando RSACryptoServiceProvider
static public byte[] RSAEncrypt(byte[] data,
RSAParameters keyInfo,
bool doOAEPPadding)
{
byte[] encryptedData;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
//Import the RSA Key information. This only needs
//toinclude the public key information.
rsa.ImportParameters(keyInfo);
//Encrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or later.
encryptedData = rsa.Encrypt(data, doOAEPPadding);
}
return encryptedData;
}
Então, o que você precisa são os RSAParameters mas tudo que você precisa conjunto são a Modulus eo expoente para criptografar.