2

我正在研究一些 AES 实现 C 代码。加密代码需要获取作为参数传递的密码,因此加密和输出文件。

我知道它会读取密码,并且还会对其进行处理并将其转换为密钥。但是在这个循环中,我无法真正理解它在做什么。

int main(int argc, char **argv) {
 unsigned long rk[RKLENGTH(KEYBITS)];
 unsigned char key[KEYLENGTH(KEYBITS)];
 int i;
 int nrounds;
 char *password;
 FILE *output;
 if (argc < 3) {
  fputs("Missing argument\n", stderr);
  return 1;
 }                                              
 password = argv[1]
 for (i = 0; i < sizeof(key); i++)
  key[i] = *password != 0 ? *password++ : 0;  /* HERE IS WHERE I CAN'T GET IT */

密钥字符串到底发生了什么?我认为有一些逻辑的东西和位操作。

4

3 回答 3

7

您正在查看的循环是将字符串中的sizeof(key)字节复制到缓冲区中,如果字符串的长度小于.passwordkey0passwordsizeof(key)

三元运算符具有以下形式:

条件 表达式-1表达式-2? :

如果条件为真,则计算表达式 1,否则计算表达式 2。存在短路,因为只有一个表达式被评估。因此,在您的代码中:

    key[i] = *password != 0 ? *password++ : 0; 

一旦*password != 0变为假,password就不会再次增加。

于 2013-07-10T00:35:24.040 回答
6

对于密钥中的每个字节,如果密码中有相应的字节(最初argv[1]),则将该字节复制到密钥;否则将 0(字节)复制到密钥。这是一种冗长的写作方式:

strncpy(key, password, sizeof(key));

(这也是我推荐使用的少数几次之一strncpy();一般来说,它并没有达到人们的预期,但在这里,它完全符合要求。)

于 2013-07-10T00:35:39.557 回答
1

相似地 :

 key[i] = *password != 0 ? *password++ : 0;  /* HERE IS WHERE I CAN'T GET IT */

 =

 if (*password != 0) { key[i]=*password++; } else { key[i]=0; } ;
于 2013-07-10T14:01:23.023 回答