该方法可逆不可逆?
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();
}
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();
}
}
找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` 函数的输出,以便正确还原原始字符串。 我问deepseek说不可逆 wgz001 发表于 2025-1-4 12:42
我问deepseek说不可逆
想到一块去了,回复你时,我正用 deepseek 尝试,也没能给出正确答案。 vipcrack 发表于 2025-1-3 22:26
找AI写了个,没测试
要编写给定 `DecodeAlphaNumString` 方法的逆函数,我们需要理解原始函数的逻辑。这 ...
结果不正确喔,试了国产几个AI大模型都搞不定
飘零未忍 发表于 2025-1-9 14:28
licenseKey 最后一个A解码时没用到
using System;
感谢你的回答,解决了我的问题 {:hug:}
页:
[1]