c# - 序列密钥生成异或字符串加密
问题描述
当我对 a进行异string
或时,我得到特殊字符
private void btnEncryptDecrypt_Click(object sender, EventArgs e)
{
byte[] bytes = Encoding.UTF8.GetBytes(keyTextBox.Text);
textTextBox.Text = string.Empty;
foreach (byte i in bytes)
{
byte c = Convert.ToByte(i ^ Convert.ToByte(textBox1.Text));
textTextBox.Text = textTextBox.Text + Convert.ToChar(c);
}
}
62FA7AC4 1234567890
异或!%QV VT#7&%$#"! /.'
我想用它来生成序列密钥,只包含我想传递的字母数字字符,"62FA7AC4"
adate
和 anumber
以及一些随机虚拟数字0
5000
输入将是"62FA7AC4"+"2500"+"21/05/2018"
输出应该类似于"5QBK-J4D1-8CF6-5MW2-78FZ-2FPL-4S6S-CTGB"
我究竟做错了什么?
解决方案
尝试使用数字,而不是字符串:
using System.Numerics;
...
// Let's use BigInteger for arbitrary long values
BigInteger left = BigInteger.Parse("62FA7AC4", NumberStyles.HexNumber);
BigInteger right = BigInteger.Parse("1234567890", NumberStyles.HexNumber);
string result = (left ^ right).ToString("X");
Console.Write(result);
所以你有了
1256AC0254
编辑:据我所知,您想要字母数字(即Base 36 ==26
字母+10
数字输出)。您可以使用相同的方法:使用整数而不是字符串进行操作
private static Random s_Random = new Random();
...
BigInteger value = BigInteger.Parse(
"0" + // we don't want negative values
"62FA7AC4" + // header
s_Random.Next(5001).ToString("0000") + // random in [0..5000] range
DateTime.Today.ToString("ddMMyyyy"), // Date like 21052018
NumberStyles.HexNumber);
然后做任何异或(如果你喜欢):
value ^= some_secret_value;
最后代表value
in base 36
: _
private static String ToBase36(BigInteger value) {
List<char> list = new List<char>();
for (int index = 0; value > 0; value /= 36, index++) {
if (index > 0 && index % 4 == 0)
list.Add('-');
BigInteger v = value % 36;
list.Add(v < 10 ? (char)('0' + v) : (char) ('A' + v - 10));
}
list.Reverse();
return string.Concat(list);
}
测试:
BigInteger value = BigInteger.Parse(
"0" +
"62FA7AC4" +
"2500" +
DateTime.Today.ToString("ddMMyyyy"),
NumberStyles.HexNumber);
string result = ToBase36(value);
Console.Write(result);
结果:
2443-WNC5-AVBB-M32W
编辑2:恢复原始号码
private static BigInteger FromBase36(string value) {
BigInteger result = 0;
BigInteger power = 1;
for (int i = value.Length - 1; i >= 0; --i) {
char item = value[i];
if (item >= '0' && item <= '9') {
result += power * (item - '0');
power *= 36;
}
else if (item >= 'A' && item <= 'Z') {
result += power * (item - 'A' + 10);
power *= 36;
}
else if (item >= 'a' && item <= 'z') {
result += power * (item - 'a' + 10);
power *= 36;
}
}
return result;
}
例如
BigInteger value = BigInteger.Parse(
"0" +
"62FA7AC4" +
"2500" +
DateTime.Today.ToString("ddMMyyyy"),
NumberStyles.HexNumber);
string result = ToBase36(value);
BigInteger back = FromBase36(result);
Console.WriteLine(string.Join(Environment.NewLine, value, result, back));
结果:
467412447575903165554712
2443-WNC5-AVBB-M32W
467412447575903165554712
推荐阅读
- node.js - 我要同时托管后端和前端吗?
- flutter - 点击时如何修改TextField的高亮颜色?(扑)
- javascript - JS:遍历 DOM 以将元素推入数组
- bash - 带有bash case语句的“选项不存在”
- java - Spring Boot MongoDB获取API返回的文档中字段的总和
- spring - Spring Redis docker compose - 无法访问api
- python - 如何删除字符串的前半部分?
- python - 如何将 SVG 折线转换为 quickdraw stroke-3 numpy 格式?
- angular - Angular:在 App-routing.module 上下文中获取路径参数
- javascript - 我需要将变量从一个组件传递到另一个组件