gpt4 book ai didi

python - rand 和 rands 在 python 中的实现

转载 作者:行者123 更新时间:2023-11-28 04:10:59 25 4
gpt4 key购买 nike

我需要在 Python 中从 C++ 实现 rand 和 rands 来重新加密一堆文件。但似乎无法正确处理。

我有一个 exe 可以将文件解密为文本,我还需要源代码,在编辑文件后我需要使用相同的方法对其进行加密。

由于我不会写c++代码,所以我选择用python写。先试解密就知道方法是一样的。


以下代码是解加密文件的c++代码,其中“buff”是加密 block 的开始,“len”是所述 block 的长度。

static const char KEY[] = "KF4QHcm2";
static const unsigned long KEY_LEN = sizeof(KEY) - 1;

void unobfuscate(unsigned char* buff, unsigned long len) {
srand((char)buff[len - 1]);

for (unsigned long i = 0; i < len - 2; i += 2) {
buff[i] ^= KEY[rand() % KEY_LEN];
}
}

据我了解,它以加密 block 的最后一个字符作为种子,从头开始每 2 个字节将值与 KEY 数组的一个元素进行异或,该索引由随机数的余数确定除以KEY长度。

在网上搜索,我发现 c++ 使用一个简单的 Linear Congruential Generator不应该用于加密,但似乎无法使其正常工作。

我找到了 one example of the code并尝试实现另一个,但似乎都不起作用。

#My try at implementing it
def rand():
global seed
seed = (((seed * 1103515245) + 12345) & 0x7FFFFFFF)

return seed

我还读到 rand 函数在 0 和 RAND_MAX 之间,但找不到 RAND_MAX 的值,如果我找到它也许可以使用 random.randrange()。

它也可以是我设置种子的方式,因为它在 C++ 中似乎是一个字符,但在 Python 中我将它设置为字符的值。

这是我在使用各种方法对文件进行解密时观察到的结果。这只是前 13 个字节,所以如果有人需要检查它是否有效,可以这样做。

The block ends with the sequence: 4C 0A 54 C4 this means C4 is the seed
Example encrypted:
77 43 35 69 26 6B 0C 6E 3A 74 4B 33 71 wC5i&k.n:tK3q
Example un-encrypted using c++:
24 43 6C 69 63 6B 49 6E 69 74 0A 33 34 $ClickInit.34
Example un-encrypted using python example:
1A 43 7E 69 77 6B 38 6E 0E 74 1A 33 3A .C~iwk8n.t.3:
Example un-encrypted using python implementation:
3C 43 73 69 6E 6B 4A 6E 0E 74 1A 33 37 <CsinkJn.t.37

我的 python 脚本也可能有问题,所以这里是文件以防出现任何错误:

import os

def srand(s):
global seed
seed = s

def rand():
global seed
#Example code
#seed = (seed * 214013 + 2531011) % 2**64

#return (seed >> 16)&0x7fff

#Implementation code
seed = (((seed * 1103515245) + 12345) & 0x7FFFFFFF)

return seed

KEY = ['K','F','4','Q','H','c','m','2']
KEY_LEN = len(KEY) - 1

for filename in os.listdir("."):
if filename.endswith(".dat"):
print(" Decoding " + filename)

#open file
file = open(filename, "rb")

#set file attributes
file_length = os.path.getsize(filename)
file_buffer = [0] * file_length

#copy contents of file to array
for i in range(file_length):
file_buffer[i] = int.from_bytes(file.read(1), 'big')

#close file
file.close()

print(" Random Seed: " + chr(file_buffer[-1]))

#set random generator seed
srand(file_buffer[-1])

#decrypt the file
for i in range(3600, file_length, 2):
file_buffer[i] ^= ord(KEY[rand() % KEY_LEN])

#print to check if output is un-encrypted
for i in range(3600, 3613, 1):
print(file_buffer[i])
print(chr(file_buffer[i]))

continue
else:
#Do not try to un-encrypt the python script
print("/!\ Can't decode " + filename)
continue

如果有人能帮我解决这个问题,我将不胜感激,如果可能的话,我希望它能在 python 中工作,但是,据我所知,似乎我必须学习 c++ 才能让它工作。

最佳答案

rand 不是密码函数。

rand 的算法在系统编译器或其他任何系统之间不稳定。

如果别无选择,最好的办法是使用 python-C/C++ 互操作性技术并实际运行 rand()srand()。那会很糟糕,但它会像原始代码一样糟糕。

关于python - rand 和 rands 在 python 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com