我是Hitman游戏(一种隐身暗杀游戏)的粉丝。
在针对最新挑战的电影中,我发现了以下类似代码的代码段。我没有C ++经验,也没有在系统上安装C工具,因此我在这里尝试将其复制到REPL中,但是始终出现错误*
这是我对代码的转录:
#include<stdio.h>
void main(int,char**a){for(char*p="25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_.",c=a[1][0];*p;putc(c=(*p+++c&63)+32,stdout));}
Run Code Online (Sandbox Code Playgroud)
(本文后面重新格式化以提高可读性)。
据我所知,这意味着要成为一个密码(“获取的每个字符cipher,将其传递通过转换,然后将其打印出来”),但是我既无法执行它,也无法充分理解它来翻译它转换成我熟悉的Python语言:我不知道这*p+++c&63意味着什么。我的猜测是应该将其分解如下:
*p++-采取下一个字符*p...+ -...并将其(整数表示形式)添加到...c-...的先前设置的值c(来自循环的上一迭代,或来自的初始化c=a[1][0])...&63- ...做点什么?看起来像位运算符?+32 -将结果加32此外,的初始值a似乎是解密密钥-但我已经搜索了视频的其余部分,并且找不到任何暗示。
我试图将其翻译为Python(以所有字母和数字为键),如下所示:
import string
cipher = "25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_."
def printout(c):
plaintext = ""
for p in cipher:
c = chr(ord(p) + ((ord(c) & 63)) + 32)
plaintext += c
print(plaintext)
for c in string.letters + string.digits:
printout(c)
Run Code Online (Sandbox Code Playgroud)
但是结果输出的每一行大部分都是垃圾。
我想念什么?我是否已将(C ++)误译为(c=(*p+++c&63)+32Python)c = chr(ord(p) + ((ord(c) & 63)) + 32)(在for循环内,前进p到下一个字符),还是只需要将我的网络更广泛地用作解密密钥?
重新格式化了原始代码,以提高可读性:
#include<stdio.h>
void main(int,char**a) {
for(
char*p="25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_.",
c=a[1][0];
*p;
putc(c=(*p+++c&63)+32,stdout)
);}
Run Code Online (Sandbox Code Playgroud)
*包括但不限于main应返回的错误int,以及ISO C++11 does not allow conversion from string literal to 'char *'
*p+++c&63在C ++ 中是什么意思?
p++后缀增量。递增指向p下一个字符的指针;结果是增量前的指针值。*p++间接 通过表达式1的指针结果进行间接调用。结果是p最初指向的字符'2'。*p+++c加成。将结果2和相加c。和...一样*p++ + c*p+++c&63按位与。左操作数是3的结果,右操作数是整数文字。用完整的括号和合理的间距: (*(p++) + c) & 63
这是一个格式化的,格式正确的版本,不会产生任何警告:
#include <stdio.h>
int main(int, char**a) {
const char* p = "25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_.";
for(char c = a[1][0];
*p;
putc(c=((*p++ + c) & 63) + 32, stdout));
}
Run Code Online (Sandbox Code Playgroud)
该字符串"25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_."可能是加密的文本。如果给定密钥作为参数,程序将对其解密。第一个参数的第一个字符用作键。
暴力破解密钥的程序:
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> int main() { for (char i = 0; i < 127; i++) { const char* p = "25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_."; printf("%c: ", i); for(char c = i; *p; putc(c=((*p++ + c) & 63) + 32, stdout)); putc('\n', stdout); } }
我想念什么?
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |