public byte[] Encrypt(Stream msg, string key = null) { try { byte[] encryptedData; int blockSize = 0; using (var rsa = RSA.Create()) { blockSize = RSAParametersKey.GetMaxBlockSize(rsa, RSAEncryptionPadding.Pkcs1); RSAParametersKey.SetRSAKeys(rsa, key); if (msg.Length <= blockSize) { var buffer = new Byte[msg.Length]; msg.Read(buffer, 0, buffer.Length); return(rsa.Encrypt(buffer, RSAEncryptionPadding.Pkcs1)); } using (var plaiStream = new BufferedStream(msg)) { using (var crypStream = new MemoryStream()) { var offSet = 0; var inputLen = msg.Length;//总长 //循环 for (int i = 0; inputLen - offSet > 0; offSet = i * blockSize) { //剩余数量足够 if (inputLen - offSet > blockSize) { var buffer = new Byte[blockSize]; plaiStream.Read(buffer, 0, blockSize);//读取到数组中 var reslut = rsa.Encrypt(buffer, RSAEncryptionPadding.Pkcs1); crypStream.Write(reslut, 0, reslut.Length); } else { var buffer = new byte[inputLen - offSet]; plaiStream.Read(buffer, 0, buffer.Length); var reslut = rsa.Encrypt(buffer, RSAEncryptionPadding.Pkcs1); crypStream.Write(reslut, 0, reslut.Length); } ++i; } crypStream.Position = 0; encryptedData = crypStream.ToArray(); } } } return(encryptedData); } catch (Exception ex) { throw ex; } }
public byte[] Decrypt(byte[] msg, string sKey = null) { byte[] decryptedData; using (var rsa = RSA.Create()) { int blockSize = RSAParametersKey.GetMaxBlockSize(rsa, RSAEncryptionPadding.Pkcs1) + 11; RSAParametersKey.SetRSAKeys(rsa, sKey); using (var plaiStream = new MemoryStream(msg)) { using (var decrypStream = new MemoryStream()) { var offSet = 0; var inputLen = msg.Length; for (var i = 0; inputLen - offSet > 0; offSet = i * blockSize) { if (inputLen - offSet > blockSize) { var buffer = new byte[blockSize]; plaiStream.Read(buffer, 0, blockSize); //读取密文 var decrypData = rsa.Decrypt(buffer, RSAEncryptionPadding.Pkcs1); //解密 decrypStream.Write(decrypData, 0, decrypData.Length); } else { var buffer = new byte[inputLen - offSet]; plaiStream.Read(buffer, 0, buffer.Length); var decrypData = rsa.Decrypt(buffer, RSAEncryptionPadding.Pkcs1); decrypStream.Write(decrypData, 0, decrypData.Length); } ++i; } decrypStream.Position = 0; decryptedData = decrypStream.ToArray(); } } } return(decryptedData); }