这种加密方式称为对称加密。也就是加密与解过程相同的。
事实上可以加密任何字符串的。其玄机就是在于byte[] s = Encoding.Default.GetBytes(string);
如果用Encoding.TF8.GetBytes(string)要比使用Default好的多,这样同时也可以加密汉字了!
一般考虑密文的长度要比key长,如果是相反的情况下,可以只加密部分的。也就是说,如果密文长度是1,其实只使用了一位密码。(如果不采取被0的情况),显然会引发弱密码的情况。而且,按你的这种加密方式,如果密文长度大于密码长度,那么多余的部分很容易被破解的!
例如,对字符"123456789987654321"进行加密,如果使用密码为"123",前半部分您的密码显然是加密的(三位)但后半部分如果了解你算法话,直接解后半段与0进行or就可以了!所以后半部分虽然加密,但实际却是没有任何加密的效果!就算不了解你的密码,加密两次也只即能猜解,所以你这种加密实际上对后半段等于没有任何加密!
所以说整体上来说这种加密根本不合格的!
那么应该如何加密呢?这可能是你的疑问,你有权知道,我可以给你算法:
加密次数应该是最长的长度决定,使用每一个加密都是正确的加密。
加密应当使用循环加密,使外部无法猜解。
a是待加密串,b是密钥(也就是密码)
1,让a与b共同长度的部分异域,
2,如果a长,则将b重新循环加密,不要使用固定字符。直到a串加密完成。
3,如果b长,如果出现截断(不同加密),则密钥强度则相当于a的长度,会大减。如果使用a再进行循环,加密至b的长度,则解密后得到a一直的重复。所以两种方式均不可使用。那么我们可以用一个信号来说明,就是密文中会出现的字符进行加密(如果在a串后加**后再循环加a直到长度相同),解密时,发现有**立即停止解密即可!**就是一个信号。表示后的假数据。
public string encrypt(string code, string key)
{
string split = "**";
string codestemp = code;
if(codestemp.Lenth{
codestemp += split;
do
{
codestemp += code;
}while(codestemp.Lenth>key.Length);
}
//保证codestemp的长度一定大于key。
byte[] b_code = Encoding.UTF8.GetBytes(codestemp);
byte[] b_key - Encoding.UTF8.GetBytes(key);
int len = b_key.Length; //找出最大长度。
int mlen = b.key.length; //找出加密串长度
StringBuilding result = new StringBuilding();
//建议使用StringBuilding,使用string会很耗内存的,导致性能下降。
for(int i = 0;i{
result.Add(b_code[i]^b_key[i%mlen]);
}
return result.ToString(); //返回密码结果
}
//注意解密时,解得结果一旦遇到"**"这样的字符串,只即停止解密,因为这个后边加的就是错误的东西了!
/这种加密不会改变加密串的强度。所以这种比原来的安全。
但这样的程序绝对不会用到商业的。因为它有自己非常弱的地方!
你试一下这种,这种加密形式,一般不会遇到解密的!