如何解码base64编码的字符串?

349

我正在尝试“解码”以下Base64字符串:

OBFZDTcPCxlCKhdXCQ0kMQhKPh9uIgYIAQxALBtZAwUeOzcdcUEeW0dMO1kbPElWCV1ISFFKZ0kdWFlLAURPZhEFQVseXVtPOUUICVhMAzcfZ14AVEdIVVgfAUIBWVpOUlAeaUVMXFlKIy9rR3RULTw7PU87EV8wJxUXDUsxAVsFBhcBAg==

这是我所知道关于这个字符串的信息:

  1. 原始字符串首先通过以下代码传递:

  2. private static string m000493(string p0, string p1)
    {
        StringBuilder builder = new StringBuilder(p0);
        StringBuilder builder2 = new StringBuilder(p1);
        StringBuilder builder3 = new StringBuilder(p0.Length);
        int num = 0;
    Label_0084:
        while (num < builder.Length)
        {
            int num2 = 0;
            while (num2 < p1.Length)
            {
                if ((num == builder.Length) || (num2 == builder2.Length))
                {
                    MessageBox.Show("EH?");
                    goto Label_0084;
                }
                char ch = builder[num];
                char ch2 = builder2[num2];
                ch = (char)(ch ^ ch2);
                builder3.Append(ch);
                num2++;
                num++;
            }
        }
        return m0001cd(builder3.ToString());
    }
    

    代码中的p1部分应该是字符串"_p0lizei."。

  3. 接下来的代码将其转换为Base64字符串:

    private static string m0001cd(string p0)
    {
        string str2;
        try
        {
            byte[] buffer = new byte[p0.Length];
            str2 = Convert.ToBase64String(Encoding.UTF8.GetBytes(p0));
        }
        catch (Exception exception)
        {
            throw new Exception("Error in base64Encode" + exception.Message);
        }
        return str2;
    }
    
    问题是,我该如何解码Base64字符串以便找出原始字符串是什么?


3
我知道当支持遗留系统时,“为什么”通常是无关紧要的,但我需要知道...为什么最初将原始字符串进行了Base64编码?!? Base64通常用于将二进制转换为基于文本的可移植版本,以嵌入XML或JSON - 可能是为了在Web服务层之间传输,而不是将字符串转换为编码后的字符串。 - barrypicker
1
@barry - 回答你在更早的帖子中提出的问题...我来到这里是因为我需要处理HTTP授权头,它需要base64编码的字符串。 - freefaller
4个回答

889
简单:
byte[] data = Convert.FromBase64String(encodedString);
string decodedString = System.Text.Encoding.UTF8.GetString(data);

20
完成此答案,Jerry Nixon 的这篇优秀文章对此进行了详细阐述。 - orad
12
不要忘记添加命名空间 'using System.Text'。 - Eklavyaa

112

m000493方法似乎执行某种XOR加密。这意味着同一方法可用于编码和解码文本。您需要做的就是反转m0001cd

string p0 = Encoding.UTF8.GetString(Convert.FromBase64String("OBFZDT..."));

string result = m000493(p0, "_p0lizei.");
//    result == "gaia^unplugged^Ta..."

return m0001cd(builder3.ToString()); 更改为 return builder3.ToString();


谢谢,这正是我在寻找的答案。我差点要抓狂了 :p - Rickard
55
您可以通过点击左侧答案旁边的复选标记来“接受”解决您问题的答案。 - dtb
5
请不要将此称为“加密”或“解密”。请注意区分“加密”和“编码”。 - user4843530

9
    // Decode a Base64 string to a string
    public static string DecodeBase64(string value)
    {
        if(string.IsNullOrEmpty(value))
            return string.Empty;
        var valueBytes = System.Convert.FromBase64String(value);
        return System.Text.Encoding.UTF8.GetString(valueBytes);
    }

1
这个答案似乎使用了与其他答案相同的方法... - Elikill58

0
试试这个:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string inputFile = "input.txt";
        string originalString = File.ReadAllText(inputFile);

        string encodedString = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(originalString));

        string decodedString = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(encodedString));

        Console.WriteLine("Original string: " + originalString);
        Console.WriteLine("Encoded string: " + encodedString);
        Console.WriteLine("Decoded string: " + decodedString);

        string outputFile = "output.txt";
        File.WriteAllText(outputFile, decodedString);
    }
}

#csharp


感谢您为Stack Overflow社区做出的贡献。这可能是一个正确的答案,但如果您能提供代码的额外解释,让开发人员能够理解您的推理过程,那将非常有用。对于不太熟悉语法或难以理解概念的新开发人员来说,这尤其有帮助。您是否可以编辑您的答案,包含更多细节,以造福整个社区? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接