RSA加密,不受字节长度限制
2010-08-24 18:38
190 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using System.Security.Cryptography; namespace VDS.Utils { class CRSAEncrypt { /// <summary> /// /// </summary> /// <param name="priKey">私钥</param> /// <param name="pubKey">公钥</param> /// <returns>ERROR -1:key生成出错 /// NOERROR 0:key生成成功 /// </returns> static public int GEN_Key(out string priKey, out string pubKey) { priKey = null; pubKey = null; //OAEP padding is only available on Microsoft Windows XP or later try { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); pubKey = Convert.ToBase64String(RSA.ExportCspBlob(false)); priKey = Convert.ToBase64String(RSA.ExportCspBlob(true)); RSA.Clear(); } catch (Exception e) { return -1; } return 0; } /// <summary> /// RSA解密 /// </summary> /// <param name="scFileName">打开文件</param> /// <param name="svFileName">保存文件</param> /// <param name="prikey">私钥</param> /// <returns>ERROR -1:解密出错 1:参数不能为NULL 2:其它错误 /// NOERROR 0:解密成功 /// </returns> static public int RSADecrypt(String scFileName, String svFileName, String prikey) { byte[] DataToDecrypt = null; byte[] DecryptedData = null; if (scFileName == null || svFileName == null || prikey == null || scFileName.Length == 0 || svFileName.Length == 0) return 1; if (!File.Exists(scFileName)) return 1; try { Stream bstrm = File.Open(scFileName, FileMode.Open, FileAccess.Read); DataToDecrypt = new byte[bstrm.Length]; bstrm.Read(DataToDecrypt, 0, (int)bstrm.Length); bstrm.Close(); } catch (Exception ex) { return 2; } try { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); byte[] keybuff = Convert.FromBase64String(prikey); RSA.ImportCspBlob(keybuff); int keySize = RSA.KeySize / 8; byte[] buffer = new byte[keySize]; MemoryStream msInput = new MemoryStream(DataToDecrypt); MemoryStream msOutput = new MemoryStream(); int readLen = msInput.Read(buffer, 0, keySize); while (readLen > 0) { byte[] dataToDec = new byte[readLen]; Array.Copy(buffer, 0, dataToDec, 0, readLen); byte[] decData = RSA.Decrypt(dataToDec, false); msOutput.Write(decData, 0, decData.Length); readLen = msInput.Read(buffer, 0, keySize); } msInput.Close(); DecryptedData = msOutput.ToArray(); //得到解密结果 msOutput.Close(); RSA.Clear(); } catch (CryptographicException e) { return -1; } if (DecryptedData == null) return 2; try { Stream wstrm = File.Open(svFileName, FileMode.Create, FileAccess.Write); wstrm.Write(DecryptedData, 0, DecryptedData.Length); wstrm.Flush(); wstrm.Close(); } catch (Exception exc) { return 2; } return 0; } /// <summary> /// 加密 /// </summary> /// <param name="scFileName">打开文件</param> /// <param name="svFileName">保存文件</param> /// <param name="pubkey">公钥</param> /// <returns>ERROR -1:加密出错 1:参数不能为NULL /// NOERROR 0:加密成功 /// </returns> static public int RSAEncrypt(String scFileName, String svFileName, String pubkey) { byte[] DataToEncrypt = null; byte[] EncryptedData = null; if (scFileName == null || svFileName == null || pubkey == null || scFileName.Length == 0 || svFileName.Length == 0) return 1; if (!File.Exists(scFileName)) return 1; try { Stream bstrm = File.Open(scFileName, FileMode.Open, FileAccess.Read); DataToEncrypt = new byte[bstrm.Length]; bstrm.Read(DataToEncrypt, 0, (int)bstrm.Length); bstrm.Close(); } catch (Exception ex) { return 2; } try { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); byte[] keybuff = Convert.FromBase64String(pubkey); RSA.ImportCspBlob(keybuff); int keySize = RSA.KeySize / 8; int bufferSize = keySize - 11; byte[] buffer = new byte[bufferSize]; MemoryStream msInput = new MemoryStream(DataToEncrypt); MemoryStream msOutput = new MemoryStream(); int readLen = msInput.Read(buffer, 0, bufferSize); while (readLen > 0) { byte[] dataToEnc = new byte[readLen]; Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = RSA.Encrypt(dataToEnc, false); msOutput.Write(encData, 0, encData.Length); readLen = msInput.Read(buffer, 0, bufferSize); } msInput.Close(); EncryptedData = msOutput.ToArray(); //得到加密结果 msOutput.Close(); RSA.Clear(); } catch (CryptographicException e) { return -1; } if (EncryptedData == null) return 2; try { Stream wstrm = File.Open(svFileName, FileMode.Create, FileAccess.Write); wstrm.Write(EncryptedData, 0, EncryptedData.Length); wstrm.Flush(); wstrm.Close(); } catch (Exception exc) { return 2; } return 0; } } }
相关文章推荐
- JAVA利用RSA加密算法的长度限制问题解决方案注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的,如
- Tomcat服务器如何配置Post提交数据长度不受限制
- iOS 限制textField字节长度
- SQL解密破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器
- RSA加密解密(无数据大小限制go实现)
- c# RSA 加密解密 java.net公钥私钥转换 要解密的模块大于128字节
- 破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器
- UITextFiled、UITextView按字节限制输入长度
- RSA 加密长度计算公式
- dedecms 文章标题 产品名称 长度不受限制 终极修改
- JavaScript:文本框长度限制20个字节,中文位2个字节
- SQL0670N 表的行长度超过 "4005" 字节的限制。(表空间 "USERSPACE1"。)
- dedecms 文章标题 产品名称 长度不受限制 终极修改
- C#使用RSA证书文件加密和解密示例(任意长度的内容)
- 记一次30位密钥长度RSA加密破解过程
- RSA不限长度非对称加密解密C#
- JCE加密长度限制解除
- dedecms 文章标题 产品名称 长度不受限制 终极修改
- Java数据加密时密码的长度限制
- DedeCMSv5.7 tag标签长度限制12字节修改方法