我正在通过OpenSSL的AES算法的基本程序集实现。从理论上讲,当密钥长度= 128位时,AES会使用10轮。 我需要以编程方式验证。因此,每当完成一轮AES时,我将全局变量(即round_var)值增加1。 因此,在1个块(16字节)的AES操作结束时,变量的值将为10,并且在2个块(2x16字节)的AES操作结束时,变量的值将为20。 / p>
这是我所做的(aes-586.s),
添加了全球数据声明
.data
.global round_var
round_var:
.long 0
_x86_AES_decrypt_compact:
; this is the AES round, where I increment global round_var by 1
.L004loop:
.
.
.
;increase round_var by 1
movl round_var, %eax
addl $1,%eax
movl %eax, round_var
.
.
.
jmp .L004loop
之后我成功构建了Openssl,
./ config -g 386 shared --prefix = / usr
请
sudo make install
这是我执行解密2000 x 1000次的bash脚本,只是为了确保程序正在运行,没有完成执行以反映round_var的正确值。
cat run.sh
for i in `seq 1 1000`
do
/usr/bin/openssl enc -d -aes-128-ecb -in dummy_200.bin.enc -out dec-dummy_200.bin -K A10BA778CBC2F2BDE3FB2C66F7F14FB6
done
这是我正在打印round_var值的C程序。
//gcc dlsym_example.c -ldl
#include <dlfcn.h>
#include <stdio.h>
int main()
{
void* lib=dlopen("/usr/lib/libcrypto.so",RTLD_NOW);
long * func_addr =NULL;
func_addr=(long *)dlsym(lib, "round_var");
while(1)
{
if(func_addr !=NULL)
{
printf("round_var %ld\n",*func_addr);
}
}
return 0;
}
令人惊讶的是我得到了
round_var 0
round_var 0
round_var 0
我期待round_var的变化应该反映在C程序中。 顺便说一下,在gdb调试模式中我交叉检查round_var的值在每次aes循环后递增1表示递增round_var的逻辑是正确的。
我在哪里犯错误?它与可见性有关吗?
提前致谢。