当前位置: 首页 > 编程语言 > C#

C#中的大数据RSA加密分享

时间:2023-04-10 13:25:50 C#

C#学习教程:C#中的大数据RSA加密我正在用C#做一个项目,我需要在通过SSL连接发送消息之前使用公钥/私钥加密来加密消息。根据文档,我选择使用RSACryptoService,这是唯一一种用于加密数据的非对称加密方案。问题是我遇到了很多问题。(我想做对称加密,但那不是我老师要我做的,据他说,确定块大小应该很容易,然后它应该为你做所有的工作。)好吧,运气不好所以到目前为止,我尝试了一些不同的东西,但现在我回到基础并再次尝试,这是我当前的代码:publicstring[]GenerateKeysToStrings(stringuniqueIdentifier){string[]keys;使用(varrsa=newRSACryptoServiceProvider(4096)){try{stringprivateKey=rsa.ToXmlString(true);字符串publicKey=rsa.ToXmlString(false);this.pki.StoreKey(publicKey,uniqueIdentifier);键=新字符串[2];键[0]=私钥;键[1]=公钥;}finally{////清除RSA密钥容器,删除生成的密钥。rsa.PersistKeyInCsp=false;}}返回键;如您所见,我生成密钥并通过将公钥发送到存储它的简单类来传递MimicPKI,然后将私钥写入文件(请注意,我有另一个方法执行相同但将其存储到一个数组,只是因为我想测试并稍微简化一下,因为当我按照示例所示执行时,我没有得到这样的密钥异常,有时还有加密异常,所以我想通过简单地存储rsa来简化它.ToXmlString字符串,如在数组字符串中,但没有运气。)现在我有一个加密和解密方法如下:publicstringEncrypt(stringkeyString,stringmessage){stringencryptedMessage;using(varrsa=newRSACryptoServiceProvider()){try{////从指定路径加载密钥varencryptKey=newXmlDocument();encryptKey.Load(@"C:TestPrivateKeyInfo.xml");rsa.FromXmlString(encryptKey.OuterXml);////将字符串消息转换为字节数组进行加密////varencoder=newUTF8Encoding();ASCIIEncodingbyteConverter=newASCIIEncoding();byte[]dataToEncrypt=byteConverter.GetBytes(消息);byte[]encryptedData=rsa.Encrypt(dataToEncrypt,false);////将字节数组转换回字符串消息encryptedMessage=byteConverter.GetString(encryptedData);}finally{////清除RSA密钥容器,删除生成的密钥。rsa.PersistKeyInCsp=false;}}返回加密消息;}解密:publicstringDecrypt(stringkeyString,stringmessage){stringdecryptedText;使用(varrsa=newRSACryptoServiceProvider()){try{////从密钥文件中将密钥信息加载到rsa参数中/*varprivateKey=newXmlDocument();privateKey.Load(keyString);*/rsa.FromXmlString(keyString);////将文本从字符串转换为字节数组进行解密ASCIIEncodingbyteConverter=newASCIIEncoding();varencryptedBytes=byteConverter.GetBytes(消息);////创建一个辅助数组来存储所有加密字节byte[]decryptedBytes=rsa.解密(加密字节,假);decryptedText=byteConverter.GetString(decryptedBytes);}finally{////清除RSA密钥容器,删除生成的密钥。rsa.PersistKeyInCsp=false;}}返回解密文本;文本,但我希望你能帮助我,因为我已经用头撞墙这么久了,这不好笑:)问题是,如何使用RSA(或任何其他公钥/私钥加密)加密消息)这是测试客户端:publicstaticvoidMain(string[]args){PublicKeyInfrastructurepki=newPublicKeyInfrastructure();密码密码=新密码();string[]keys=crypto.GenerateKeysToStrings("simonlanghoff@gmail.com");秒stringplainText="你好,请和我一起玩";字符串publicKey=crypto.GetPublicKey("simonlanghoff@gmail.com");字符串encryptedText=crypto.Encrypt(keys[0],plainText);字符串decryptedText=crypto.Decrypt(keys[1],encryptedText);正如我提到的,字符串数组是因为我想从XML文档中消除错误的解析错误......当我运行测试客户端时,如果我用私钥加密并用公钥解密,我得到一个“密钥不存在异常”,如果我反过来做,我得到一个错误的数据异常如果你知道任何好的指南或者可以告诉我如何实现字符串消息公钥/私钥加密,请帮助我。我感谢任何帮助。这不是RSA加密应该如何完成的。RSA是关于数学的。您要加密的是一个数字,因此它的长度必须有限并且与您使用的RSA密钥对的长度相匹配。使用的填充(PKCS#1或OAEP)进一步限制了长度。如果要使用RSA加密大数据,则需要间接进行-即使用对称密钥加密大数据并使用RSA公钥加密此密钥。您可以在我的博客上阅读有关实现此内容的信息好的,我终于找到了解决我在原始帖子中描述的问题的方法。这是我还没有彻底测试过的东西,但我从一个小小的试错过程中发现了这一点。这是我当前的代码:publicstaticstringEncrypt(stringdataToEncrypt,RSAParameterspublicKeyInfo){////我们的字节数组用来保存加密后的所有数据byte[]encryptedBytes=newbyte[0];using(varRSA=newRSACryptoServiceProvider()){try{//创建一个新的RSACryptoServiceProvider实例。UTF8Encoding编码器=newUTF8Encoding();byte[]encryptThis=encoder.GetBytes(dataToEncrypt);////导入公钥RSA.ImportParameters(publicKeyInfo);intblockSize=(RSA.KeySize/8)-32;////写入给定块大小的字节序列的缓冲区byte[]buffer=newbyte[blockSize];byte[]encryptedBuffer=newbyte[blockSize];////将我们的encryptedBytes数组初始化为合适的大小,具体取决于要加密的数据大小encryptedBytes=newbyte[encryptThis.Length+blockSize-(encryptThis.Length%blockSize)+32];for(inti=0;iencryptThis.Length&&((encryptThis.Length-i)%blockSize!=0)){缓冲区=新字节[encryptThis.Length-i];blockSize=encryptThis.Length-i;}////如果我们需要解密的字节数不足以填充一个块,则仅解密其中的一部分,如果(encryptThis.Length///使用此密钥解密此消息/////////要解密的数据。/////////私钥信息。/////////解密后的数据。///publicstaticstringDecrypt(stringdataToDecrypt,RSAParametersprivateKeyInfo){////解密后保存我们所有数据的字节数组byte[]decryptedBytes;//创建一个新的RSACryptoServiceProvider实例。);////导入私钥信息RSA.ImportParameters(privateKeyInfo);////解密时不需要减去填充大小(或者我做吗?)intblockSize=RSA.KeySize/8;////buffer写入给定block_sizebyte[]buffer=的字节序列新字节[块大小];////包含解密信息的缓冲区byte[]decryptedBuffer=newbyte[blockSize];////初始化我们的数组以确保它至少可以容纳解密所需的数量。decryptedBytes=新字节[dataToDecrypt.Length];对于(inti=0;ibytesToDecrypt.Length&&((bytesToDecrypt.Length-i)%blockSize!=0)){buffer=newbyte[bytesToDecrypt.Length-i];blockSize=bytesToDecrypt。长度-i;}////如果我们需要解密的字节数不足以填满一个块,则只解密其中的一部分它应该这样做我对此还是个新手,所以我真的希望你仔细检查我的代码:)也许我遗漏了一些东西,但看起来你Encrypt()函数不使用keyString参数或加密密钥。以上就是《C#学习教程:C#大数据RSA加密分享》的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: