3

我正在尝试计算 Linux 内核中整数数组的 SHA1。我已经通过crypto.c/但我不知道如何crypto.h然后是 SHA1 计算机。有人可以向我指出如何执行此操作的教程或指南吗?security/integrity/ima/ima_crypto.cinitupdate

4

1 回答 1

10

在Documentation/crypto/api-intro.txt中有一个很好的关于 linux 密码学 api的介绍。另请查看fs/ecryptfs/crypto.c,了解如何使用这些函数的真实示例。

这是一个快速摘要,可帮助您入门:

第 1 步:声明

创建一些局部变量:

struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
  • Astruct scatterlist用于以crypto.h函数可以理解的格式保存明文,而 astruct hash_desc用于配置散列。
  • 该变量plaintext保存我们的明文字符串,而hashval将保存我们明文的哈希值。
  • 最后,len保存明文字符串的长度。

请注意,虽然我在此示例中使用 ASCII 纯文本,但您也可以传递一个整数数组 - 只需将总内存大小存储在len其中并将每个实例替换为plaintext您的整数数组:

int myarr[4] = { 1, 3, 3, 7 };
size_t len = sizeof(myarr);

但要小心:一个int元素的大小通常大于一个字节,因此在int数组中存储整数值不会具有与数组相同的内部表示char- 您最终可能会以空字节作为值之间的填充。

此外,如果您打算散列整数的 ASCII 表示,则必须首先将数组中的值转换为字符串字符序列(可能使用sprintf)。

第 2 步:初始化

初始化sgdesc

sg_init_one(&sg, plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);

通知"sha1"传递给crypto_alloc_hash; 这可以设置"md5"为 MD5 散列,或任何其他支持的字符串,以便使用相应的散列方法。

第 3 步:散列

现在使用三个函数调用执行散列:

crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, len);
crypto_hash_final(&desc, hashval);
  • crypto_hash_init根据提供的struct hash_desc.
  • crypto_hash_update对明文执行实际的散列方法。
  • 最后,crypto_hash_final将散列复制到字符数组。

第 4 步:清理

由 持有的空闲分配内存desc.tfm

crypto_free_hash(desc.tfm);

也可以看看

如何在 linux 内核 2.6 中使用 CryptoAPI

于 2013-05-31T18:33:47.603 回答