C++ C++;加解密 void encrypt\u字符(整数长度) { 字符温度; for(int i=0;i
加密部分很好,但我想我会复制并粘贴代码到解密中,而不是递增,而是递减值,这样它会返回并解密数据C++ C++;加解密 void encrypt\u字符(整数长度) { 字符温度; for(int i=0;i,c++,assembly,C++,Assembly,加密部分很好,但我想我会复制并粘贴代码到解密中,而不是递增,而是递减值,这样它会返回并解密数据 //--------------------------------------------------------------------------------------------------------------- //-----------------解密例程----------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------
//-----------------解密例程-------------------------------------------------------------------------
//
无效解密字符(整数长度)
{
字符温度;
对于(int i=0;i
回答:
为了执行与加密操作相反的操作,应使用递减而非递增的新例程替换对encrypt_nn的调用:
//---------------------------------------------------------------------------------------------------------------
//----------------- DECRYPTION ROUTINES -------------------------------------------------------------------------
//
void decrypt_chars(int length)
{
char temp_char;
for (int i = 0; i < length; i--)
{
temp_char = OChars[i];
__asm {
push eax
push ecx
movzx ecx, temp_char
call encrypt_nn
mov temp_char, al
pop ecx
pop eax
}
EChars[i] = temp_char;
}
return;
}
评论:
您已将循环语句从
__asm {
decrypt_nn:
mov eax, ecx
dec eax
ret
}
for(int i=0;i
到
for(int i=0;i
在第一种情况下,循环将遍历0
和length-1
之间的所有值。这意味着您将遍历字符数组(假设length是它的大小)
在第二种情况下,您将获得不可预测的行为,因为您正在测试i
,但在每个循环迭代中执行i--
。
查看更多信息。这是汇编语言而不是c++你的问题是什么?所以基本上你只需从数组中提取一个字符并将其递增1,然后将最后一半存储回数组?这不是一个很好的加密。基本上,你只需dec ecx并将字符还原[编辑:这不是所谓的“cesar加密”?]是的,我正在尝试做cesar的加密,但我不太擅长汇编语言。谢谢,我刚刚注意到我的一些错误事实上,
I--
(除非你检查了MSVC对这段代码的实际作用),因为.编译器可以在编译时注意到,如果函数项上的length>0
,这是不可避免的。它可能会发出非法指令,因此如果执行过,该函数就会出错。或者它可能会发出假定length
必须为非正的代码,因此循环运行零次。也就是说,UB意味着一个范围限制。Th为了开悟,我将修复我的帖子
__asm {
decrypt_nn:
mov eax, ecx
dec eax
ret
}
for (int i = 0; i < length; i++)
for (int i = 0; i < length; i--)