我正在尝试计算 Linux 内核中整数数组的 SHA1。我已经通过crypto.c
/但我不知道如何crypto.h
然后是 SHA1 计算机。有人可以向我指出如何执行此操作的教程或指南吗?security/integrity/ima/ima_crypto.c
init
update
问问题
4799 次
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];
- A
struct 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 步:初始化
初始化sg
和desc
:
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);
也可以看看
于 2013-05-31T18:33:47.603 回答