showwindows 发表于 2025-1-3 21:37:16

该方法可逆不可逆?

      
      private static void DecodeAlphaNumString(string key, byte[] bits, uint bitsLen, uint bitCount, uint startIndex)
      {
            ushort num = 11;
            uint num2 = 0;
            uint num3 = 0;
            while (num2 < bitsLen && num3 < bitCount)
            {
                ushort num5 = GetAlphaNumValue(key[(int)startIndex++]);
                num5 <<= num;

                uint num6 = num2;
                bits[(int)num6] |= (byte)((num5 & 0xFF00) >> 8);

                uint num7 = num2 + 1;
                bits[(int)num7] |= (byte)(num5 & 0xFF);

                if (num < 8)
                {
                  num += 3;
                  num2 += 1;
                }
                else
                {
                  num -= 5;
                }
                num3 += 5;
            }
      }

      private static ushort GetAlphaNumValue(char alphaNum)
      {
            return (ushort)"ABJCKTDL4UEMW71FNX52YGP98Z63HRS0".IndexOf(alphaNum);
      }


static void Main(string[] args)
{
       // 参数及常量
      var licenseKey = "WDN304RKRDHBUEDDA1A";
      uint bitCount = 65;
      uint startIndex = 5;
      uint bitsLen = 9;
      byte[] bits = new byte;
      // DecodeAlphaNumString 可逆否???
      DecodeAlphaNumString(licenseKey, bits, bitsLen, bitCount, startIndex);
      Console.WriteLine(BitConverter.ToString(bits));
      Console.ReadKey();
}



飘零未忍 发表于 6 天前

licenseKey 最后一个A解码时没用到

using System;

class Program
{
    private static void DecodeAlphaNumString(string key, byte[] bits, uint bitsLen, uint bitCount, uint startIndex)
    {
      ushort num = 11;
      uint num2 = 0;
      uint num3 = 0;
      while (num2 < bitsLen && num3 < bitCount)
      {
            ushort num5 = GetAlphaNumValue(key[(int)startIndex++]);
            num5 <<= num;

            uint num6 = num2;
            bits[(int)num6] |= (byte)((num5 & 0xFF00) >> 8);

            uint num7 = num2 + 1;
            bits[(int)num7] |= (byte)(num5 & 0xFF);

            if (num < 8)
            {
                num += 3;
                num2 += 1;
            }
            else
            {
                num -= 5;
            }
            num3 += 5;
      }
    }

    private static ushort GetAlphaNumValue(char alphaNum)
    {
      return (ushort)"ABJCKTDL4UEMW71FNX52YGP98Z63HRS0".IndexOf(alphaNum);
    }

    private static char GetAlphaNumCharacter(ushort value)
    {
      return "ABJCKTDL4UEMW71FNX52YGP98Z63HRS0";
    }

    private static string EncodeAlphaNumString(byte[] bits, uint bitsLen, uint bitCount, uint startIndex)
    {
      ushort num = 11;
      uint num2 = 0;
      uint num3 = 0;
      char[] encodedChars = new char; // Each character encodes 5 bits

      while (num2 < bitsLen && num3 < bitCount)
      {
            uint num6 = num2;
            uint num7 = num2 + 1;

            ushort num5 = (ushort)((bits[(int)num6] << 8) | bits[(int)num7]);

            num5 >>= num;
            encodedChars = GetAlphaNumCharacter((ushort)(num5 & 0x1F)); // 0x1F = 00011111 in binary, to get the last 5 bits

            if (num < 8)
            {
                num += 3;
                num2 += 1;
            }
            else
            {
                num -= 5;
            }
            num3 += 5;
      }

      return new string(encodedChars);
    }

    static void Main(string[] args)
    {
      // Parameters and constants
      var licenseKey = "WDN304RKRDHBUEDDA1";
      uint bitCount = 65;
      uint startIndex = 5;
      uint bitsLen = 9;
      byte[] bits = new byte;

      // DecodeAlphaNumString
      DecodeAlphaNumString(licenseKey, bits, bitsLen, bitCount, startIndex);

      // Output decoded bits
      Console.WriteLine("Decoded Bits: " + BitConverter.ToString(bits));

      // EncodeAlphaNumString
      string encodedString = EncodeAlphaNumString(bits, bitsLen, bitCount, startIndex);

      // Output encoded string
      Console.WriteLine("Encoded String: " + licenseKey.Substring(0, (int)startIndex) + encodedString);

      Console.ReadKey();
    }
}

vipcrack 发表于 2025-1-3 22:26:53

找AI写了个,没测试

要编写给定 `DecodeAlphaNumString` 方法的逆函数,我们需要理解原始函数的逻辑。这个函数的作用是将一个字符串的字符转换为字节数组,并根据某种规则处理这些字符。逆函数的目标是从字节数组中还原出原始字符串。

下面是一个可能的逆函数实现,称为 `EncodeAlphaNumString`。请注意,这个实现依赖于原始函数的逻辑,因此在实现过程中需要确保与原始函数保持一致。

```csharp
private static string EncodeAlphaNumString(string key, byte[] bits, uint bitsLen, uint bitCount, uint startIndex)
{
    StringBuilder result = new StringBuilder();
    ushort num = 11;
    uint num2 = 0;
    uint num3 = 0;

    while (num2 < bitsLen && num3 < bitCount)
    {
      // 从 bits 中提取两个字节
      ushort num5 = (ushort)((bits << 8) | bits);
      num5 >>= num;

      // 获取对应的字符并添加到结果中
      char character = key;
      result.Append(character);

      // 更新 num 和 num2
      if (num < 8)
      {
            num += 3;
            num2 += 1;
      }
      else
      {
            num -= 5;
      }
      num3 += 5;
    }

    return result.ToString();
}
```

### 说明:
1. **参数**:
   - `key`:用于映射值到字符的字符串。
   - `bits`:原始的字节数组。
   - `bitsLen`:字节数组的长度。
   - `bitCount`:处理的位数。
   - `startIndex`:开始索引(在此实现中未使用,但可以根据需要调整)。

2. **逻辑**:
   - 使用 `StringBuilder` 来构建结果字符串。
   - 从字节数组中提取两个字节,合并并右移以获取原始字符的索引。
   - 根据 `num` 的值决定如何更新索引和位数。

3. **注意事项**:
   - 这个逆函数假设 `key` 中的字符是唯一且可映射的。
   - `startIndex` 的处理在此实现中可能需要根据实际情况进行调整。

确保在使用此逆函数时,输入的 `key` 和 `bits` 数组符合 `DecodeAlphaNumString` 函数的输出,以便正确还原原始字符串。

wgz001 发表于 2025-1-4 12:42:45

我问deepseek说不可逆

showwindows 发表于 2025-1-4 18:16:00

wgz001 发表于 2025-1-4 12:42
我问deepseek说不可逆

想到一块去了,回复你时,我正用 deepseek 尝试,也没能给出正确答案。

showwindows 发表于 2025-1-4 18:20:02

vipcrack 发表于 2025-1-3 22:26
找AI写了个,没测试

要编写给定 `DecodeAlphaNumString` 方法的逆函数,我们需要理解原始函数的逻辑。这 ...

结果不正确喔,试了国产几个AI大模型都搞不定

showwindows 发表于 4 小时前

飘零未忍 发表于 2025-1-9 14:28
licenseKey 最后一个A解码时没用到

using System;


感谢你的回答,解决了我的问题 {:hug:}
页: [1]
查看完整版本: 该方法可逆不可逆?