c#用异或加密算法的一点问题

public string encrypt(string code, string key) {
string result="";
byte[] a = System.Text.Encoding.Default.GetBytes(code);
byte[] b = System.Text.Encoding.Default.GetBytes(key);
int by;
int i = 0;
int k = 0;
Boolean flag = false;
int max = a.Length;
int min = b.Length;

if (a.Length < b.Length)
{
max = b.Length;
min = a.Length;
flag = true;
}

for (i = 0; i < min; i++) {
by = a[i]^b[i];
result += by;

}

if (flag) //若KEY比CODE长
{
for (; i < max; i++)
{

by = b[i] ^ '0';
result += by;
}
}
else {
for (; i < max; i++)
{

by = a[i] ^ '0';
result += by;
}

}

return result;
}

这是我写的代码 问题有很多 好像只能加密解密数字 要是CODE是字符串则会变成不知道什么的一串,要是key比code长 则解密的时候会在返回的字符串后面自动补充0,我相信截取也不是 不知道怎么改。大神帮我改下 谢谢了

这种加密方式称为对称加密。也就是加密与解过程相同的。

 

事实上可以加密任何字符串的。其玄机就是在于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<key.Length)
{
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<len;i++)
{
result.Add(b_code[i]^b_key[i%mlen]);
}
return result.ToString(); //返回密码结果
}
//注意解密时,解得结果一旦遇到"**"这样的字符串,只即停止解密,因为这个后边加的就是错误的东西了!

/这种加密不会改变加密串的强度。所以这种比原来的安全。

 

 

但这样的程序绝对不会用到商业的。因为它有自己非常弱的地方!

 

你试一下这种,这种加密形式,一般不会遇到解密的!

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答