飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 333|回复: 6

[讨论] 该方法可逆不可逆?

[复制链接]
  • TA的每日心情
    开心
    2024-7-21 22:13
  • 签到天数: 116 天

    [LV.6]常住居民II

    发表于 2025-1-3 21:37:16 | 显示全部楼层 |阅读模式
    [C#] 纯文本查看 复制代码
            
            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[bitsLen];
          // DecodeAlphaNumString 可逆否???
          DecodeAlphaNumString(licenseKey, bits, bitsLen, bitCount, startIndex);
          Console.WriteLine(BitConverter.ToString(bits));
          Console.ReadKey();
      }
    
    
    

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-6 16:32
  • 签到天数: 257 天

    [LV.8]以坛为家I

    发表于 6 天前 | 显示全部楼层
    licenseKey 最后一个A解码时没用到

    [C#] 纯文本查看 复制代码
    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"[value];
        }
    
        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[bitCount / 5 + 1]; // 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[num3 / 5] = 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[bitsLen];
    
            // 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();
        }
    }

    点评

    感谢你的回答,解决了我的问题  详情 回复 发表于 9 小时前
    PYG19周年生日快乐!
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-4 10:11
  • 签到天数: 490 天

    [LV.9]以坛为家II

    发表于 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[num2] << 8) | bits[num2 + 1]);
            num5 >>= num;

            // 获取对应的字符并添加到结果中
            char character = key[num5];
            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` 函数的输出,以便正确还原原始字符串。

    点评

    结果不正确喔,试了国产几个AI大模型都搞不定  详情 回复 发表于 2025-1-4 18:20
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-26 11:14
  • 签到天数: 459 天

    [LV.9]以坛为家II

    发表于 2025-1-4 12:42:45 | 显示全部楼层
    我问deepseek说不可逆

    点评

    想到一块去了,回复你时,我正用 deepseek 尝试,也没能给出正确答案。  详情 回复 发表于 2025-1-4 18:16
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-21 22:13
  • 签到天数: 116 天

    [LV.6]常住居民II

     楼主| 发表于 2025-1-4 18:16:00 | 显示全部楼层
    wgz001 发表于 2025-1-4 12:42
    我问deepseek说不可逆

    想到一块去了,回复你时,我正用 deepseek 尝试,也没能给出正确答案。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-21 22:13
  • 签到天数: 116 天

    [LV.6]常住居民II

     楼主| 发表于 2025-1-4 18:20:02 | 显示全部楼层
    vipcrack 发表于 2025-1-3 22:26
    找AI写了个,没测试

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

    结果不正确喔,试了国产几个AI大模型都搞不定
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-21 22:13
  • 签到天数: 116 天

    [LV.6]常住居民II

     楼主| 发表于 9 小时前 | 显示全部楼层
    飘零未忍 发表于 2025-1-9 14:28
    licenseKey 最后一个A解码时没用到

    [mw_shl_code=csharp,true]using System;

    感谢你的回答,解决了我的问题
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表