【发布时间】:2013-05-27 12:20:01
【问题描述】:
我正在尝试在 Linux 内核中计算整数数组的 SHA1。我已经通过crypto.c/crypto.h 和security/integrity/ima/ima_crypto.c,但我无法弄清楚如何init 然后update SHA1 计算机。有人可以向我指出如何执行此操作的教程或指南吗?
【问题讨论】:
标签: linux-kernel cryptography sha1 digest
我正在尝试在 Linux 内核中计算整数数组的 SHA1。我已经通过crypto.c/crypto.h 和security/integrity/ima/ima_crypto.c,但我无法弄清楚如何init 然后update SHA1 计算机。有人可以向我指出如何执行此操作的教程或指南吗?
【问题讨论】:
标签: linux-kernel cryptography sha1 digest
Documentation/crypto/api-intro.txt 中对 linux 密码学 api 进行了很好的介绍。另请查看fs/ecryptfs/crypto.c,了解如何使用这些函数的真实示例。
这里有一个简短的总结,让您开始:
创建一些局部变量:
struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
struct scatterlist 用于以crypto.h 函数可以理解的格式保存明文,而struct 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)。
初始化sg和desc:
sg_init_one(&sg, plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
注意"sha1" 被传递给crypto_alloc_hash;这可以设置为 "md5" 用于 MD5 散列,或任何其他受支持的字符串,以便使用相应的散列方法。
现在使用三个函数调用执行散列:
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 将哈希复制到一个字符数组中。desc.tfm 持有的空闲分配内存:
crypto_free_hash(desc.tfm);
【讨论】:
sizeof(myarr) * sizeof(*myarr); 背后的基本原理。 sizeof(myarr) 会给你 16(假设 32 位整数),sizeof(*myarr) 会给你 4。如果你将它们相乘,它会得到 64,这绝对不是你数组的大小。
sizeof(myarr));我会在答案中纠正它。
crypto_hash_final()的输出是20字节的二进制,不是十六进制的ASCII,所以hashtext的大小应该是20,而不是41。