C#中的大数据RSA加密

Sim*_*off 8 c# encryption rsa encryption-asymmetric

这是我的第一篇文章,所以希望我没有错过任何重要的内容.我在C#中做一个项目,我需要使用公钥/私钥加密来加密消息,然后通过SSL连接发送它.

我选择使用RSACryptoService,根据文档,这是唯一用于加密数据的非对称加密方案.问题是我遇到了很多问题.(我想做对称加密,但这不是我老师要我做的事情,根据他的说法,确定块大小应该很容易,然后它应该为你完成所有的工作.)好吧,到目前为止没有运气,我尝试了一些不同的方法,但现在我又回到了基础并再次尝试,这是我目前的代码:

    public string[] GenerateKeysToStrings(string uniqueIdentifier)
    {
        string[] keys;
        using (var rsa = new RSACryptoServiceProvider(4096))
        {
            try
            {
                string privateKey = rsa.ToXmlString(true);
                string publicKey = rsa.ToXmlString(false);

                this.pki.StoreKey(publicKey, uniqueIdentifier);

                keys = new string[2];
                keys[0] = privateKey;
                keys[1] = publicKey;
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return keys;
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我生成密钥并通过将公钥发送到存储它的简单类来模仿PKI,然后将私钥写入文件(请注意,我还有另一种方法可以执行相同操作但是IT卖场,而不是,只是因为我想测试和简化的东西,因为我得到一个数组No such key exceptions,有时加密例外,当我做到这一点的例子所示的方式,所以我想通过简单的存储简化它rsa.ToXmlString的字符串,如在弦一个数组,但没有运气.)

现在我有一个加密和解密方法如下:

    public string Encrypt(string keyString, string message)
    {
        string encryptedMessage;
        using (var rsa = new RSACryptoServiceProvider())
        {
            try
            {
                //// Load the key from the specified path
                var encryptKey = new XmlDocument();
                encryptKey.Load(@"C:\Test\PrivateKeyInfo.xml");
                rsa.FromXmlString(encryptKey.OuterXml);


                //// Conver the string message to a byte array for encryption
                //// var encoder = new UTF8Encoding();
                ASCIIEncoding byteConverter = new ASCIIEncoding();
                byte[] dataToEncrypt = byteConverter.GetBytes(message);

                byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);

                //// Convert the byte array back to a string message
                encryptedMessage = byteConverter.GetString(encryptedData);
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return encryptedMessage;
    }
Run Code Online (Sandbox Code Playgroud)

解密:

    public string Decrypt(string keyString, string message)
    {
        string decryptedText;
        using (var rsa = new RSACryptoServiceProvider())
        {
            try
            {
                //// Loads the keyinfo into the rsa parameters from the keyfile
                /*
                var privateKey = new XmlDocument();
                privateKey.Load(keyString);
                 */
                rsa.FromXmlString(keyString);

                //// Convert the text from string to byte array for decryption
                ASCIIEncoding byteConverter = new ASCIIEncoding();
                var encryptedBytes = byteConverter.GetBytes(message);

                //// Create an aux array to store all the encrypted bytes
                byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);

                decryptedText = byteConverter.GetString(decryptedBytes);
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return decryptedText;
    }
Run Code Online (Sandbox Code Playgroud)

我知道这是一面文字,但我希望你可以帮助我,因为我已经在墙上撞了很长时间,现在这不好笑:)

问题是,如何使用RSA(或任何其他公钥/私钥加密)加密消息

这是测试客户端:

    public static void Main(string[] args)
    {
        PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
        Cryptograph crypto = new Cryptograph();
        string[] keys = crypto.GenerateKeysToStrings("simonlanghoff@gmail.com");


        string plainText = "Hello play with me, please";
        string publicKey = crypto.GetPublicKey("simonlanghoff@gmail.com");

        string encryptedText = crypto.Encrypt(keys[0], plainText);


        string decryptedText = crypto.Decrypt(keys[1], encryptedText);

    }
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,字符串数组是因为我想从XML文档中消除错误的解析错误...

当我运行测试客户端时,如果我使用私钥加密和公钥解密,我得到一个"密钥不存在异常",如果我反过来这样做,我得到一个错误的数据异常.

请帮帮我们,如果你知道任何好的指南,或者可以告诉我如何对字符串消息实施公钥/私钥加密,请帮帮我.

我感谢任何帮助.

pou*_*pou 6

这不是RSA加密应该如何完成的.

RSA是关于数学的.您加密的是一个数字,因此它必须是有限长度并且与您正在使用的RSA密钥对长度相匹配.使用的填充(PKCS#1或OAEP)会进一步限制长度.

如果要使用RSA加密大型数据,则需要间接进行 - 即使用对称密钥加密大数据并使用RSA公钥加密此密钥.

你可以阅读我实现这个博客.