求一个加密解密算法,需要支持长字符串(100以上甚至更多) 如题,希望答题前您自己先测试是否通过,谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static string Encode(string content, string key) { byte[] contentBytes = System.Text.Encoding.Default.GetBytes(content); byte[] keyBytes = System.Text.Encoding.Default.GetBytes(key); contentBytes = Xcode(contentBytes, keyBytes); return Convert.ToBase64String(contentBytes); } public static string Decode(string encodedContent, string key) { byte[] contentBytes = Convert.FromBase64String(encodedContent); byte[] keyBytes = System.Text.Encoding.Default.GetBytes(key); contentBytes = Xcode(contentBytes, keyBytes); return System.Text.Encoding.Default.GetString(contentBytes); } private static byte[] Xcode(byte[] content, byte[] key) { for (int i = 0, l = content.Length; i < l; i++) { content[i] ^= key[i % key.Length]; } return content; } base64太容易还原了,跟明文差不多。推荐用c#内嵌的AES加密 base64和内置的aes都不支持长字符串啊 base64怎么可能不支持长字符串?邮件附件就是base64编码的,只要服务器支持,附件传几个G都没问题。aes也支持长字符串。 这个也许对于我是基于http的 所以感觉这个方法还是不行的 http协议上传附件时会使用(multipart/form-data)多片段的传输。 好像是最大(10000)64k每个片段 可以传递二进制流。每次传递下一个片段前需要传递这个片段的大小(16进制) 然后发送这个长度的正文的二进制。这种情况下你可以加密后不用转换成base64。明天会公司帮你写写。 /// <summary> /// 对称加密算法类 /// </summary> public class SymmetricMethod { private SymmetricAlgorithm mobjCryptoService; private string Key; /// <summary> /// 对称加密类的构造函数 /// </summary> public SymmetricMethod() { mobjCryptoService = new RijndaelManaged(); Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7"; } /// <summary> /// 获得密钥 /// </summary> /// <returns>密钥</returns> private byte[] GetLegalKey() { string sTemp = Key; mobjCryptoService.GenerateKey(); byte[] bytTemp = mobjCryptoService.Key; int KeyLength = bytTemp.Length; if (sTemp.Length > KeyLength) { sTemp = sTemp.Substring(0, KeyLength); } else if (sTemp.Length < KeyLength) { sTemp = sTemp.PadRight(KeyLength, ' '); } return ASCIIEncoding.ASCII.GetBytes(sTemp); } /// <summary> /// 获得初始向量IV /// </summary> /// <returns>初试向量IV</returns> private byte[] GetLegalIV() { string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; mobjCryptoService.GenerateIV(); byte[] bytTemp = mobjCryptoService.IV; int IVLength = bytTemp.Length; if (sTemp.Length > IVLength) { sTemp = sTemp.Substring(0, IVLength); } else if (sTemp.Length < IVLength) { sTemp = sTemp.PadRight(IVLength, ' '); } return ASCIIEncoding.ASCII.GetBytes(sTemp); } /// <summary> /// 加密方法 /// </summary> /// <param name="Source">待加密的串</param> /// <returns>经过加密的串</returns> public string Encrypto(string Source) { byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); MemoryStream ms = new MemoryStream(); mobjCryptoService.Key = GetLegalKey(); mobjCryptoService.IV = GetLegalIV(); ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); cs.Write(bytIn, 0, bytIn.Length); cs.FlushFinalBlock(); ms.Close(); byte[] bytOut = ms.ToArray(); return Convert.ToBase64String(bytOut); } /// <summary> /// 解密方法 /// </summary> /// <param name="Source">待解密的串</param> /// <returns>经过解密的串</returns> public string Decrypto(string Source) { byte[] bytIn = Convert.FromBase64String(Source); MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length); mobjCryptoService.Key = GetLegalKey(); mobjCryptoService.IV = GetLegalIV(); ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); StreamReader sr = new StreamReader(cs); return sr.ReadToEnd(); } }长度就不知道了~~已经过测试 写一个存储过程调用C#的dll文件 datagridview checkbox无法排序? RichTextBox的输入字体 zhzuo(秋枫) 求你的源代码 Windows服务启动正常,但应用有错 C#简单问题求助! 控制台输入和输出 向下自动撑大datagridview,不显示滚动条,向下显示所有行 什么是“面向过程”的编程方式?? dataGrid上绑定dropdownlist控件后OnSelectedIndexChanged处理的难题!!! c# 调用floodfill的问题 list排序问题.
{
byte[] contentBytes = System.Text.Encoding.Default.GetBytes(content);
byte[] keyBytes = System.Text.Encoding.Default.GetBytes(key); contentBytes = Xcode(contentBytes, keyBytes);
return Convert.ToBase64String(contentBytes);
} public static string Decode(string encodedContent, string key)
{
byte[] contentBytes = Convert.FromBase64String(encodedContent);
byte[] keyBytes = System.Text.Encoding.Default.GetBytes(key); contentBytes = Xcode(contentBytes, keyBytes);
return System.Text.Encoding.Default.GetString(contentBytes);
} private static byte[] Xcode(byte[] content, byte[] key)
{
for (int i = 0, l = content.Length; i < l; i++)
{
content[i] ^= key[i % key.Length];
}
return content;
}
base64太容易还原了,跟明文差不多。推荐用c#内嵌的AES加密
每次传递下一个片段前需要传递这个片段的大小(16进制) 然后发送这个长度的正文的二进制。这种情况下你可以加密后不用转换成base64。明天会公司帮你写写。
/// <summary>
/// 对称加密算法类
/// </summary>
public class SymmetricMethod
{ private SymmetricAlgorithm mobjCryptoService;
private string Key;
/// <summary>
/// 对称加密类的构造函数
/// </summary>
public SymmetricMethod()
{
mobjCryptoService = new RijndaelManaged();
Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";
}
/// <summary>
/// 获得密钥
/// </summary>
/// <returns>密钥</returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
mobjCryptoService.GenerateKey();
byte[] bytTemp = mobjCryptoService.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
{
sTemp = sTemp.Substring(0, KeyLength);
}
else if (sTemp.Length < KeyLength)
{
sTemp = sTemp.PadRight(KeyLength, ' ');
}
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 获得初始向量IV
/// </summary>
/// <returns>初试向量IV</returns>
private byte[] GetLegalIV()
{
string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
mobjCryptoService.GenerateIV();
byte[] bytTemp = mobjCryptoService.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
{
sTemp = sTemp.Substring(0, IVLength);
}
else if (sTemp.Length < IVLength)
{
sTemp = sTemp.PadRight(IVLength, ' ');
}
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name="Source">待加密的串</param>
/// <returns>经过加密的串</returns>
public string Encrypto(string Source)
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="Source">待解密的串</param>
/// <returns>经过解密的串</returns>
public string Decrypto(string Source)
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
mobjCryptoService.Key = GetLegalKey();
mobjCryptoService.IV = GetLegalIV();
ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
} }长度就不知道了~~已经过测试