C# c语言中的异或解密#

C# c语言中的异或解密#,c#,python,encryption,C#,Python,Encryption,我试图用c#中的密钥解密xor字符串,但解密是错误的,我得到了错误的值 string text = "xorhash"; string key = "xorkey"; var result = new StringBuilder(); for (int c = 0; c < text.Length; c++) result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length])); return result.ToS

我试图用c#中的密钥解密xor字符串,但解密是错误的,我得到了错误的值

string text = "xorhash";
string key = "xorkey";
var result = new StringBuilder();

  for (int c = 0; c < text.Length; c++)
  result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length]));

  return result.ToString();
我没有改变一行,只有缩进

编辑:


一旦输入字符串实际上是代码的十六进制表示形式,c#代码应该如下所示:

for (int c = 0; c < text.Length; c+=2)
    result.Append((char)(Convert.ToUInt16(text.Substring(c, 2), 16) ^ (ushort)key[ (c/2) % key.Length]));
for(int c=0;c
公共静态字节[]加密加密加密(字节[]文本,字节[]密钥)
{
byte[]xor=新字节[text.Length];
for(int i=0;i
需要什么输出?my_xor_hash^ my_xor_key无法输出您提供的任何值无论如何,您的问题是因为python字符串是从十六进制表示法解码的,但c#不这样做。有没有办法使c#代码与此python代码类似?当然有办法,两种语言都是图灵完整的
private static string xor(string text, string key) {
    var result = new StringBuilder();
    for (int c = 0; c < text.Length; c++)
      result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length]));
    return result.ToString();
}

string text = "my_xor_hash";
string key = "my_xor_key";
string encrypt = xor(text, key);
string decrypt = xor(encrypt, key);
System.Console.Write("Encrypt " + encrypt);
System.Console.Write("Decrypt " + decrypt);
Encrypt 
Decrypt my_xor_hash
private static string xor(string text, string key) {
    var result = new StringBuilder();
    for (int c = 0; c < text.Length; c++)
      result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length]));
    return result.ToString();
}

private static string FromHex(string hex) {
    byte[] raw = new byte[hex.Length / 2];
    for (int i = 0; i < raw.Length; i++) {
        raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
    }
    return Encoding.ASCII.GetString(raw);
}

public static void Main() {
    string text = FromHex("xor_hash");
    string key = "xor_key";
    string decrypt = xor(text, key);
    System.Console.Write("Decrypt " + decrypt);
}
Decrypt HARPERS
for (int c = 0; c < text.Length; c+=2)
    result.Append((char)(Convert.ToUInt16(text.Substring(c, 2), 16) ^ (ushort)key[ (c/2) % key.Length]));
public static byte[] EncryptOrDecrypt(byte[] text, byte[] key)
{
    byte[] xor = new byte[text.Length];
    for (int i = 0; i < text.Length; i++)
    {
        xor[i] = (byte)(text[i] ^ key[i % key.Length]);
    }
    return xor;
}

static void Main(string[] args){
    string input;
    byte[] inputBytes;

    string inputKey;
    byte[] key;

    do
    {
        input = System.Console.ReadLine();
        inputBytes = Encoding.Unicode.GetBytes(input);

        inputKey = System.Console.ReadLine();
        key = Encoding.Unicode.GetBytes(inputKey);

        //byte[] key = { 0, 0 }; if key is 0, encryption will not happen

        byte[] encryptedBytes = EncryptOrDecrypt(inputBytes, key);
        string encryptedStr = Encoding.Unicode.GetString(encryptedBytes);

        byte[] decryptedBytes = EncryptOrDecrypt(encryptedBytes, key);
        string decryptedStr = Encoding.Unicode.GetString(decryptedBytes);

        System.Console.WriteLine("Encrypted string:");
        System.Console.WriteLine(encryptedStr);
        System.Console.WriteLine("Decrypted string:");
        System.Console.WriteLine(decryptedStr);

    } while (input != "-1" && inputKey != "-1");
    //test:
    //pavle
    //23
    //Encrypted string:
    //BRD_W
    //Decrypted string:
    //pavle
}